我一直在尝试使用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数据? 任何帮助将不胜感激。
答案 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文档中定义。