H264 NAL单元标头 - 检测类型并以此格式显示自定义视频

时间:2015-12-07 17:41:13

标签: video ffmpeg h.264

在我的设备上的特殊界面上,我可以看到经过的NAL单位。下面显示了两个示例文件:

P-Frames:
00 00 00 01 41 FC 0F 90 86 DE F9 E1 4D 37 AE D3 
24 A9 F2 F7 E8 A0 9A 9E B3 FD FE 3A D2 77 3E 79 
8C 93 2D 75 61 60 A0 FA BF CB 46 B6 67 A6 C2 81 
2B 47 A5 A2 71 5D 4F 90 32 14 EE D5 DE 58 3B 6E 
...

I-Frames / Key-Frames:
00 00 00 01 65 B8 20 67 FF FE 1E 8A 00 02 05 BE 
4D 49 85 EB FC 9E 44 F7 D0 CE A0 77 25 CD 80 D4 
4A A4 E5 66 EE E7 F9 17 E5 81 DC 94 9C 2B 3C DF 
DE D2 63 CC 89 98 82 4D AF C6 BF E8 3F 0D 3C BE 
...

我的目标是,能够覆盖这些数据以注入/播放我自己的视频。所以这么好,似乎工作,但它看起来不是很好。虽然先前从同一界面存储的重放NAL单元看起来很好,但注入的视频并不适用。我想我还没有得到正确的视频格式。 我使用了像ffmpeg这样的不同工具将视频转换为h264格式。但视频仍然看起来不错。我认为问题在于关键帧。虽然我在转换后的视频中看到很多00 00 00 01 41部分,但我找不到00 00 00 01 65.

这是什么类型的视频格式?以及如何将我自己的视频转换为这种格式?通过使用ffmpeg或其他工具。

提前致谢

1 个答案:

答案 0 :(得分:1)

首先,让我简要介绍H264 NAL标题。 NAL头的大小为1字节,它遵循起始码。起始码可以是00 00 01或00 00 00 01.某些编码器使用短启动码,即00 00 01,其他编码器使用长启动码,即00 00 00 01.

见下面的NAL标题fomat

enter image description here

对于关键帧,nal_ref_idc应为非零。关键帧的nal_unit_type是“5”。理想情况下,您应该查找关键帧的位模式是“00 00 00 01 25”。但是,nal_ref_idc的大小为2位,因此它为关键帧创建了更多的位模式组合。您应该搜索的模式是“00 00 01 25”,“00 00 01 45”和“00 00 01 65”。使用简短的启动代码更好地搜索,无论如何它足以解决您的问题