ビデオを処理できる iPhone/iPad 用のアプリケーションを開発するためのヒントを探しています (簡単にするために、デバイスに保存されているローカル ファイルのみを考えてみましょう)。たとえば、任意の映画を選択し、「古い映画」フィルターを選択して、古いランプ TV のようにすることができます。
このアイデアを実現するには、次の 2 つの重要な機能を実装する必要があります。
1)ムービーファイルからフレームとオーディオストリームを取得し、個別のフレームにアクセスします(BGRAまたは少なくともYUV色空間の生のピクセルバッファに興味があります)。
2) 処理されたフレームを何らかの方法で表示します。処理されたフレームを OpenGL テクスチャにレンダリングできることはわかっていますが、再生コントロールを備えたより強力なコンポーネントが必要です。カスタム イメージおよびオーディオ バッファの再生をサポートするメディア プレーヤーのクラスはありますか?
処理機能が完了し、高速です (1 フレームの持続時間よりも短い)。
すぐに解決策を求めているわけではありませんが、ヒントは大歓迎です!
答え
フレームグラビング。ビデオとオーディオのフレームを取得する唯一の方法は、AVAssetReader クラスを使用することです。リアルタイムのグラブに使用することはお勧めしませんが、それは仕事をします。iPad2 での私のテストでは、単一フレームを取得するには約 7 ~ 8 ミリ秒が必要です。ビデオ全体をシークするのは難しいです。多分誰かがより効率的な解決策を指摘できますか?
ビデオの再生。カスタム ビューと GLES を使用してこれを行い、内部にビデオ フレームを含む四角形のテクスチャをレンダリングしました。私の知る限り、ビットマップを描画する最速の方法です。
問題
- サウンド サンプルを手動で再生する必要がある
- AVAssetReader のグラブは、ムービーのフレーム レートと同期する必要があります。そうしないと、ムービーが速すぎたり遅すぎたりします。
- AVAssetReader は、連続フレーム アクセスのみを許可します。前後にシークすることはできません。提案された唯一の解決策は、古いリーダーを削除し、時間範囲を切り取った新しいリーダーを作成することです。