5-2,重新降低音量之后合成的声音文件无法播放。最开始的时候播放成功过。
来源:

小胖纸
2016-11-01
第一次跑通的时候确实达到了降低音量的作用,此时新文件比原文件小约3kb;后来多按了几次Run,发现文件大小与原文件相同了,而且不能播放会报错。这到底是为什么呢?用的是PyCharm跑的是Python3.5
import struct import array # 解析二进制文件,我的文件info内容是前72个字节 f = open('GirlsAndPanzer.wav', 'rb') info = f.read(72) print(info) # 看第二遍才想起来要加个b print(struct.unpack('h', b'\x01\x02')) print(struct.unpack('>h', b'\x01\x02')) # 粗略读取'fmt '的信息 print(struct.unpack('24c', info[48:72])) print("ID" + str(struct.unpack('4c', info[48:52]))) print('Size:' + str(struct.unpack('i', info[52:56]))) print('FormatTag:' + str(struct.unpack('h', info[56:58]))) print('Channels:' + str(struct.unpack('h', info[58:60]))) print('SamplesPerSec :' + str(struct.unpack('i', info[60:64]))) print('AvgBytesPerSec:' + str(struct.unpack('i', info[64:68]))) print('BlockAlign :' + str(struct.unpack('h', info[68:70]))) print('BitsPerSample :' + str(struct.unpack('h', info[70:72]))) f.seek(0, 2) n = (f.tell() - 72) // 2 print('dataSize:' + str(n)) buf = array.array('h', (0 for x in range(n))) f.seek(72) f.readinto(buf) print('buf read into file done.') for i in range(n): buf[i] //= 8 nf = open('demo.wav', 'wb') nf.write(info) buf.tofile(nf) nf.close()
patch1:尝试过把info增长,让它包含“data”四个字节,于是可以播放了,声音确实也正常了,但是播放长度只有原文件开头的一点点,求解为毛。
写回答
3回答
-
程序员硕
2016-11-02
https://en.wikipedia.org/wiki/WAV
解析下wav,每个字段解析清楚, 找到数据段.
10 -
程序员硕
2016-11-02
n = (f.tell() - 72) // 2, 你这72咋来的?我记得我例子中是44.
012016-11-02 -
小胖纸
提问者
2016-11-02
刚开始也是用44,但是发现长度对不上,data标志在更靠后的地方,而且有些数据也显得比较奇特,多打印了几十位字节,然后发现data在73~76的位置,‘fmt ’到‘data’的长度是24,所以在网上搜了一下有关WAV格式,发现这篇文章(http://blog.csdn.net/xuxiaotuzi33/article/details/5791428)说的‘fmt ’到‘data’的长度也是24,就按着这个格式来解析了,发现数据都是整百整千,声道也不是1而是2了。我下载的是这个WAV(https://pan.baidu.com/share/link?uk=3674698183&shareid=3256398523)
00
相似问题