文件格式解析:mp1/mp2/mp3 解码(Python)

来源:互联网 发布:windows 10 教程 编辑:程序博客网 时间:2024/05/29 12:14

Python写的MP3解码器,效率太低仅作研究用。微笑


__version__ = "1.0.0"import ioimport osimport sysfrom ID3Tag import *from Header import *from BitStream import *from Decoder import *from audiosocket import AudioWriterclass BufferReader:  def __init__(self, path):    self.path = path    fd = open(path, 'rb')    self.buffer = fd.read()    fd.close()        self.position = 0    self.length = len(self.buffer)      def tell(self):    return self.position      def read(self, n = -1):    if n == -1:      return self.buffer[self.position:]    else:      self.position += n      return self.buffer[self.position - n : self.position]        def seek(self, pos, begin = 0):    if begin == 0:      self.position = pos    elif begin == 1:      self.position += pos    elif begin == 2:      self.position = self.lengthif __name__ == '__main__':  fd = BufferReader('4.mp2')  tag = ID3Tag()    frameCount = 0  frameOffset = 0  frameSize = fd.length    ## ID3 v2  sizeV2 = tag.checkID3V2(fd.read(10), 0)  if sizeV2 > 0:    frameOffset = sizeV2    frameSize -= sizeV2    sizeV2 -= 10    tag.parseID3V2(fd.read(sizeV2), 0)  if tag.checkID3V1(fd.buffer[-128:]):    frameSize -= 128    tag.parseID3V1(fd.buffer[-128:])      fd.seek(frameOffset)  tag.printTag()    hdr = Header(fd)  if hdr.syncFrame():    audio = AudioWriter()    bs = BitStream(fd)    dc = Decoder(bs, hdr, audio, CH_BOTH)    audio.open()        ## Playing    while dc.decodeFrame():      if not hdr.syncFrame():        break      frameCount += 1      if (frameCount & 0x7) == 0x7:#updates the status every 8 frames(44.1kHz abouts 0.2s)        hdr.printState()    hdr.printState()    audio.close()  else:    print('sync failed')


几种格式,从1到3,1是最简单,3最复杂。
import ioimport osimport sysimport md5from Synthesis import *from Mpeg import Layer1, Layer2, Layer3CH_BOTH = 0CH_LEFT = 1CH_RIGHT = 2      class Decoder:  def __init__(self, bs, hdr, audio, wch = CH_BOTH):    self._audio = audio    self._synthesis = Synthesis(hdr.getChannels())    if hdr.getLayer() == 1:      self._layer = Layer1(bs, hdr, self._synthesis, wch)    elif hdr.getLayer() == 2:      self._layer = Layer2(bs, hdr, self._synthesis, wch)    elif hdr.getLayer() == 3:      self._layer = Layer3(bs, hdr, self._synthesis, wch)  def decodeFrame(self):    self._synthesis.reset()    if not self._layer.decodeFrame():      return False     iLen = self._synthesis.getSize()    self._audio.write(bytePCMBuf.tostring())    #print(md5.new(bytePCMBuf).hexdigest())    #print(bytePCMBuf[:16])    return iLen == PCM_LENGTH  if __name__ == '__main__':  pass