python代码修改音频文件(把声音变小)

首先

wav文件的格式

这个图只想说明:前面44个字节都是各种参数。真正的data在后面。

代码

C:\Users\Administrator\desktop> python2
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30)
>>> f = open('test.wav', 'rb')    # 以二进制只读打开
>>> info = f.read(44)    # 感受一下读取前44位
>>> info
'RIFF4\xacJ\x02WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00D\xac\x00\
x00\x10\xb1\x02\x00\x00\x10\x00data\x10\xacJ\x02'
>>> import struct    # 这个是用来解码的,有h \ >h \ i 等各种方式,小白表示这个坑——深
>>> struct.unpack('h', info[22:24])    # 22到24对应2个字节,用 h 解码
(2,)
>>> struct.unpack('i', info[24:28])    # 24到28对应2个字节,用 i 解码
(44100,)
>>> import array    
# 这个包在这里是用来创建一个数组,感觉像是照二进制的各种格式,比如h啊,i啊来挖坑
>>> f.seek(0, 2)    # 指针到最末,计算长度
>>> f.tell()    # 总长度结果
38448188L
>>> n = (f.tell() - 44) / 2    # 按照data的长度来挖坑,而data的长度等于总长度减去44
>>> buf = array.array('h', (0 for _ in range(n)))    # 挖坑了,以0来占位的意思(吧)
>>> f.seek(44)    # 调整指针,从45位开始读取
>>> f.readinto(buf)    # 读取后写入
38448144
>>> buf[5]    # 开始好长一串都是0
0
>>> buf[50050]
15701
>>> for i in range(n): buf[i] /=8    # 把data里面的每一对数据都除8,效果等于声音减小
...
>>> f2 = open('test2.wav', 'wb')    # 开始写入
>>> f2.write(info)    # 前44个套路写入
>>> buf.tofile(f2)    # 后面data写入
>>> f2.close()
>>>

结果

对比两个wav文件真的声音大小差了很多,顿时觉得很神奇。

说明:此教程来自于慕课网刘硕老师的“Python进阶强化训练”,这里粘贴如果有侵权请告知删帖。刘硕老师是很好的老师!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,983评论 25 708
  • 时间 :2027年2月22日, 家人: 树儿17岁,树爸46岁 树妈46岁 地点:美丽乡村的家 清晨醒来,起身轻...
    苗苗在故乡阅读 435评论 2 2
  • 80年的 这问题下主流答案应该是人到中年,事业有成,有家室,有儿女的中年人。我并不是。这个世界除了他们还有像我一样...
    耿志杰阅读 317评论 0 0