原始pcm格式的音频数据是如何存储的?

2024-02-29

我正在编写一个应用程序来操作音频,我需要首先将文件(wav、MP3 等)转换为原始数据(样本以浮点形式呈现)。

我在cmd中使用ffmpeg:

ffmpeg -i test.wav -f s16le -acodec pcm_s16le output.dat

样本如何在output.dat文件?我知道在S16下一个样本需要两个字节,双通道意味着它存储为L1 R1 L2 R2 ...但是这个文件是否带有帧表示或dat文件中的所有字节都是样本值?两种方法转换后的test.wav文件大小并不相同。一种是通过libav使用ffmpeg网站上的示例代码,另一种是上面提到的,直接在cmd中使用ffmpeg.exe,前一种方法给我一个稍小的文件大小。当我发现有人说pcm使用帧演示时,我很困惑(一帧有 2048 个采样)。

我实际上不需要任何代码,但希望有人可以详细解释原始 pcm 格式。

多谢


从位深度为 16 位、采样率为 44,100 kHz 的立体声 wav 文件开始,您将拥有一个标准 CD 质量的音频文件...在命令行上发出此命令以在文件上显示此类统计信息

ffprobe Cesária_Évora.wav

典型输出

  Duration: 00:00:21.51, bitrate: 1411 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s

从 wav 问题创建 PCM 文件

ffmpeg -i Cesária_Évora.wav -f s16le -acodec pcm_s16le cesaria.dat

请注意,wav 文件只是一个 44 字节标头,后跟有效负载,它是 PCM 格式的原始音频曲线...这个 PCM 文件严格来说是 L1 R1 L2 R2 不多不少...任何帧的概念都是我们如何在没有专用于实现帧的位(如开始/结束标记)的情况下解析数据...编写代码来操作 PCM 数据请记住您的位深度以及您的文件是否具有小端字节结构或大端字节结构...每当您的文件的位深度为 8 位时,您就可以安全地忽略字节顺序,因为您永远不需要移动字节,但是由于上述文件的位深度为 16 位,这意味着音频曲线的每个点都由单个表示每通道16位数(立体声为两通道,单声道为一通道)

当读取这样的文件时,这个 16 位数字存储在两个字节中...如果在读取字节时使用小端字节序,则最左边的字节(当您迭代文件时在循环中第一次遇到)是最小的字节,后面跟着下一个字节更重要的字节含义

L1 R1 L2 R2 

下面我们指出音频曲线上两个 16 位点的立体声表示

Llittle1 Lbig1 Rlittle1 Rbig1 Llittle2 Lbig2 Rlittle2 Rbig2

当我们谈到用于存储这两个点的各个字节时...上面的注释显示了 8 个字节...类似地,如果我们的位深度为 24 字节,则一个通道上的一个原始音频样本将如下所示

Llittle1 Lbigger1 Lbiggest1 Rlittle1 Rbigger1 Rbiggest1  

因此,从概念上讲,当读取位深度为 16 位的小端文件时,这里是如何解析原始音频曲线上一个点的一个通道的 PCM

Llittle1 Lbig1

现在生成一个值L1你在概念上这样做

L1 = ( Lbig1 << shift 8 bits to left ) + Llittle1

不确定这是否是您正在寻找的抽象级别,但它是敲定数字音频的垫脚石

超级有用的工具Audacity https://www.audacityteam.org/允许您导入我们在上面生成的 cesaria.dat 中的 PCM 格式的原始音频文件 ... Audacity -> 文件 -> 导入 -> 原始数据 -> 选择 cesaria.dat ->

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原始pcm格式的音频数据是如何存储的? 的相关文章

随机推荐