私は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クラスが役立つかもしれませんが、次は何であるかわかりません。誰かが私のために次の手順を指摘できますか?どんな助けでもいただければ幸いです。
iOSでH.264ビデオをデコードするためにハードウェアが常に使用されるため、iOSはハードウェアデコードエンジンへの直接のパブリックアクセスを提供しません。
したがって、 セッション51 は、iOSでフレームごとのデコードを許可するために必要なすべての情報を提供します。要するに、そのセッションごとに:
CMVideoFormatDescriptionRef
を作成し、CMVideoFormatDescriptionCreateFromH264ParameterSets()
を介してPPS NALUCMSampleBuffer
sとしてパッケージ化します513。VTDecompressionSessionRef
を作成し、VTDecompressionSessionDecodeFrame()
にサンプルバッファをフィードします。AVSampleBufferDisplayLayer
を使用します。その-enqueueSampleBuffer:
メソッドを使用すると、独自のデコーダーを作成する必要がなくなります。編集:
このリンクは、h.264を段階的にデコードする方法の詳細な説明を提供します: stackoverflow.com/a/29525001/3156169
元の答え:
昨日、WWDC 2014のセッション513「ビデオエンコーディングとデコーディングへの直接アクセス」を見て、自分の質問の答えを得ました。
スピーカーは言う:
Video Toolbox(iOS 8)があります。 VideoToolboxはOSXにしばらく存在していましたが、ついにiOSのヘッダーが追加されました。これにより、エンコーダーとデコーダーに直接アクセスできます。
したがって、iOS 7ではフレームごとにハードウェアデコードを行う方法はありませんが、iOS8では行うことができます。
IOS 8でフレームごとにビデオのエンコードとデコードに直接アクセスする方法を知っている人はいますか?