MP4文件NALU读取

mengzai2 2013-08-27 07:17:11
各位大牛好!我现在在做关于MP4文件解析的一个程序,通过现有的解析器可以按照sample chunk的偏移和sample在chunk中的偏移计算得到sample的偏移,然后从mdat中读取得到这个sample块的数据,刚开始以为这个sample块就是NALU,只不过开头没有NALU的start code,而是一个length为4的大小,网上也有很多人说这个就是NALU,但是我用ffmpeg得到的raw NALU与这个差很多,因此,我想问一下MP4中的sample与NALU之间的关系,以及怎样才能从MP4文件中得到NAL单元,先谢过~~
...全文
650 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜鸟1个 2014-07-07
  • 打赏
  • 举报
回复
楼主是怎么通过现有的解析器可以按照sample chunk的偏移和sample在chunk中的偏移计算得到sample的偏移,我最近也在做MP4的东西,给给大概说一下么?谢谢啊
mengzai2 2014-01-23
  • 打赏
  • 举报
回复
好久了啊,这个帖子,几乎都忘了,当时这个问题解决了,主要是一些基本概念的问题理解,这里我还是把我记得的一点东西分享下,使用NVCUVID最好还是不要避开它的parser,不然会很麻烦,parser处理的第一个NALU前面必须包含SPS和PPS,不然就没法用了,这点要切记
flying8127 2013-12-17
  • 打赏
  • 举报
回复
引用 4 楼 mengzai2 的回复:
[quote=引用 3 楼 jiapeng890928 的回复:] 因为你没有把SPS,PPS信息给解码器,它们在avc1 box里吧。
我是使用的NVIDIA的NVCUVID,使用的它的parser和decoder来进行硬解码,parser需要的数据是raw NALU,但我不能确定是否就是按你说的那样需要SPS和PPS,但是我使用之前的测试数据开头是类似这样的“00 00 00 01 67 64 00 1E AC D9 40 B4 3D B0 11 00 00 03 03 E9 00 00 EA 60 0F 16 2D 96 00 00 00”,这个是raw NALU,可是NALU header 67也不是SPS或PPS啊 [/quote] 估计这个MDATA中获取的一帧数据由3个NALU组成:PPS、SPS, 原始数据,硬解的话可能比较严格,只能送原始数据,所以你可能需要把前面的PPS和SPS去掉。 H264数据封装有的前四BYTE是STARTCODE,有的前4BYTE是表示长度,你要改成STARTCODE,
国安小弟 2013-12-16
  • 打赏
  • 举报
回复
0x_7就是sps,你可以看看h264得文档,从你的话语看出你还不是很了解h264视频格式,0x_8是pps。你一开始说得没错,mdat box中的就是nalu,只不过没有startcode,你要还原0x 00 00 00 01回去才能解码,还原的方法,应该是先看stco,找到chunk的起始位置,然后按照stsz,找到一贞的大小,传送出来,还原start code,判断是不是I贞,如果是还原sps pps,然后看stsc,确定这个chunk到底有多少贞,如此往复。其次,你之所以不能解码,是因为没有将stsd-->avcC-->avc1中的sps pps部分还原给GOP的最开头。 你所要做的在行业内称之为容器码流的解复用,也就是demux,可以参考ffmpeg
mengzai2 2013-08-27
  • 打赏
  • 举报
回复
不对,不好意思,说错了,67还真是SPS
mengzai2 2013-08-27
  • 打赏
  • 举报
回复
引用 3 楼 jiapeng890928 的回复:
因为你没有把SPS,PPS信息给解码器,它们在avc1 box里吧。
我是使用的NVIDIA的NVCUVID,使用的它的parser和decoder来进行硬解码,parser需要的数据是raw NALU,但我不能确定是否就是按你说的那样需要SPS和PPS,但是我使用之前的测试数据开头是类似这样的“00 00 00 01 67 64 00 1E AC D9 40 B4 3D B0 11 00 00 03 03 E9 00 00 EA 60 0F 16 2D 96 00 00 00”,这个是raw NALU,可是NALU header 67也不是SPS或PPS啊
jiapeng890928 2013-08-27
  • 打赏
  • 举报
回复
因为你没有把SPS,PPS信息给解码器,它们在avc1 box里吧。
mengzai2 2013-08-27
  • 打赏
  • 举报
回复
引用 1 楼 jiapeng890928 的回复:
你前面的刚开始以为是对的
mdat后面跟的数据就是NALU?你的意思是说smaple=NALU?但是为什么我用ffmpeg得到的NALU与这个不一样了?我主要是想从MP4中获取得到NALU,然后把这些NALU交给解码器进行解码,目前这个解码器只能解析raw NALU,我将得到的sample数据传给解码器,解码器无法进行解码,但是用ffmpeg得到的NALU数据就可以
jiapeng890928 2013-08-27
  • 打赏
  • 举报
回复
你前面的刚开始以为是对的

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧