Tia*_* Ye 9 ffmpeg pcm audioformat
我正在编写一个应用程序来操作音频,我首先需要将文件(wav、MP3 等)转换为原始数据(样本显示为浮点数)。
我在 cmd 中使用 ffmpeg:
ffmpeg -i test.wav -f s16le -acodec pcm_s16le output.dat
Run Code Online (Sandbox Code Playgroud)
样本如何在 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
Run Code Online (Sandbox Code Playgroud)
典型输出
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
Run Code Online (Sandbox Code Playgroud)
从 wav 问题创建一个 PCM 文件
ffmpeg -i Cesária_Évora.wav -f s16le -acodec pcm_s16le cesaria.dat
Run Code Online (Sandbox Code Playgroud)
请注意,wav 文件只是一个 44 字节的标头,后跟有效载荷,它是 PCM 格式的原始音频曲线……这个 PCM 文件严格来说是 L1 R1 L2 R2 仅此而已……任何帧的概念都是我们如何在没有专用于实现帧的位(如开始/结束标记)的情况下解析数据......编写代码来操作 PCM 数据请记住您的位深度以及您的文件是否具有小端或大端字节结构...每当您的文件的位深为 8 位时,您就可以安全地忽略字节序,因为您永远不需要移动字节,但是由于上述文件的位深为 16 位,这意味着音频曲线的每个点都由单个表示每通道 16 位数字(立体声为两通道,单声道为一通道)
当读取这样的文件时,这个 16 位数字存储在两个字节中......如果在读取字节时为小端,最左边的字节(在循环中遍历文件时首先遇到)是最小字节,然后是下一个字节更重要的字节含义
L1 R1 L2 R2
Run Code Online (Sandbox Code Playgroud)
下面我们表示音频曲线上两个 16 位点的立体声表示
Llittle1 Lbig1 Rlittle1 Rbig1 Llittle2 Lbig2 Rlittle2 Rbig2
Run Code Online (Sandbox Code Playgroud)
当我们谈到用于存储这两个点的单个字节时……上面的注释显示了 8 个字节……类似地,如果我们的位深度为 24 个字节,那么对于一个通道上的一个原始音频样本,它将是以下内容
Llittle1 Lbigger1 Lbiggest1 Rlittle1 Rbigger1 Rbiggest1
Run Code Online (Sandbox Code Playgroud)
所以从概念上讲,当读取位深为 16 位的小字节序文件时,这里是如何解析原始音频曲线上一个通道的 PCM
Llittle1 Lbig1
Run Code Online (Sandbox Code Playgroud)
现在要生成单个值,L1您在概念上执行此操作
L1 = ( Lbig1 << shift 8 bits to left ) + Llittle1
Run Code Online (Sandbox Code Playgroud)
不确定这是否是您正在寻找的抽象级别,但它是确定数字音频的垫脚石
超级有用的工具Audacity允许您导入我们上面生成的 PCM 格式的原始音频文件 cesaria.dat ... Audacity -> 文件 -> 导入 -> 原始数据 -> 选择 cesaria.dat ->
-f s16le生成没有标题/预告片或任何元数据的原始样本转储。所以,这就是L1 R1 C1 L2 R2 C2...LRC 代表 3 个通道的地方。
当 ffmpeg 读取这样的文件时,它将一次从每个通道读取并构建 1024 个样本,除非sampling rate/25小于 1024,在这种情况下,它将读取并打包这些样本,例如对于 16000 Hz 的流,sampling rate/25= 640,其中小于1024。因此,ffmpeg 将打包640x2此类1280立体声流的样本。
| 归档时间: |
|
| 查看次数: |
11115 次 |
| 最近记录: |