4

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

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

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

Ogg demuxer 错误:我们遇到了未知的流

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

提前谢谢了!

汤姆

4

1 回答 1

4

好的,对于正在阅读本文的任何人,我必须在一定程度上解决它。

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

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

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

谢谢!汤姆

于 2010-08-31T11:53:52.080 回答