如何使用libogg复用Vorbis和Theora流

时间:2010-08-30 16:06:08

标签: c video audio ogg-theora multiplexing

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

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

当只写视频或音频时,我能够很好地播放mplayer中的输出,但是当我尝试写两个时,我得到以下内容:

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

我猜我正在做多路复用错误。我已经阅读了Xiph.org上的多路复用流文档,我看不出我的不同之处。我似乎无法找到任何示例代码来做这件事,而不是通过开源编码器的来源(我有一些麻烦的理解)。是否有人能够解释如何使用libogg正确地多路复用流?我正在尝试使用Ubuntu存储库中的库在Ubuntu 10.04上的C中执行此操作。

非常感谢提前!

汤姆

1 个答案:

答案 0 :(得分:4)

好的,对于那些正在阅读本文的人,我在某种程度上解决了这个问题。

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

完成此操作后,尽量保持流尽可能紧密同步(当他们太远时,mplayer给我一些错误)。在24fps视频和44.1 KHz音频时,1帧应跨越1837.5个音频样本(使用PCM音频,这是7,350字节)。

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

谢谢! 汤姆