我已经使用 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 类可能会有所帮助,但我不知道下一步是什么。有人能为我指出以下步骤吗?任何帮助,将不胜感激。
iOS 不提供任何直接对硬件解码引擎的公共访问,因为硬件是always用于在 iOS 上解码 H.264 视频。
所以,会议 513 http://asciiwwdc.com/2014/sessions/513为您提供在 iOS 上进行逐帧解码所需的所有信息。简而言之,根据该会议:
- 从 H.264 基本流生成单独的网络抽象层单元 (NALU)。网上有很多关于如何完成此操作的信息。 VCL NALU(IDR 和非 IDR)包含您的视频数据并将被送入解码器。
- 根据“AVCC”格式重新打包那些NALU,删除NALU起始码并用4字节的NALU长度头替换它们。
- 创建一个
CMVideoFormatDescriptionRef
从您的 SPS 和 PPS NALU 通过CMVideoFormatDescriptionCreateFromH264ParameterSets()
- 将 NALU 帧封装为
CMSampleBuffer
每个会话 513。
- Create a
VTDecompressionSessionRef
, and feed VTDecompressionSessionDecodeFrame()
with the sample buffers
- 或者,使用
AVSampleBufferDisplayLayer
, whose -enqueueSampleBuffer:
方法消除了创建您自己的解码器的需要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)