Python0019 音频处理(二).wav文件

Python0019 音频处理(二).wav文件


        上一篇文章中写到使用python 提供的wave模块对.wav文件进行读写,感觉借用别人写的代码读.wav文件不够牛B。自然而然对.wav文件产生了浓厚的兴趣。经过昨天的努力,对该格式的文件已经略有了解,并且用java实现了对.wav读取。这篇文章打算换成认识这篇文章的过程。而不是一开始介绍一堆概念,然后摆上代码。按照认识过程来写读起来比较容易理解。


1.什么是.wav文件

这是一种音频文件,取一个.wav文件,然后读取文件二进制数据,并输出。再用python的wave模块读取音频数据,输出来。然后对比文件的属性,发现一些规律。

(1)找一个.wav文件,用下面代码处理:

import wave
f="./sound11.wav"
w=wave.open(f, "r")
dt=w.readframes(20)
print(dt)
w.close()

b=open(f,'rb')
for _ in range(10):
    print(b.read(40))
b.close()

下面是输出:

b"\x9b\xfd\x0e\xfcu\xffe\xfc+\xff\n\xfd\xec\xffG\xfe\xe7\x00\xb6\xfe\xe7\x00\xfd\xfd\x14\x01A\xfe\x8c\xff\xe3\xfe\xc4\xfe\x8d\xffP\xff\xea\xff\xcd\xfe\x0e\x00F\xff\xcb\x00$\xff)\xff\xcf\xfdk\xfd\xa2\xfe\r\xfd\xff\xfe\xe0\xfc{\xfe'\xfd\x18\xff\xdb\xfd:\xff\x1f\xfeq\xfe\xe0\xfc"
b'RIFFF\xe2\x04\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00@\x1f\x00\x00\x00}\x00\x00\x04\x00\x10\x00LIST'
b'\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00Lavf58.10.100\x00data\x00\xe2\x04\x00\x9b\xfd'
b'\x0e\xfcu\xffe\xfc+\xff\n\xfd\xec\xffG\xfe\xe7\x00\xb6\xfe\xe7\x00\xfd\xfd\x14\x01A\xfe\x8c\xff\xe3\xfe\xc4\xfe\x8d\xffP\xff\xea\xff\xcd\xfe'
b"\x0e\x00F\xff\xcb\x00$\xff)\xff\xcf\xfdk\xfd\xa2\xfe\r\xfd\xff\xfe\xe0\xfc{\xfe'\xfd\x18\xff\xdb\xfd:\xff\x1f\xfeq\xfe\xe0\xfc\xc1\xfe"
b'\xe0\xfb\x85\xfe\xf3\xfc\x80\xfeg\xfd\xb8\xfd\xd2\xfb\x04\xfd\xd3\xfb\xc6\xfd_\xfc\x07\xfe\xeb\xfb\xc2\xfd\x11\xfc\x94\xfe\xaf\xfc\xde\xfe\x14\xfd6\xff'
b'N\xfdu\x00\x9f\xfd\xbb\x00\xef\xfdY\x01\xa5\xfeH\x00\x02\xfea\xfe\xe9\xfd\xcb\xfd\x9a\xfd\xfa\xfd\x12\xfd\xe0\xfe\xc6\xfdr\xff\xe0\xfe\xef\xfe'
b'\xab\xff6\xfe\xfc\xfe\x15\xff\xb2\xfe^\xff\xd8\xfea\x00\x03\x00\xbe\x00\xb5\x00\x94\x00\xe0\x01\x14\x01\xbc\x01\xc1\x01\x03\x01q\x01\xd1\x01;\x02'
b'\x97\x03$\x02\xb1\x03\xa1\x01\x16\x02\xf6\x01S\x02\xa2\x00\xee\x01j\x00a\x01\x8c\x00\x06\x01\xbe\x00\xbe\x00\xf2\x01p\x01C\x02\x00\x01\t\x02'
b'\xd1\x00\xdd\x01\xf6\x00e\x01m\x01-\x00\xb9\x00\xfd\xff\x10\x01\xbf\xff\xc1\x01\xa7\xfeJ\x00\\\xfe\x06\x00\t\xff\xd7\xff\xfe\xfe\xe0\xfe\r\x00'
b'\xe0\xfeQ\x01\x14\x00\x8c\x00\n\x00\xf8\xff\x08\xffV\x00\xcb\xff\xd9\xff\xa6\x00|\xff\x10\x02\xce\xff\xb9\x02A\xff\xd9\x01\x8a\xffz\x00\xf1\xff'

第一行是读取音频文件的前20帧的二进制数据,后面的若干行是该文件的二进制数据。看到这个数据后,我的第一反应是重叠部分。经过细心的比对,终于发现输出的第三行末尾最后两个字节是和第一行音频帧数据是重复的。第4行也是重复的。

初步结论:.wave是一种没有经过压缩的音频文件。 .wave 文件的前78字节记录了音频的相关信息。


(2)接下来就是对文件头部前78B进行研究了。

头部数据:

RIFFF\xe2\x04\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00@\x1f\x00\x00\x00}\x00\x00\x04\x00\x10\x00LIST

\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00Lavf58.10.100\x00data\x00\xe2\x04\x00\

可以看到存在一些可以看懂的疑似固定字母的数据,这些应该是该文件头部固定的信息。例如RIFF,WACE,fmt_,[LIST],[INFOISFT],data。然后去网上找了一些关于.wava头部信息,如下:

[4B]固定字符串'RIFF'   [4B]整数,代表剩余文件长度   [4B]固定字符串'WAVE'   [4B]固定字符串'fmt '(后面有一个空格)


[4B]整数,代表接下来几个音频文件参数的长度   [2B]整数,audio_format_tag   [2B]整数,声道个数   [4B]整数,采样率

[4B]整数,音频数据传送速率AvgBytesPerSec   [2B]整数,BlockAlign 数据块调整数   [2B]整数,采样大小bitsPerSample


#下面这部分可能有,也可能没有,记录一些没有用的信息。

[4B]固定字符串'LIST'  [4B]整数,代表剩余的这些没用信息的总长度s  [sB]没什么卵用的信息,可能有作者,公司等信息,直接跳过即可。


[4B]固定字符串'data'  [4B]整数,代表接下来音频数据的总长度n   [nB]音频数据


(3)按照上面的头信息来解析刚才那个头部 

注意:部分二进制数据以字符形式显示,可以对照这里 http://ascii.911cha.com/查找对应的16进制

注意:里面整数是无符号整数,数据方向是由后向前比如F\xe2\x04\x00 代表整数0x0004e266

RIFF F\xe2\x04\x00剩余文件长度是:0x4e266 320102B   WAVE


fmt_  \x10\x00\x00\x00接下的数据长度是:0x10 16B    \x01\x00audio_famat_tag:0x1    \x02\x00声道数0x2 2个声道

@\x1f\x00\x00采样率0x1f40 8000fps      \x00}\x00\x00音频数据传送率0x7d00 32000Bps  \x04\x00数据块调整0x4 4Bpf 

\x10\x00采样大小0x10 16b=2B


LIST  \x1a\x00\x00\x00接下的数据长度是:0x1a 26BINFOISFT \x0e\x00\x00\x00接下的数据长度是:0xe 14B

Lavf 58.10.100 \x00截止


data  \x00\xe2\x04\x00\接下的数据长度是:0x4e200 320000B



2.有了上面的知识写一个wave文件的读写类并不困难。































你可能感兴趣的:(Python,音频处理)