python技巧(18)

处理二进制文件
为什么存储为二进制文件,如音频,视频,图形?,个人认为是追求实时读速度

在linux上可以安装vlc播放wav音频文件(二进制文件)
二进制文件用struct模块的unpack解析
wav音频文件构成看成两部分:文件头(前44个字节)、文件内容

打开
f=open(‘C:\Users\yongsheng\Desktop\a.wav’,’rb’)
1.文件头读取和解析
start=f.read(44):此时f已经被消耗了44个字节了,并且start是二进制的字符串了
import struct
s1=struct.unpack(‘h’,start[24:26])
h:shot小段字节
s2=struct.unpack(‘i’,start[32:36])
i:int大段字节
buffer:缓冲区
2.文件内容的读取(data)和想做一些处理(处理基本存储单元必须得出来)
文件大小
f.seek(0,2)
f.tell():文件大小
文件内容数组的长度:文件内容除以文件内容宽度(默认2个字节):说明了为shot类型
len=(f.tell()-44)/2
产生指定类型(shot)的数组
import array
buf=array.array(‘h’,(0 for x in xrang(len))):建立好了shot型的缓冲数组,长度为len,每个(音符)元素字节都是2个(shot型)

f.seek(44):把指针指向data开头

f.readinto(buf):把data读入到buf中
buf[0],buf[1],buf[2]……buf[i]就是一个基本存储单元
f.close()
现在可以做一些事情,处理基本存储单元来做
降调(调节声音大小)

降调
for  i in  xrange(len):
    buf[i]/=8
写入新文件中
f1=open('new1.wav','wb')
f1.write(info)写入文件头
buf.tofill(f1)写入buf(内容)
f1.close()
升调
for i  in xrange(len):
    buf[i]*=8
写入新文件中
f2=open('new1.wav','wb')
f2.write(info)写入文件头
buf.tofile(f2)写入buf(内容)
f2.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值