打包nal数据包是什么意思?

时间:2014-05-28 07:29:03

标签: objective-c video-capture h.264 pack

我一直在尝试使用this question中的信息来解决类似的问题。

然而,从答案;我不确定以下是什么意思:

  

我没有正确打包原始NAL数据(不知道这是哪里   记录,如果在任何地方)。

甚至是这个包装问题的解决方案。

  

要解决#2,通过反复试验,我发现给了我的NAL单位   以下形式工作:

[7 8 5] [1] [1] [1]..... [7 8 5] [1] [1] [1]..... (repeating)
     

每个NAL单元的前缀是32位起始码等于   00000001

我见过关于nal数据包的类似表达。上面链接中的原始帖子有一个声明:

  

我的NAL流仅包含SPS / PPS / IDR / P NAL(1,5,7,8)

再次,这是什么意思?如何在objective-c中正确打包原始NAL数据? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

它被称为H.264 Annex B byte stream format(在ISO / IEC 14496-12中定义)。 http://wiki.multimedia.cx/?title=H.264

我认为,下面的页面有很好的解释: http://gentlelogic.blogspot.kr/2011/11/exploring-h264-part-2-h264-bitstream.html

有许多关于此的开源实现(尽管不容易重用)。


NAL AU是封装编码帧数据的数据单位。它由标题(起始代码),类型,长度和正文部分组成。

SPS / PPS / IDR / P是帧类型。

SPS:配置有关整体流的信息(编码方法,参数等)
PPS:配置有关图片的信息(宽度,高度等)
IDR:设置解码器的特殊帧/包 P:通常的编码帧数据

普通电影文件中的帧顺序:SPS(一次)PPS(一次)IDR(周期性)P(实际图片)P P P P P IDR P P P P P P ...


对于附件B字节流处理,英特尔IPP代码样本是非常好的参考(umc_h264_nal_spl.cpp)。 它目前免费下载(最新版本可免费评估30天) https://software.intel.com/en-us/articles/code-samples-for-intel-integrated-performance-primitives-intel-ipp-library-71

附件B字节流格式描述了如何将H.264编码的帧数据存储在媒体容器(例如mp4,MPEG 2 TS)中。处理容器格式二进制数据也需要许多努力工作。每个容器使用不同的机制来指定编解码器配置。如上所述相关的SO post(AVAssetWriterInput H.264 Passthrough to QuickTime (.mov) - Passing in SPS/PPS to create avcC atom?),mp4 / mov使用avcc框格式,该格式在其他ISO / IEC文档中定义。