如何使用 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