4

私がする必要があるのは、ビデオフレームをデコードし、台形の表面にフレームをレンダリングすることです。開発プラットフォームとしてAndroid2.2を使用しています

デコードされたフレームにアクセスする必要があるため、メディアプレーヤーサービスを使用していません。

これが私がこれまでに持っているものです:

  • デコードされたビデオフレームを抽出するためにstagefrightフレームワークを使用しています。
  • 次に、各フレームがYUV420からRGB形式に変換されます
  • 変換されたフレームはテクスチャにコピーされ、OpenGLサーフェスにレンダリングされます
  • 私はProcessingを使用しており、OpenGL呼び出しを直接使用していないことに注意してください。

だから今私の問題は

  • 私はstagefrightでのみmp4ファイルをデコードできます
  • レンダリングが遅すぎます。320x420フレームの場合は約100msです。
  • オーディオはまだありません。ビデオをレンダリングすることしかできませんが、オーディオフレームの再生を同期する方法がわかりません。

だから私の質問のために...

  • 他のビデオフォーマットをサポートするにはどうすればよいですか?私はstagefrightを使用しますか、それともffmpegに切り替える必要がありますか?
  • どうすればパフォーマンスを向上させることができますか?少なくとも720pをサポートできるはずですか?
  • 処理ではなく、OpenGL呼び出しを直接使用する必要がありますか?これによりパフォーマンスが向上しますか?
  • 再生中にオーディオフレームを同期するにはどうすればよいですか?
4

1 に答える 1

2

他のビデオフォーマットとコーデックをstagefrightに追加する

「その他の」ビデオ形式のパーサーがある場合は、Stagefrightメディアエクストラクタプラグインを実装し、すばらしいプレーヤーに統合する必要があります。同様に、必要なビデオコーデック用のOMXコンポーネントがある場合は、それらをOMXCodecクラスに統合する必要があります。stagefrightでFFMPEGコンポーネントを使用したり、stagefrightの代わりにFFMPEGプレーヤーを使用したりすることは簡単ではないようです。ただし、必要な形式がOpencoreですでに利用可能な場合は、Android Stackを変更して、Opencoreがそれらの形式に選択されるようにすることができます。YUVデータを取得するロジックをOpencoreに移植する必要があります。(MIOで汚れる)

再生パフォーマンス

通常の再生に使用されるサーフェスフリンガーは、レンダリングにオーバーレイを使用します。通常、約4〜8個のビデオバッファを提供します(これまでのところ私が見たもの)。したがって、OPENGLレンダリングで取得しているさまざまなバッファの数を確認できます。バッファを増やすと、パフォーマンスが確実に向上します。また、YUVからRGBへの変換にかかる時間を確認してください。オープンソースライブラリを最適化または使用して、パフォーマンスを向上させることができます。通常、Open GLはビデオレンダリング(グラフィックスで知られています)には使用されません。したがって、パフォーマンスについてはよくわかりません。

オーディオビデオ同期

オーディオ時間は参照として使用されます。Stagefrightでは、素晴らしいプレーヤーがオーディオプレーヤーを使用してオーディオを再生します。このプレーヤーは、時間データを提供するためのインターフェースを実装しています。素晴らしいプレーヤーは、これをビデオのレンダリングに使用します。基本的に、ビデオフレームは、表示時間が再生中のオーディオサンプルの表示時間と一致したときにレンダリングされます。

シャッシュ

于 2011-07-29T18:06:06.050 に答える