2010-08-30 82 views
3

我目前正在写一个简单的Theora视频编码器,它使用libogg,libvorbis和libtheora复Vorbis和Theora格式流。目前,我可以提交帧的编码器Theora格式,以及PCM样品的Vorbis编码器,通过所产生的数据包的Ogg流(一个用于Theora格式和一个用于Vorbis格式),并得到了页面。如何使用libogg

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

当写只是视频,或只是声音,我能播放在mplayer的输出就好了,但是当我试图写这两个,我得到如下:

奥格分路器的错误:我们遇见未知的流

我猜我做的是错的复用。我已经阅读了Xiph.org上的多路复用流的文档,并且我看不到我有什么不同。我似乎无法找到任何的示例代码这样做的,短的,通过一个开源编码器的源(这是我遇到一些麻烦了解)去。任何人都可以解释如何使用libogg正确地复用流?我正在尝试在Ubuntu 10.04的C上使用Ubuntu存储库中的库进行此操作。

非常感谢提前!

汤姆

回答

3

好了,任何人谁在读这篇文章,我有在一定程度上解决了这个问题。

你不应该刷新所有从每个流的头包 - 只是第一个(设置)数据包,这对于Vorbis和Theora格式默认情况下都有自己的页面。将其他头文件包放入它们各自的流中,但不要刷新,直到所有流的设置页面都写入文件。

一旦你做到了这一点,尽量保持尽可能紧密同步时间尽可能流(mplayer的给了一些错误,我当他们得到太远了)。在24fps的视频和44.1 KHz的音频,1帧应该跨越1837.5音频样本(具有PCM音频,这是7350个字节)。

如果任何人有任何提示/信息,这将是很好听 - 我从来没有与音频/视频做任何事情之前!

谢谢! 汤姆