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

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

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

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

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

提前谢谢了!

汤姆

最佳答案

好吧,对于正在阅读此书的任何人,我都必须在某种程度上解决它。

您不应该刷新每个流中的所有 header 数据包-仅刷新第一个(设置)数据包,对于Vorbis和Theora,该数据包默认情况下会拥有自己的页面。将其他头数据包放入各自的流中,但是直到所有流的设置页都已写入文件后,才刷新。

完成此操作后,请尝试使流尽可能紧密地同步(mplayer在距离太远时为我提供了一些错误)。在24fps视频和44.1 KHz音频的情况下,一帧应跨越1837.5音频样本(对于PCM音频,这是7,350字节)。

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

谢谢!
汤姆

10-06 15:09