你好 我的第一系列文章将致力于研究压缩和存储图像/声音的方法,例如JPEG(图像)和WAVE(声音),并且还将包括在实践中使用这些格式(.jpg,.wav)的程序的示例。 在这一部分中,我们将考虑WAVE。
故事
WAVE(波形音频文件格式)是用于存储音频流记录的容器文件格式。 该容器通常用于存储脉冲编码调制中的未压缩声音。 (改编自维基百科)
它是由Microsoft和IBM(当时的领先IT公司)于1991年与RIFF一起发明和出版的。
档案结构
该文件具有标题部分,即数据本身,但是没有页脚。 标题共重44个字节。
标题包含样本中位数,除频频率,声音深度等的设置。 声卡所需的信息。 (所有数字表值必须以Little-Endian顺序编写)
WAVE示例
上表可以很容易地转换为C结构,但是今天我们的语言是Python。 使用电波最简单的方法是产生噪声。 对于此任务,我们不需要较高的byteRate和压缩率。
首先,我们导入必要的模块:
接下来,我们需要根据表的大小创建所有必需的变量。 其中的变量值仅取决于numSamples(样本数)。 数量越多,我们的噪音就会越长。
numSamples = int(argv[1]) output_path = argv[2] chunkId = b'RIFF' Format = b'WAVE' subchunk1ID = b'fmt ' subchunk1Size = b'\x10\x00\x00\x00'
仅按照必要的顺序(如表中所示)编写它们:
with open(output_path, 'wb') as fh: fh.write(chunkId + chunkSize + Format + subchunk1ID + subchunk1Size + audioFormat + numChannels + sampleRate + byteRate + blockAlign + bitsPerSample + subchunk2ID + subchunk2Size + data)
这样就完成了。 要使用脚本,我们需要添加必要的命令行参数:
python3 WAV.py [num of samples] [output]
样本数-计数 样本
输出-输出文件的路径
这是一个带有噪音的测试音频文件的链接,但是为了节省内存,我将BPS降低为1b / s,并将通道数降低为1(使用64kbs的32位未压缩立体声音频流,我们得到了80M的干净.wav文件,只有10个): https:// /instaud.io/3Dcy
整个代码(WAV.py)(该代码具有许多重复的变量值,这只是一个草图):
from struct import pack
总结
因此,您了解了更多有关数字声音及其存储方式的知识。 在本文中,我们没有使用压缩(audioFormat),但要阅读每篇热门文章,您将需要使用文章10。希望您自己学到了一些新知识,这对以后的发展会有所帮助。
谢谢你
资料来源
WAV文件结构
WAV-维基百科