如何通过硬件解码在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和PPSCMVideoFormatDescriptionRef
创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编码和解码?