2

私のアプリケーションでは、通常とは異なる方法でビデオを再生する必要があります。特別な目的のためのインタラクティブ プレーヤーのようなもの。

ここでの主な問題:

  • ビデオの解像度は 200*200px から 1024*1024 px までです。
  • 速度を -60 FPS から 60 PFS に変更できる必要があります (この場合、選択した速度に応じてビデオを遅くまたは速く再生する必要があります。負の場合は、ビデオを逆方向に再生する必要があります)。
  • ビデオの上に線とオブジェクトを描画し、画像で拡大縮小する必要があります。
  • コンテンツが画面サイズを超える場合、画像をズームしてパンする機能が必要です
  • このビデオの明るさ、コントラスト、色を反転する機能が必要です

今、私は次のことをしています:

  • ビデオを JPG フレームに分割しました
  • 1秒あたりN回のタイマーを作成しました(再生速度制御)
  • OpenGLで新しいテクスチャ(次のJPGフレーム)を描画する各タイマーティック
  • OpenGL ES変換(変換、スケーリング)で遊んでいるズームとパンの場合

320*240 ピクセルを使用するまでは問題ないように見えますが、512*512 ピクセルを使用すると再生速度が低下します。おそらくタイマーの動作の問題、おそらくOpenGLです。高いプレイ レート (10 ~ 15 FPS 以上) で大きなテクスチャを開こうとすると、アプリケーションがメモリ警告でクラッシュすることがあります。

この問題を解決するためのベスト プラクティスは何ですか? どの方向に掘ればいいですか?cocos2d や他のゲーム エンジンが役に立ちますか? Mb JPG はテクスチャに最適なソリューションではありません。PNG や PVR を使用する必要がありますか?

4

3 に答える 3

2

ビデオ データをビデオとして保持しAVAssetReader、未加工のフレームを取得するために使用します。色空間として使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRangeし、GLES で YUV->RGB 色空間変換を行います。これは、メモリに保持するデータが少なくなることを意味し、画像処理の多くをいくらか単純化します (RGB 値ではなくルミナンス データとクロマ データを使用するため)。

このために Cocos 2d やその他のゲーム エンジンを気にする必要はありません。OpenGL ES 2.0 とシェーダーを少し試してみることを強くお勧めします。ビデオに OpenGL を使用するのは非常にシンプルで簡単です。ミックスにゲーム エンジンを追加することは、不要なオーバーヘッドと抽象化です。

画像データをテクスチャにアップロードするときは、フレームごとに新しいテクスチャを作成しないでください。代わりに、輝度データ用と彩度データ用の 2 つのテクスチャを作成し、それらのテクスチャをフレームごとに再利用します。メモリの問題は、フレームごとに多くの画像と新しいテクスチャを使用し、おそらく古いテクスチャを削除していないことが原因であると思われます.

于 2012-08-17T19:57:41.370 に答える
1

JPEGフレームは、解凍するのに非常にコストがかかります。最初のステップ:PNGを使用します。

ちょっと待って!もっとあります。

Cocos2Dは、主にスプライトシートの優れたサポートを通じてあなたを助けることができます。

ただし、最大の助けは、TexturePackerのようにパックされたテクスチャからもたらされる可能性があります。PVR.CCZ圧縮を使用すると、非常に高速になり、より大きなビデオサイズでより良いフレームレートを得ることができます。

于 2012-08-13T21:20:44.013 に答える
1

Vlad さん、簡単に言えば、リストに挙げたこれらの機能をすべて同時に動作させることはおそらく不可能だということです。1024 x 1024 のビデオを 60 FPS で再生するのは本当に大変です。iOS ハードウェアが 60 FPS でこの種のデータ転送速度に追いつくことができるかどうかは非常に疑わしいです。デバイスの h.264 ハードウェアでさえ、1080p で 30FPS しか実行できません。可能かもしれませんが、グラフィックス レンダリングをビデオに重ねて、同時に明るさ/コントラストを編集できることを期待するには、同時に多くのことを行う必要があります。

すべての機能を実行しようとするのではなく、実際に可能なことに集中する必要があります。iPad ハードウェアを限界まで押し上げる Xcode アプリの例を見たい場合は、私のFireworksサンプル プロジェクトをご覧ください。このコードは、既にデコードされた複数の h.264 ビデオを同時に画面に表示します。実装は CoreGraphics API を中心に構築されていますが、重要なことは、Apple の OpenGL へのテクスチャ アップロードの実装がゼロ コピーの最適化により非常に高速であることです。このアプローチでは、大量のビデオをデバイスにストリーミングできます。

于 2013-07-09T03:58:25.593 に答える