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

如何通过硬件解码在iOS上解码H.264帧?,ios,ffmpeg,avfoundation,h.264,hardware-acceleration,Ios,Ffmpeg,Avfoundation,H.264,Hardware Acceleration,我已经用ffmpeg解码了我从ip摄像机接收到的每一帧。简短的代码如下所示: -(void) decodeFrame:(unsigned char *)frameData frameSize:(int)frameSize{ AVFrame frame; AVPicture picture; AVPacket pkt; AVCodecContext *context; pkt.data = frameData; pat.size = frameSize;

我已经用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框架实现。 Avassetrader类可能会有所帮助,但我不知道下一步是什么。有人能为我指出以下步骤吗?任何帮助都将不胜感激。

编辑:


此链接提供有关如何逐步解码h.264的详细说明:

原始答复:

昨天,我观看了WWDC 2014第513次会议“直接访问视频编码和解码”,并得到了我自己问题的答案

发言者说:

我们有视频工具箱(在iOS 8中)。视频工具箱已经在那里了 OSX已经有一段时间了,但现在它终于在 这提供了对编码器和解码器的直接访问

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


有人知道如何在iOS 8中一帧一帧地直接访问视频编码和解码吗?

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

因此,提供了允许在iOS上逐帧解码所需的所有信息。简言之,每届会议:

  • 从H.264基本流生成单个网络抽象层单元(NALU)。关于如何在网上实现这一点,有很多信息。VCL NALU(IDR和非IDR)包含您的视频数据,并将输入解码器
  • 根据“AVCC”格式重新打包这些NALU,删除NALU开始代码,并将其替换为4字节NALU长度头
  • 通过
    cmvideoformatdescriptioncreatefromH264参数集()
  • 每个会话513将NALU帧打包为
    CMSampleBuffer
    s
  • 创建一个
    VTDecompressionRef
    ,并使用示例缓冲区馈送
    VTDecompressionDecodeFrame()
    • 或者,使用
      AVSampleBufferDisplayLayer
      ,其
      -enqueueSampleBuffer:
      方法无需创建自己的解码器

此功能从iOS 8开始运行。请注意,4字节的NALU长度标头采用big-endian格式,因此,如果您有UInt32值,则必须在复制到CMBlockBuffer(使用CFSwapInt32)之前对其进行字节交换。谢谢您12月12日,在我尝试像您所说的那样交换字节之前,我一直在为解码错误绞尽脑汁。@rpj-您能解释一下第三步(打包)吗?我应该打包多少个NALU帧(例如,所有帧都具有相同的帧号)?此链接提供了有关如何逐步解码h.264的更详细说明:一件恼人的事情是:此优秀答案talk 513和“著名”链接答案完美地解释了如何从基本流通过NALUs转到VTDecompression。然而!要找到任何关于如何让您的264流做好准备的示例或讨论,都是非常棘手的!这可能需要很多工作…………非常感谢您的“直接访问视频编码和解码”