web-dev-qa-db-ja.com

ストリーミング用にハードウェアアクセラレーションによるH.264エンコーディングとデコーディングを実行するにはどうすればよいですか?

カメラからRGBAフレームデータを取得できますが、H.264形式でエンコードしたいと思います。 FFmpegを使用してH.264ビデオをエンコードおよびデコードしましたが、フレームサイズが640x480の場合、ニーズに対して遅すぎます。

ハードウェアアクセラレーションを使用してエンコードとデコードを高速化したいのですが、どうすればよいですか?

また、エンコードされたビデオをネットワーク経由でストリーミングし、もう一方の端でデコードできる必要があります。これはどのように行うことができますか?

14
king

IOSでハードウェアアクセラレーションによるビデオのエンコードとH.264ビデオのデコードを行う場合、唯一の方法はAVFoundationです。エンコードまたはデコードにサードパーティのライブラリを使用しないでください。これらはすべて現在CPUにバインドされており、AVFoundationから取得するものよりもはるかに低速です。サードパーティのエンコーダーまたはデコーダーを使用する理由の1つは、iOSでデフォルトでサポートされていない形式で作業している場合です。

ハードウェアアクセラレーションによるデコードの場合は、AVAssetReaderインスタンス(または純粋な再生用のプレーヤークラスの1つ)を使用することをお勧めします。 AVAssetReaderを使用すると、H.264でエンコードされたビデオを読み取るために、定期的に2倍以上の再生速度が得られるため、iOSデバイスはそのためにかなり優れたハードウェアアクセラレーションを使用します。

同様に、高速エンコーディングの場合は、AVAssetWriterを使用します。 AVAssetWriterを最高の速度でエンコードするためのいくつかのトリックがあります(BGRAフレームでのフィード、ピクセルバッファープールの使用、OpenGLESから読み取る場合はiOS5.0テクスチャキャッシュの使用) この回答

エンコードとデコードを高速化するために私が見つけた最速のパスを使用するコードを見たい場合は、私のオープンソースを見ることができます GPUImage フレームワークは、アナスタシアによってリンクされているものとは異なり、完全に自由に使用できます。

18
Brad Larson