wav文件系列_2_Python实现读写

本文介绍了 Python 实现音频读写的方法。Python wave 模块提供便捷的 wav 文件操作。该模块并不支持压缩与解压,但支持单声道/立体声的转换。

参考:

  [1] wave — Read and write WAV files
  [2] python音频处理用到的操作 (2017.05.03 cnblog )
  [3] Python——Pylab简单读取wav文件示例 (2013.11.26 iteye )
  [4] 使用python写Wave文件 ( 2018.04.06 CSDN )

1、打开


wave.open(file[, mode])
  file 是字符串时,open 打开对应文件,否则将其作为可找的文件类对象处理。
  mode 可为
    'r', 'rb'    只读
    'w', 'wb'    只写
    不支持读+写
    Z.b.  f = wave.open( file , 'x' )
wave.openfp(file, mode)            open 同义,后向兼容

2、生成


Wave_write:
Wave_write.close()            确认 nframes 值没有错,关闭 wave 打开的文件。完成文件写入之后运行的语句
Wave_write.setnchannels(n)        设定通道数
Wave_write.setsampwidth(n)        设定采样深度
Wave_write.setframerate(n)        设定采样频率
Wave_write.setnframes(n)        设定信号长度(存入更长数据后可能会调整)
Wave_write.setcomptype(type, name)    设定压缩格式(wav没有压缩)
Wave_write.setparams(tuple)        设定一条龙服务,其中:
    tuple = [ nchannels, sampwidth, framerate, nframes, comptype, compname ]
Wave_write.tell()            返回文档中现在编辑的位置
Wave_write.writeframesraw(data)        写入数据,并不校对 nframes 值(这个函数还是有用的)
Wave_write.writeframes(data)        写入数据,顺手校对 nframes 值
注意:writeframes 和 writeframesraw 两个函数调用之后,所有参数都已固定了。

# -*- coding: utf-8 -*-

import wave
import numpy as np
import struct

x = np.linspace(0,880*np.pi,16384)
data = np.sin(x)
channel, deepth, freq = [ 1, 2, 16384 ]
name = 'out2.wav'

f = wave.open(name, 'wb')
f.setparams((channel, deepth, int(freq), len(data), "NONE", "not compressed"))
for num in data:
    f.writeframes(struct.pack('h', int(num*32000)))
f.close()

其中的 struct 库相关说明可以见引用[2]。未来有空会展开讲。

3、读取


Wave_read:
Wave_read.close()            关闭 wave 打开的媒体,使之不可用。在收集对象之后自动调用。
Wave_read.getnchannels()        返回通道数( 1、2分别对应单、双通道 )
Wave_read.getsampwidth()        返回采样深度
Wave_read.getframerate()        返回采样频率
Wave_read.getnframes()            返回数据帧数
Wave_read.getcomptype()            返回压缩类型( 只支持'NONE' )
Wave_read.getcompname()            返回压缩名称( 人类可懂的压缩类型,'not compressed'等价于'NONE' )
Wave_read.getparams()            参数返回一条龙
    tuple = [ nchannels, sampwidth, framerate, nframes, comptype, compname ]
Wave_read.readframes(n)            读 n 帧数据,输出一个比特串
Wave_read.rewind()            倒带,将文件指针置于音频流的开头
以下两个方法定义了一个变量 “position” 。该变量在两个方法中通用。两个方法在实现上互相依赖。
Wave_read.setpos(pos)            设定文件指针到特定位置
Wave_read.tell()            读取文件指针的位置


END

猜你喜欢

转载自www.cnblogs.com/adgk07/p/9565779.html