一. pcm转wav
1. pcm文件以十进制的格式保存,因此读取pcm的txt文件时不用“rb”来读取。
2. 适用于写单通道wav文件,多通道需要对数据进行reshape操作。
import wave
import struct
import numpy as np
def pcm2wav(pcm_file, wav_file, nChannels, SmpRate, SmpWidth):
# pcm文件读取
pcm_tables = []
file = open(pcm_file) # 打开pcm文件
line = file.readline() # 逐行读取pcm数据(pcm数据为十进制的字符串)
while line:
pcm_data = eval(line) # 将字符串变为元组
pcm_list.append(pcm_data) # 将每次读取的元素添加保存成list
line = file.readline()
file.close()
nFrames = len(pcm_list) # 获取data size
comptype = "NONE"
compname = "not compressed"
# pcm文件写wav
outWave = wave.open(wav_file, "wb")
outWave = setparams((nChannels, SmpWidth, SmpRate, nFrames,
comptype, compname)) # 设置声道数,采样深度,采样率,帧数等
for v in pcm_list:
outWave = writeframes(struct.pack('h', int(v))) # struct.pack以二进制文件格式写Wav
outWave.close()
二. wav转pcm
1. wav文件去掉RIFF头,再将数据按照采样深度写成十进制pcm格式。
def wav2pcm(wav_filepath, pcm_filepath):
file = wave.open(wav_filepath, "rb")
params = file.getparams()
nChannels, SmpWidth, SmpRate, nFrames = params[:4]
BytesData = file.readframse(nFrames)
WaveData = np.frombuffer(BytesData, dtype=np.int16) # 转换为十进制
file.close()
# 写wav文件
i = 0
with open(pcm_filepath, "w") as f:
for v in WaveData:
f.write(str(wavData[i]) + "\n") # 以字符串格式每行输入
i += 1
三. 参考
python音频处理用到的操作 - 桂。 - 博客园
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)