语境

语境

我知道可以用 FFmpeg 将视频帧提取为图片问题。我想对音频文件做同样的事情。假设我有一个文件 audio.opus。我想使用 FFmpeg 提取 Opus 二进制帧以将它们传送到我的程序(在下面的示例中,我正在测试文件输出)。请不要将我需要的二进制 Opus 帧(数据包)与二进制原始数据混淆。我试过这个:

ffmpeg -i audio.opus -acodec copy frame_%d.opus <-- Just creates file "frame_%d.opus"
ffmpeg -i audio.opus -acodec copy frame_%d.bin <-- Errors with "Unable to find a suitable output format for 'frame_%d.bin'"
ffmpeg -i audio.opus -acodec copy frame_%d <-- Same error

我猜问题在于音频帧没有扩展(就像视频帧没有扩展一样.png.jpg,所以 FFmpeg 很困惑。我的问题能解决吗?

答案1

据我所知,ffmpeg 无法做到这一点。

语境

Asker 说得对,opus 包含一种叫做帧的东西。名义上,opus 帧流可用于播放音频,但这需要解码器该音频的先验知识是了解流的一些信息。这就是它不标准的原因。如果您有一个音频播放器,它 (1) 具有某种按顺序分割 opus 帧的机制(例如,因为每个帧都是一个单独的文件,并且 (2) 知道有关帧的编码信息,即帧大小和它属于哪个流,那么这也是可能的。

向上一级

Opus 框架通常包裹在 Opus 中数据包。Opus 数据包捕获基本元数据,例如帧大小、数据包中的帧数、立体声与单声道、音频带宽等。这仍然属于 Opus 领域。

再上一层

通常,对于 opus 流和 .opus 文件来说,文件实际上是ogg 容器.ogg 容器被分割成页面。ogg 文件/流有两个起始页,位于包含 opus 数据包的页面之前。最后一个 ogg 页有一个流结束标记。

如果您想使用音频播放器流式传输 opus 编码,您可能应该使用 ogg-opus 进行编码和解码,这是这里唯一的标准方法。

推荐

如上所述,您应该考虑只使用 ogg-opus。这是流式传输 opus“帧”的标准方式(实际上在 opus 数据包内、ogg 页面内,带有前面的元数据页面和可选的尾随 EOS 页面……)

如果你想从另一个文件中提取作品流那么您应该使用oggz-rip。这将生成一个仅包含一个流的 ogg-opus 文件。

如果你确定要自己处理和分割 opus 帧,则需要编写解码器或使用类似的东西提取数据oggz-dump。看看 pyogg。

如果那么 ffmpeg 可以帮到你或许您可以将其用作多路复用器来从另一个来源传输 ogg-opus 流,但这仍然是 ogg 页面而不是您最初要求的 opus 框架。


来源:我读过 RFC 6716 和 7845

相关内容