2011-12-19 6 views
1

私はiOSの初心者ですが、AndroidでFFmpegベースの再生ルーチンを実装しました。私はiOSでもう一度やります。iOSアプリケーションでFFmpegのフレームをスクリーンにレンダリングするにはどうすればよいですか?

私はOpenGL ES 1.1/2.0を使用して、FFmpegビデオから画面にフレームを描画できます。しかし、OpenGL ESは難しいようです。さらに、ビデオテクスチャの幅のためにいくつかの制限がありました。ビデオフレームを多くの画像に分割し、それらをフレームに描画してフレームを構成する必要がありました。

iOSでOpenGL ESを使用してこの動画を簡単にレンダリングする方法はありますか? iOSで画面に2-Dビデオフレームを素早く描画する方法はありますか?

+0

継続的にどういう意味ですか?そして、なぜあなたは「全体の画像を一度描くのではなく、ビデオ画像全体を多くのテクスチャに分割し、それらを「1つ」として描画するのですか? – appas

+0

私はそれを説明しようとします。再生がビデオイメージを頻繁に更新する必要があるため、私は 'continuous'を使用します。これは通常30fpsまでです(ビデオの中には30fpsを超えるものもあります)。 OpenGL-ESは最高の性能を発揮できますが、私は私たちにとっては難しいものです。多くのソリューションを私たちのチームと比較したいと考えています。たぶん、「連続的に」と言われたのは、「パフォーマンスが揃っている」 – qrtt1

+0

テクスチャの幅は2のべき乗である必要があります。 たとえば、ビデオサイズが640x480の場合、2のべき乗ではありません。 異なるテクスチャサイズに合わせて分割する必要があります。 – qrtt1

答えて

1

ああ。したがって、POT以外のソースをレンダリングする必要があります。これは、複数のテクスチャに分割することなく、最も近いPOTサイズのテクスチャを作成し、それにレンダリングし、実際に画像を含む部分のみをブリッティングすることによって行うことができます。 例(C++)はhereです。関連部品:

//Calculating the texture size 
double exp = ceil(log((double)max(Texture.HardwareHeight, Texture.HardwareWidth))/log(2.0)); 
texsize = min(pow(2, exp), (double)maxSize); 

その後、

//draw the original frame 1:1 into the (larger) texture 
float ymax = min(2.0f*((float)Texture.HardwareHeight/(float)texsize) - 1.0f, 1.0f);  //clamping is for cards with 
float xmax = min(2.0f*((float)Texture.HardwareWidth/(float)texsize) - 1.0f, 1.0f);  //smaller max hardware texture than the current frame size 

レンダリング時にテクスチャ座標として代わりに1.0ときのこれらの最大値を使用してください。

+0

フィードバックいただきありがとうございます。私は非常に重要な用語 '非ポット'を持っています:D – qrtt1