web-dev-qa-db-ja.com

iOSでハードウェアデコードによってH.264フレームをデコードする方法は?

私はffmpegを使用して、IPカメラから受け取ったすべてのフレームをデコードしました。簡単なコードは次のようになります。

-(void) decodeFrame:(unsigned char *)frameData frameSize:(int)frameSize{
   AVFrame frame;
   AVPicture picture;
   AVPacket pkt;
   AVCodecContext *context;
   pkt.data = frameData;
   pat.size = frameSize;
   avcodec_get_frame_defaults(&frame);
   avpicture_alloc(&picture, PIX_FMT_RGB24, targetWidth, targetHeight);
   avcodec_decode_video2(&context, &frame, &got_picture, &pkt);
}

コードは問題なく動作しますが、ソフトウェアによるデコードです。ハードウェアデコードでデコード性能を高めたい。多くの調査の結果、AVFoundationフレームワークによって実現できる可能性があることを私は知っています。 AVAssetReaderクラスが役立つかもしれませんが、次は何であるかわかりません。誰かが私のために次の手順を指摘できますか?どんな助けでもいただければ幸いです。

14
ChihHao

iOSでH.264ビデオをデコードするためにハードウェアが常に使用されるため、iOSはハードウェアデコードエンジンへの直接のパブリックアクセスを提供しません。

したがって、 セッション51 は、iOSでフレームごとのデコードを許可するために必要なすべての情報を提供します。要するに、そのセッションごとに:

  • H.264エレメンタリストリームから個々のネットワーク抽象化レイヤーユニット(NALU)を生成します。これがオンラインでどのように行われるかについては多くの情報があります。 VCL NALU(IDRおよび非IDR)にはビデオデータが含まれており、デコーダーに送られます。
  • これらのNALUを「AVCC」フォーマットに従って再パッケージ化し、NALU開始コードを削除して、4バイトのNALU長ヘッダーに置き換えます。
  • SPSからCMVideoFormatDescriptionRefを作成し、CMVideoFormatDescriptionCreateFromH264ParameterSets()を介してPPS NALU
  • NALUフレームをセッションごとにCMSampleBuffersとしてパッケージ化します513。
  • VTDecompressionSessionRefを作成し、VTDecompressionSessionDecodeFrame()にサンプルバッファをフィードします。
    • または、AVSampleBufferDisplayLayerを使用します。その-enqueueSampleBuffer:メソッドを使用すると、独自のデコーダーを作成する必要がなくなります。
22
rpj

編集:

このリンクは、h.264を段階的にデコードする方法の詳細な説明を提供します: stackoverflow.com/a/29525001/3156169

元の答え:

昨日、WWDC 2014のセッション513「ビデオエンコーディングとデコーディングへの直接アクセス」を見て、自分の質問の答えを得ました。

スピーカーは言う:

Video Toolbox(iOS 8)があります。 VideoToolboxはOSXにしばらく存在していましたが、ついにiOSのヘッダーが追加されました。これにより、エンコーダーとデコーダーに直接アクセスできます。

したがって、iOS 7ではフレームごとにハードウェアデコードを行う方法はありませんが、iOS8では行うことができます。

IOS 8でフレームごとにビデオのエンコードとデコードに直接アクセスする方法を知っている人はいますか?

2
ChihHao