【问题标题】:How to decode a H.264 frame on iOS by hardware decoding?如何通过硬件解码在 iOS 上解码 H.264 帧?
【发布时间】:2014-10-01 13:26:10
【问题描述】:

我已经使用 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 ffmpeg avfoundation h.264 hardware-acceleration


    【解决方案1】:

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

    因此,session 513 为您提供了在 iOS 上进行逐帧解码所需的所有信息。简而言之,每次会话:

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

    【讨论】:

    • 这适用于 iOS 8。请注意,4 字节 NALU 长度标头采用大端格式,因此如果您有 UInt32 值,则必须在复制到 CMBlockBuffer 之前对其进行字节交换(使用 CFSwapInt32)。
    • 谢谢你 12on,我一直在努力解决解码错误,直到我尝试像你说的那样交换字节。
    • @rpj - 你能解释一下第三步(打包)吗?我应该打包多少个 NALU 帧(例如所有帧号相同)?
    • 此链接提供了有关如何逐步解码 h.264 的更详细说明:stackoverflow.com/a/29525001/3156169
    • 一件烦人的事情是:这个出色的答案,talk 513,以及“著名的”链接答案完美地解释了如何从基本流,通过 NALU,到 VTDecompressionSession。然而!要找到任何关于如何达到让您的 264 流准备好这样做的点的示例或讨论真的很棘手!这可能是很多工作............
    【解决方案2】:

    编辑:

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

    原答案:

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

    演讲者说:

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

    所以,在iOS 7中没有办法逐帧进行硬件解码,但在iOS 8中可以做到。

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

    【讨论】:

    • 非常感谢:“直接访问视频编码和解码”
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多