python(处理二进制文件)

案例


分析一个wav文件的头部信息,处理音频数据。

wav-sound-format[1].gif
Paste_Image.png

在Python3中,
/除法,计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数;
//除法,称为地板除,两个整数的除法仍然是整数; e.g.: a //= 2

总结


(1)wav头部信息长度44字节,含有声道数,采样频率,编码宽度
(2)文件操作


info = f.read(44)  # 只读头44个字节头部信息

f.seek(0, 2)  # 将文件指针指向文件末尾方便计算文件的长度
f.tell()   # 当前文件的位置
f.readinto(buf)  # 将data读入到buf中,保存的是活生生的二进制的机器码
f.write  # 写文件
buf.tofile(f)  # 将buf中的二进制机器码写入到文件中

(3)array和list

代码


import struct
import array


with open('demo.wav', 'rb') as f:
    info = f.read(44)
    # print(info[22:24])  # b'\x01\x00'
    v3 = struct.unpack('h', info[22:24])  # 音频文件的声道数
    v4 = struct.unpack('i', info[24:28])  # 音频文件的采用频率)
    v5 = struct.unpack('h', info[34:36])  # 音频文件的编码宽度
    # print(v3, v4, v5, sep="\n---\n")

    f.seek(0, 2)  # 文件指针指向文件末尾
    index = f.tell()  # 21740
    n = (f.tell() - 44) // 2  # wav音频文件44位往后才是音频的data部分

    buf = array.array('h', (0 for _ in range(n)))  # 初始化为0
    f.seek(44)  # 文件指针指向data开始的位置
    res = f.readinto(buf)  # 将data读入array中

    for i in range(n):
        buf[i] //= 4

    with open('demo2.wav', 'wb') as f2:
        f2.write(info)
        buf.tofile(f2)





v = struct.unpack('h', b'\x01\x02')  # 513
v2 = struct.unpack('>h', b'\x01\x02')  # 258
# print(v)

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

推荐阅读更多精彩内容