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

时间:2014-08-08 06:22:14

标签: ios ffmpeg avfoundation h.264 hardware-acceleration

我已经使用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);
}

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

2 个答案:

答案 0 :(得分:22)

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

因此,session 513为您提供了在iOS上允许逐帧解码所需的所有信息。简而言之,按照那个会议:

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

答案 1 :(得分:2)

修改

此链接提供了有关如何逐步解码h.264的更多详细说明:stackoverflow.com/a/29525001/3156169

原始答案:

我观看了会话513"直接访问视频编码和解码"在昨天的WWDC 2014中,得到了我自己的问题的答案。

发言人说:

  

我们有视频工具箱(在iOS 8中)。 Video Toolbox一直在那里   OS X有一段时间了,但现在它终于填充了标题   iOS.This提供对编码器和解码器的直接访问。

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

有没有人想出如何在iOS 8中逐帧直接访问视频编码和解码?