您的位置:首页 > 其它

WAV文件格式

2015-08-22 15:29 225 查看
起始地址
占用空间
本地址数字的含义
00H
4byte
“RIFF”,资源交换文件标志。
04H
4byte
从下一个地址开始到文件尾的总字节数。高位字节在后面,加上之前的8byte刚好是文件大小。
08H
4byte
“WAVE”,代表wav文件格式。
0CH
4byte
“fmt” ,波形格式标志
10H
4byte
PCMWAVEFORMAT的大小

14H
2byte
是否是PCMWAVEFORMAT
16H
2byte
声道,1为单声道,2为双声道。
18H
4byte
采样频率
1CH
4byte
Byte速率=采样频率*音频通道数*每次采样得到的样本位数/8
20H
2byte
块长度=通道数*每次采样得到的样本位数/8
22H
2byte
PCM宽
24H
4byte
“data”标志
28H
4byte
此后的data大小,再加上2CH就正好是整个文件的大小。
2CH
不定
正主。

用Python写了个简单的功能,把WAVE文件HEADER每个元素分别显示出来:

# -*- coding: cp936 -*-
# 解析WAV格式的文件-Leo
import os
import binascii

# 定义一个字典用来存储WAV文件的HEADER
WAV_HEADER = {
"flag_RIFF":		0,
"length_File":		0,
"flag_WAVE":		0,
"flag_FMT":			0,
"sizeof_PCMWAVEFORMAT":		0,
"PCMWAVEFORMAT":	0,
"Channel":			0,
"Frequency":		0,
"Rate":				0,
"length_DATA":		0,
"wide_PCM":			0,
"flag_DATA":		0,
"sizeof_DATA":		0
}

file_path = raw_input("input WAV file path for analyse:")

with open(file_path, 'rb') as input_file:

flag_RIFF = input_file.read(4)

input_file.seek(4,1)

flag_WAVE = input_file.read(4)

# 判断文件是否是wav文件
if cmp(flag_RIFF, 'RIFF') or cmp(flag_WAVE, 'WAVE'):

print "input file is not a WAV file!"

exit(0)

input_file.seek(0,0)

WAV_HEADER["flag_RIFF"] = input_file.read(4).decode()

print "flag_RIFF:", WAV_HEADER["flag_RIFF"]

WAV_HEADER["length_File"] = input_file.read(4)

print "length_File:", binascii.hexlify(WAV_HEADER["length_File"])

WAV_HEADER["flag_WAVE"] = input_file.read(4).decode()

print "flag_WAVE:", WAV_HEADER["flag_WAVE"]

WAV_HEADER["flag_FMT"] = input_file.read(4).decode()

print "flag_FMT:", WAV_HEADER["flag_FMT"]

WAV_HEADER["sizeof_PCMWAVEFORMAT"] = input_file.read(4)

print "sizeof_PCMWAVEFORMAT:", binascii.hexlify(WAV_HEADER["sizeof_PCMWAVEFORMAT"])

WAV_HEADER["PCMWAVEFORMAT"] = input_file.read(2)

print "PCMWAVEFORMAT:", binascii.hexlify(WAV_HEADER["PCMWAVEFORMAT"])

WAV_HEADER["Channel"] = input_file.read(2)

print "Channel:", binascii.hexlify(WAV_HEADER["Channel"])

WAV_HEADER["Frequency"] = input_file.read(4)

print "Frequency:", binascii.hexlify(WAV_HEADER["Frequency"])

WAV_HEADER["Rate"] = input_file.read(4)

print "Rate:", binascii.hexlify(WAV_HEADER["Rate"])

WAV_HEADER["length_DATA"] = input_file.read(2)

print "length_DATA:", binascii.hexlify(WAV_HEADER["length_DATA"])

WAV_HEADER["wide_PCM"] = input_file.read(2)

print "wide_PCM:", binascii.hexlify(WAV_HEADER["wide_PCM"])

WAV_HEADER["flag_DATA"] = input_file.read(4)

print "flag_DATA:", binascii.hexlify(WAV_HEADER["flag_DATA"])

WAV_HEADER["sizeof_DATA"] = input_file.read(4)

print "sizeof_DATA:", binascii.hexlify(WAV_HEADER["sizeof_DATA"])

os.system('pause')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: