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,每个字段解析清楚, 找到数据段.

1
0

程序员硕

2016-11-02

n = (f.tell() - 72) // 2, 你这72咋来的?我记得我例子中是44.

0
1
小胖纸
字数内容限制300,囧,于是我写到下面了
2016-11-02
共1条回复

小胖纸

提问者

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)


0
0

Python高效编程技巧实战

精选50个Python案例,源自实战,全面提升Python编程能力

2582 学习 · 360 问题

查看课程