文件格式解析: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')
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
- 文件格式解析:mp1/mp2/mp3 解码(Python)
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析 zz
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- MP3文件格式解析
- ZOJ 3656 Bit Magic(并查集)
- apache 与 tomcat
- 【转载】 myeclipse 8.0注册码 虚拟机key
- Android电话系统之-rild
- 网络编程之即时通信程序(聊天室)------(三)客户端登录
- 文件格式解析:mp1/mp2/mp3 解码(Python)
- 文件格式解析:GIF文件
- 如何实现远程连接SQL Server 2008 Express
- 正则表达式--0
- 也许、是长大了,再也不会像从前那样单纯的笑了
- asp.net简单显示学习笔记
- Hibernate数据查询教程
- 一个学习数据库索引的比较详细和深入的教程,的确不错。
- 再谈人生的目标