来源:http://stackoverflow.com/questions/25197169/how-to-decode-a-h-264-frame-on-ios-by-hardware-decoding

I have been used ffmpeg to decode every single frame that I received from my ip cam. The brief code looks like this:

-(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);
}

The code woks fine, but it's software decoding. I want to enhance the decoding performance by hardware decoding. After lots of research, I know it may be achieved by AVFoundation framework. The AVAssetReader class may help, but I can't figure out what's the next.Could anyone points out the following steps for me? Any help would be appreciated.

asked Aug 8 '14 at 6:22
ChihHao
93111
 

2 Answers

up vote
11
down vote

accepted

iOS does not provide any public access directly to the hardware decode engine, because hardware is always used to decode H.264 video on iOS.

Therefore, session 513 gives you all the information you need to allow frame-by-frame decoding on iOS. In short, per that session:

  • Generate individual network abstraction layer units (NALUs) from
    your H.264 elementary stream. There is much information on how this is
    done online. VCL NALUs (IDR and non-IDR) contain your video data and are
    to be fed into the decoder.
  • Re-package those NALUs according to the "AVCC" format, removing NALU
    start codes and replacing them with a 4-byte NALU length header.
  • Create a CMVideoFormatDescriptionRef from your SPS and PPS NALUs via CMVideoFormatDescriptionCreateFromH264ParameterSets()
  • Package NALU frames as CMSampleBuffers per session 513.
  • Create a VTDecompressionSessionRef, and feed VTDecompressionSessionDecodeFrame() with the sample buffers
    • Alternatively, use AVSampleBufferDisplayLayer, whose -enqueueSampleBuffer: method obviates the need to create your own decoder.
answered Oct 27 '14 at 18:37

rpj
1,90521328
 
2  
This works as of iOS 8. Note
that the 4-byte NALU length header is in big-endian format, so if you
have a UInt32 value it must be byte-swapped before copying to the
CMBlockBuffer (use CFSwapInt32).
– 12on
Dec 12 '14 at 16:17
    
Thank you 12on, I was banging my head against decode errors for a long time until I tried swapping the bytes like you said.
– Greg
Feb 27 at 23:30
    
@rpj - can you explain the
3rd (packaging) step? How many NALU frames should I pack (for example
all with the same frame number)?
– Tomasz Wójcik
May 7 at 8:57
    
This link provide more detail explanation on how to decode h.264 step by step: stackoverflow.com/a/29525001/3156169
– ChihHao
May 22 at 2:40
 

Edit:

This link provide more detail explanation on how to decode h.264 step by step: stackoverflow.com/a/29525001/3156169

Original answer:

I watched the session 513 "Direct Access to Video Encoding and
Decoding" in WWDC 2014 yesterday, and got the answer of my own question.

The speaker says:

We have Video Toolbox(in iOS 8). Video Toolbox has been there on
OS X for a while, but now it's finally populated with headers on
iOS.This provides direct access to encoders and decoders.

So, there is no way to do hardware decoding frame by frame in iOS 7, but it can be done in iOS 8.

Is there anyone figure out how to directly access to video encoding and decoding frame by frame in iOS 8?

answered Aug 14 '14 at 5:47

ChihHao
93111
 
    
Thank you so much for: "Direct Access to Video Encoding and Decoding"
– user1748502
Jun 11 at 22:49

How to decode a H.264 frame on iOS by hardware decoding?的更多相关文章

  1. H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持

    H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码 ...

  2. x264 - 高品质 H.264 编码器

    转自:http://www.5i01.cn/topicdetail.php?f=510&t=3735840&r=18&last=48592660 H.264 / MPEG-4 ...

  3. H.264中NAL、Slice与frame意思及相互关系

    H.264中NAL.Slice与frame意思及相互关系 NAL nal_unit_type中的1(非IDR图像的编码条带).2(编码条带数据分割块A).3(编码条带数据分割块B).4(编码条带数据分 ...

  4. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. H.264 / MPEG-4 Part 10 White Paper-翻译

    1. Introduction Broadcast(广播) television and home entertainment(娱乐) have been revolutionised(彻底改变) b ...

  6. The h.264 Sequence Parameter Set

    转债:  http://www.cardinalpeak.com/blog/the-h-264-sequence-parameter-set/ View from the Peak The h.264 ...

  7. World’s Smallest h.264 Encoder

    转载 http://www.cardinalpeak.com/blog/worlds-smallest-h-264-encoder/ View from the Peak World’s Smalle ...

  8. H.264 Profile、Level、Encoder三张简图 (fps = AVCodecContext->time_base.den / AVCodecContext->time_base.num)

    H.264 Profiles Profiles are sets of capabilities. If your black box only supports the Baseline profi ...

  9. H.264视频的RTP荷载格式

    Status of This Memo This document specifies an Internet standards track protocol for the   Internet ...

随机推荐

  1. python字符串连接的三种方法

    1.+号连接 a="hello," b="world!" c=a+b print(c) 有一点需要注意的是,字符串类型是不可变的,所以每一次应用加号连接字符串都 ...

  2. CentOS7 部署nfs服务

    参考博客 参考博客 https://blog.51cto.com/addam/1576144 错误1: 客户端挂载nfs报错mount: wrong fs type, bad option, bad ...

  3. 复杂模拟 | 1095 模拟N个学生有K个志愿填M个学校

    妈的智障 #include <stdio.h> #include <memory.h> #include <math.h> #include <string& ...

  4. 【BZOJ3529】[SDOI2014] 数表(莫比乌斯反演)

    点此看题面 大致题意: 规定一个\(n*m\)数表中每个数为\(\sum_{d|i,d|j}d\),求数表中不大于\(a\)的数之和. 不考虑限制 我们先不考虑限制,来推一波式子. 首先,易知数表中第 ...

  5. Linux性能优化实战学习笔记:第四十八讲

    一.上节回顾 上一节,我们一起学习了如何分析网络丢包的问题,特别是从链路层.网络层以及传输层等主要的协议栈中进行分析. 不过,通过前面这几层的分析,我们还是没有找出最终的性能瓶颈.看来,还是要继续深挖 ...

  6. [LeetCode] 64. Minimum Path Sum 最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  7. uniApp上传图片

    项目中用到了上传图片的功能,记录一下.增强记忆. 要上传图片首先就要先选择图片,或者是先拍照,此时先调用的是 chooseImage 接口,此接口可选择拍照也可以从相册中选择. 它有几个参数,具体可以 ...

  8. Idea用maven给springboot打jar包

    一.准备工作 1.工具:Idea2018,maven3.5 2.首先得保证pom有maven插件 <plugin> <groupId>org.springframework.b ...

  9. Circumference of circle

    public class Solution { public static void main(String[] args) { Scanner ip = new Scanner(System.in) ...

  10. MySQL中的相关表操作

    简单表操作 1.表操作之修改表 .修改表名 alter table 表名 rename 新表名 .增加字段 alter table 表名 add 新字段名 数据类型[相关约束性条件...], add ...