28

さて、これが私がこれまでに持っているものです。私はAndroid上でFFmpegを構築し、それをうまく使用することができます。Java側から選択したファイル名を渡した後、FFmpegにビデオをロードすることができました。パフォーマンスを節約するために、FFmpegからJNIを介してJavaにフレームを渡すのではなく、NDKでビデオプレーヤーを作成しています。ビデオからOpenGLサーフェスにフレームを送信したい。ビデオの各フレームを取得してOpenGLサーフェスにレンダリングする方法を理解するのに問題があります。私はこれを理解しようとして数週間立ち往生していて、運がありません。うまくいけば、誰かが私を正しい方向に向けることができます。

ありがとう!

4

1 に答える 1

21

頭に浮かぶ1つの方法は、フレームのピクセルをテクスチャに描画し、OpenGLを使用してそのテクスチャをレンダリングすることです。

これについては、主に昔ながらのピクセルベースのビデオゲームについてのブログ投稿を書きましたが、それはあなたの状況にも当てはまります。投稿はCでのAndroidNativeCodingであり、例を使用してgithubリポジトリを設定しました。この手法を使用すると、第1世代のハードウェアでも60FPSを得ることができました。

このアプローチのglTexImage2DとglTexSubImage2Dに関する編集。

glTexImage2Dを呼び出すと、テクスチャにビデオメモリが割り当てられ、渡すピクセルがそのメモリにコピーされます(NULLを渡さない場合)。glTexSubImage2Dを呼び出すと、すでに割り当てられているテクスチャで指定したピクセルが更新されます。

すべてのテクスチャを更新する場合、どちらか一方を呼び出すことにほとんど違いはありません。実際、glTexImage2Dの方が通常は高速です。ただし、テクスチャの一部のみを更新すると、glTexSubImage2Dが速度に勝ちます。

2の累乗のテクスチャサイズを使用する必要があるため、高解像度デバイスで画面をカバーするには、1024x512のテクスチャが必要であり、中解像度では512x512のテクスチャが必要です。テクスチャは画面領域よりも大きく(高解像度は800x400っぽい)、これはその一部を更新するだけでよいことを意味するため、glTexSubImage2Dが最適です。

于 2011-01-13T08:16:08.640 に答える