如何使用 libogg 复用 Vorbis 和 Theora 流

Posted

技术标签:

【中文标题】如何使用 libogg 复用 Vorbis 和 Theora 流【英文标题】:How to multiplex Vorbis and Theora streams using libogg 【发布时间】:2011-04-05 20:25:23 【问题描述】:

我目前正在编写一个简单的 Theora 视频编码器,它使用 libogg、libvorbis 和 libtheora。目前,我可以将帧提交给 Theora 编码器,将 PCM 样本提交给 Vorbis 编码器,将生成的数据包传递给 Ogg 流(一个用于 Theora,一个用于 Vorbis)并输出页面。

当程序启动时,它首先从 Theora 编码器刷新标头,然后从 Vorbis 编码器刷新到输出文件(显然,两个流都有唯一的序列号)。然后,我从两个流中将交错的页面写入文件。

当只写视频或只写音频时,我可以在 mplayer 中播放输出就好了,但是当我尝试同时写两者时,我得到以下信息:

Ogg 解复用器错误:我们遇到了未知流

我猜我做错了多路复用。我已经阅读了 Xiph.org 上多路复用流的文档,但我看不出我的不同之处。除了通过开源编码器的源代码(我在理解上有些困难)之外,我似乎找不到任何示例代码。谁能解释如何使用 libogg 正确地多路复用流?我正在尝试使用 Ubuntu 存储库中的库在 Ubuntu 10.04 上的 C 中执行此操作。

非常感谢!

汤姆

【问题讨论】:

【参考方案1】:

好的,对于正在阅读本文的任何人,我已经在某种程度上解决了它。

您不应该刷新每个流中的所有标头数据包 - 只是第一个(设置)数据包,默认情况下 Vorbis 和 Theora 会获取自己的页面。将其他标头数据包放入各自的流中,但在所有流中的设置页面都写入文件之前不要刷新。

完成此操作后,请尝试使流尽可能保持同步(当它们离得太远时,mplayer 会为我提供一些错误)。在 24fps 视频和 44.1 KHz 音频下,1 帧应跨越 1837.5 个音频样本(对于 PCM 音频,这是 7,350 字节)。

如果其他人有任何提示/信息,很高兴听到 - 我以前从未对音频/视频做过任何事情!

谢谢! 汤姆

【讨论】:

以上是关于如何使用 libogg 复用 Vorbis 和 Theora 流的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 和 libvorbis 编码 webm 不起作用

使用 Ogg Flac 和 Vorbis 在 Fedora 中构建 libsndfile

使用 Vorbis 和 NAudio 播放 OGG 文件

如何无损连接ogg vorbis文件?

VS2012:程序无法启动,因为“libvorbisfile.dll”丢失

在Flash / Flex应用程序中使用Ogg Vorbis