Python修改MP3文件的方法

1174次阅读  |  发布于5年以前

本文实例讲述了Python修改MP3文件的方法。分享给大家供大家参考。具体如下:

用这个程序修改后的MP3比原来要小一些了,因为一张图片被删除了,起到了给MP3"瘦身"的作用。在一些mp3中,每个都有一张400多K的图片,10几个MP3,就相当一个普通MP3文件的大小了。


    # -*- coding: cp936 -*-
    """
    将MP3文件中的ID3V2.3部分去掉,以便在MP3机上播放
    用法:mp3lcear [源mp3目录] [生成的mp3目录]
    """
    import sys
    import os
    import string
    import shutil
    import struct
    import thread
    import threading
    import time
    mp3suffix = 'mp3'
    class Process(threading.Thread):
    """
    简单地在运行的过程中显示进度
    """
    def __init__(self,msg,sleepTime):
    threading.Thread.__init__(self)
    self.msg = msg
    self.running = True
    self.sleepTime = sleepTime
    def setPause(self,pause):
    self.pause = pause
    def setRunning(self,running):
    self.running = running
    def run (self):
    while(self.running):
    self.pause.wait()
    print self.msg,
    time.sleep(self.sleepTime)
    def usage(code, msg=''):
    """
    程序的使用方法
    """
    print >> sys.stderr, __doc__
    if msg:
    print >> sys.stderr, msg
    sys.exit(code)
    def checkDir(argDir,create=False):
    """
    检查目录是否存在,如果create为Ture,则新建一个目录
    """
    tempDir = None
    if(not os.path.isdir(argDir)):
    currentDir = os.path.abspath(os.curdir)
    tempDir = os.path.join(currentDir,argDir)
    if(not os.path.isdir(tempDir) and create):
    os.mkdir(tempDir)
    else:
    usage(1,"目录"+argDir+"不存在")
    else:
    tempDir = os.path.abspath(argDir)
    return tempDir
    def clearMp3(srcFile,destFile):
    """
    修改mp3文件,并将其创建到destFile所指定的地址
    """
    global process
    srcfp = None
    filesize = os.path.getsize(srcFile)
    try:
    srcfp = open(srcFile,'rb')
    head = srcfp.read(3)
    if(head=='ID3'):
    srcfp.seek(3,1)
    size = srcfp.read(4)
    if(not len(size)==4):
    print srcFile+'文件格式错误'
    else:
    size0 = struct.unpack('b',size[0])[0]
    size1 = struct.unpack('b',size[1])[0]
    size2 = struct.unpack('b',size[2])[0]
    size3 = struct.unpack('b',size[3])[0]
    headSize =(((size0&0x7f)<<21) | ((size1&0x7f)<<14) | ((size2&0x7f)<<7) | (size3&0x7f))
    filesize = filesize - headSize
    destfp = None
    try:
    dataLen = 0
    destfp = open(destFile,'wb')
    srcfp.seek(headSize,1)
    data=srcfp.read(1024)
    while (data!= ''):
    destfp.write(data)
    data=srcfp.read(1024)
    except Exception,e:
    print '创建文件'+destFile+'错误',e
    try:
    if (destfp != None):
    destfp.close
    except Exception,de:
    print de
    else:
    print srcFile+'不需要修改 拷贝',
    try:
    shutil.copyfile(srcFile,destFile)
    except Exception, ce:
    print ce
    except Exception,oe:
    print '修改中出错',oe
    try:
    if (srcfp != None):
    srcfp.close()
    except Exception,se:
    print de
    if __name__ == "__main__":
    if(len(sys.argv)<3):
    usage(1)
    global process
    sourceDir = checkDir(sys.argv[1])
    destDir = checkDir(sys.argv[2],True)
    print 'Mp3源目录',sourceDir
    print 'Mp3目的目录',destDir
    process = Process('...',1)
    pause = threading.Event()
    process.setPause(pause)
    process.start()
    for filename in os.listdir(sourceDir):
    srcPath = os.path.join(sourceDir, filename)
    destPath = os.path.join(destDir, filename)
    if os.path.isfile(srcPath):
    print '开始处理 '+filename,
    tempfilename = filename.lower()
    if(not tempfilename.endswith(mp3suffix)):
    print filename+'不是一个mp3文件\n'
    else:
    pause.set()
    clearMp3(srcPath,destPath)
    pause.clear()
    print '结束 \n'
    pause.set()
    process.running = False
    sys.exit(0)

希望本文所述对大家的Python程序设计有所帮助。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8