4

私は現在、libogg、libvorbis、および libtheora を使用する単純な Theora ビデオ エンコーダーを作成しています。現在、フレームを Theora エンコーダーに送信し、PCM サンプルを Vorbis エンコーダーに送信し、結果のパケットを Ogg ストリーム (1 つは Theora 用、もう 1 つは Vorbis 用) に渡し、ページを取得できます。

プログラムが開始すると、最初に Theora エンコーダーからヘッダーをフラッシュし、次に Vorbis エンコーダーから出力ファイルにフラッシュします (明らかに、両方のストリームに固有のシリアル番号があります)。次に、インターリーブされたページを両方のストリームからファイルに書き込みます。

ビデオのみ、またはオーディオのみを書き込む場合、出力を mplayer で問題なく再生できますが、両方を書き込もうとすると、次のようになります。

Ogg demuxer エラー: 不明なストリームに遭遇しました

多重化が間違っていると思います。Xiph.org でストリームの多重化に関するドキュメントを読みましたが、どこが違うのかわかりません。これを行うためのサンプルコードを見つけることができないようですが、オープンソースのエンコーダーのソースを調べることはできません (理解に問題があります)。libogg を使用してストリームを正しく多重化する方法を説明できる人はいますか? Ubuntu リポジトリのライブラリを使用して、Ubuntu 10.04 の C でこれを実行しようとしています。

よろしくお願いします!

トム

4

1 に答える 1

4

わかりました、これを読んでいた人のために、私はある程度それを解決しなければなりません。

各ストリームからすべてのヘッダーパケットをフラッシュするべきではありません。最初の(セットアップ)パケットだけをフラッシュする必要があります。これは、VorbisとTheoraの場合、デフォルトで独自のページを取得します。他のヘッダーパケットをそれぞれのストリームに入れますが、すべてのストリームのセットアップページがファイルに書き込まれるまでフラッシュしないでください。

これを行ったら、ストリームを可能な限り厳密に同期するようにしてください(mplayerは、ストリームが遠すぎるとエラーを表示しました)。24fpsのビデオと44.1KHzのオーディオでは、1フレームは1837.5のオーディオサンプルにまたがる必要があります(PCMオーディオの場合、これは7,350バイトです)。

他の誰かが何かヒント/情報を持っているなら、聞いてみるといいでしょう-私はこれまでオーディオ/ビデオで何もしたことがありません!

ありがとう!トム

于 2010-08-31T11:53:52.080 に答える