我正在调试一些处理 uLaw 或 aLaw 格式的 RTP 语音流的代码。我想捕获通过我的代码的样本并将它们存储到一个文件中。这很容易。我的问题是:是否有一种文件格式可以让我轻松封装原始数据,以便可以由一些常见的播放器软件播放?
我知道采样率,它是每秒 8000 次——电话默认。
我可以将每个样本转换为等效的 16 位 PCM 并制作一个 WAV 文件,但我真的很想避免这样做。
我正在调试一些处理 uLaw 或 aLaw 格式的 RTP 语音流的代码。我想捕获通过我的代码的样本并将它们存储到一个文件中。这很容易。我的问题是:是否有一种文件格式可以让我轻松封装原始数据,以便可以由一些常见的播放器软件播放?
我知道采样率,它是每秒 8000 次——电话默认。
我可以将每个样本转换为等效的 16 位 PCM 并制作一个 WAV 文件,但我真的很想避免这样做。
如果你有SoX,你可以将你的编码数据写入一个二进制文件,并使用一堆命令行选项来播放它,告诉 SoX 正确的格式。我认为你可以这样做:
$ sox --bits 8 --channels 1 --encoding mu-law --rate 8000 file.raw --default-device
我总是需要几次尝试才能获得正确的选项,但它是处理音频数据的有用实用程序。不同操作系统的命令行应该相同。如果该--default-device
选项不适合您,您可以指定一个输出 WAV(或其他)文件。
注意文件的扩展名很重要。SoX 将使用扩展来尝试和预测一些通道/bitwdith/采样率参数。sox -h
将向您显示已识别文件类型的完整列表。
常见的 Microsoft WAV 和 Apple AIFF 格式都可以存储 aLaw 和 uLaw 数据。在 WAV 中,aLaw 的格式 ID 为 0x0006,而 uLaw 的格式 ID 为 0x0007。对于 AIFF,相关的编解码器 FourCC 是“alaw”和“ulaw”。
MS WAV 似乎是阻力最小的路径。编写基本的 WAVEFORMATEX 非常简单。也许最棘手的部分,取决于您的程序的架构方式,是在您知道文件中实际有多少样本后,返回到标题部分并填写长度字段。