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

我已经使用ffmpeg来解码从我的networking摄像头收到的每一帧。 简短代码如下所示:

-(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不提供任何公共访问直接到硬件解码引擎,因为硬件总是用来解码iOS上的H.264video。

因此, 会话513为您提供了在iOS上允许逐帧解码所需的全部信息。 总之,每届会议:

  • 从H.264基本stream生成单个networking抽象层单元(NALU)。 有很多关于如何在线完成的信息。 VCL NALU(IDR和非IDR)包含您的video数据,并将被送入解码器。
  • 按照“AVCC”格式对这些NALU进行重新打包,删除NALU起始码,并用一个4字节的NALU长度头replace它们。
  • 通过CMVideoFormatDescriptionCreateFromH264ParameterSets()从SPS和PPS CMVideoFormatDescriptionRef创build一个CMVideoFormatDescriptionRef
  • 将NALU帧打包为每个会话513的CMSampleBuffer
  • 创build一个VTDecompressionSessionRef ,并用示例缓冲区提供VTDecompressionSessionDecodeFrame()
    • 或者,使用AVSampleBufferDisplayLayer ,它的-enqueueSampleBuffer:方法不需要创build自己的解码器。

编辑:

这个链接提供了更详细的解释如何解码h.264一步一步: stackoverflow.com/a/29525001/3156169

原始答案:

我昨天在WWDC 2014上观看了513“直接访问video编码和解码”的会话,并得到了我自己的问题的答案。

发言者说:

我们有video工具箱(在iOS 8中)。 video工具箱已经在OS X上有一段时间了,但现在它终于在iOS上填充了标题。这提供了对编码器和解码器的直接访问。

所以,在iOS 7中无法逐帧进行硬件解码,但是可以在iOS 8中完成。

有没有人知道如何在iOS 8中逐帧直接访问video编码和解码?