7

FFmpeg に基づいてムービー プレーヤーを作成しました。それは正常に動作します。デコードは非常に高速です。LG P970 (Cortex A8 with Neon) では、YUV2RGB 変換を含む解像度 640 x 424 のビデオ ストリームで平均 70 fps です。ただし、ボトルネックが 1 つあります。キャンバスに描いています。

jnigraphics ネイティブ ライブラリを使用して、ネイティブ側のビットマップに画像データを入力し、このビットマップを SurfaceView の Canvas に描画します。これは非常に単純で一般的なアプローチですが、解像度が 640 x 424 のビットマップの描画には 44 ミリ秒かかるため、fps が 23 に低下し、この手法は使用できなくなります... A/V フレームのデコード全体よりもはるかに多くの時間がかかります!

ビットマップを大幅に高速に描画する方法はありますか? OpenGLES 2 を使用してネイティブ コードで完全にレンダリングしたいと思いますが、遅くなる可能性もあると読みました。ならどうしよう?...

ビットマップをできるだけ速くレンダリングするにはどうすればよいですか?

4

2 に答える 2

3

GoogleIO でのレプリカ アイランドのプレゼンテーションで、デザイナーが、OpenGL の「draw_texture」拡張機能を使用するglDrawTexfOESことが、画面にブリットする最速の方法であり、テクスチャが添付された通常のクワッドだけを描画するよりもはるかに高速であると言ったことを思い出します (私はあなたが使用していると仮定していますOpenGL)。

テクスチャを回転させることはできませんが、それは必要ないようです。

于 2012-04-20T17:44:33.683 に答える
3

GLES1.x で描画します。GLES2.xを使用する一般的な主な理由となるシェーダーは、使用しないか、少なくとも質問のコンテキストでは使用しないため、GLES2を使用する必要はありません。したがって、簡単にするために、GLES1.x が理想的です。必要なのは、バイトバッファを画面に描画することだけです。私の Galaxy S (Vibrant) では、これには約 3 ミリ秒かかります。私の壁紙の byte[] のサイズは 800x480x3 または 1152000 で、作業しているサイズよりもかなり大きくなっています。

私は、このガイドがあなたを正しい方向に導くべきだと信じています.

http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

ネイティブ コードからキャンバスにアクセスするという概念については、私はそれを完全に避けて、可能な限りすべてを GPU にオフロードすることで OpenGL の実装に従います。

于 2012-04-20T17:31:45.400 に答える