mdat中的零填充h264

时间:2015-03-10 13:27:37

标签: h.264 mp4

我想用Android手机录制的h.264数据做一些事情。

我的同事告诉我,在mdat指定NALU大小之后应该有4个字节,然后是一个带有NALU元数据的字节然后是原始数据,然后(在NALU大小之后),另外4个字节与另一个NALU大小等等。

但是我在mdat之后有很多零:

0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0e00000000000000000000000000000000000000000000000000000000000000
8100000000000000000000000000000000000000000000000000000000000000
65b84f0f87fa890001022e7fcc9feef3e7fabb8e0007a34000f2bbefffd07c3c
bfffff08fbfefff04355f8c47bdfd05fd57b1c67c4003e89fe1fe839705a699d
c6532fb7ecacbfffe82d3fefc718d15ffffbc141499731e666f1e4c5cce8732f
bf7eb0a8bd49cd02637007d07d938fd767cae34249773bf4418e893969b8eb2c

mdat原子只有ftyp mp42isom mp42free个原子。所有其他原子(moov,...)都在文件的末尾(当它写入套接字而不是文件时,这是Android的作用)。但是如果有必要的话,我已经从其他文件中获得了PPS和SPS,其中相同的摄像头和编码器设置在此之前只记录下来,只是为了得到那些PPS和SPS数据。

那么我怎样才能从中获得NALU?

1 个答案:

答案 0 :(得分:1)

你做不到。 moov atom包含解析mdat所需的信息。没有它,mdat几乎没有价值。例如,第一个NALU不需要在mdat的开头开始,它可以在mdat内的任何地方开始。它开始的字节记录在(我相信)stco框中。如果文件有音频,你会发现在mdat中混合的音频和视频无法确定没有块偏移的情况。此外,如果视频具有B帧,则无法在没有cts的情况下确定渲染顺序,再次仅在moov中可用。从技术上讲,nalu大小不需要是4个字节,你不能知道没有moov。我建议不要用mp4。使用可流式容器,如ts或flv。现在,如果您可以对生成文件的代码做出一些假设;就像块偏移始终是相同的,并且没有b帧,您可以硬编码这些值。但不保证在软件更新后可以正常工作。