如何通过硬件解码在iOS上解码H.264帧?

Chi*_*Hao 14 ffmpeg avfoundation h.264 hardware-acceleration ios

我已经使用ffmpeg来解码我从ip cam收到的每一帧.简短的代码如下所示:

-(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);
}
Run Code Online (Sandbox Code Playgroud)

代码很好,但它是软件解码.我想通过硬件解码来提高解码性能.经过大量的研究,我知道它可以通过AVFoundation框架实现.AVAssetReader类可能会有所帮助,但我无法弄清楚下一步是什么.有人可以为我指出以下步骤吗?任何帮助,将不胜感激.

rpj*_*rpj 22

iOS不直接向硬件解码引擎提供任何公共访问,因为硬件总是用于解码iOS上的H.264视频.

因此,会话513为您提供了在iOS上允许逐帧解码所需的所有信息.简而言之,每次会议:

  • 从H.264基本流生成单独的网络抽象层单元(NALU).关于如何在线完成这方面的信息很多.VCL NALU(IDR和非IDR)包含您的视频数据,并将被送入解码器.
  • 根据"AVCC"格式重新打包这些NALU,删除NALU起始码并用4字节NALU长度头替换它们.
  • CMVideoFormatDescriptionRef通过您的SPS和PPS NALU 创建一个CMVideoFormatDescriptionCreateFromH264ParameterSets()
  • 将NALU帧打包为CMSampleBuffer每个会话513.
  • 创建一个VTDecompressionSessionRef,并VTDecompressionSessionDecodeFrame()使用样本缓冲区进行 提要
    • 或者,使用AVSampleBufferDisplayLayer,其-enqueueSampleBuffer:方法不需要创建自己的解码器.

  • 这适用于iOS 8.注意,4字节NALU长度标头是big-endian格式,因此如果你有一个UInt32值,它必须在复制到CMBlockBuffer之前进行字节交换(使用CFSwapInt32). (5认同)
  • 一件烦人的事情是:这个出色的答案,talk 513,以及“著名的”链接答案完美地解释了如何从基本流,通过 NALU,到 VTDecompressionSession。然而!很难找到任何关于如何*达到*让您的 264 流媒体做好准备的例子或讨论!这可能是很多工作....... (2认同)