先用v4l2-ctl命令保存视频采集卡送过来数据为test.h264
可以使用以下工具来确认,使用ffmpeg:
#Linux
ffmpeg -i test.h264 -c copy -bsf:v trace_headers -f null - 2>&1 | grep "nal_unit_type"
#Windows
ffmpeg -i test.h264 -c copy -bsf:v trace_headers -f null - 2>&1 | findstr "nal_unit_type"
运行 ffmpeg 命令后,如果输出中包含 nal_unit_type 信息,你可以根据这些信息进一步判断视频格式(Annex B 或 AVCC),并分析 H.264 的 NALU(网络抽象层单元)结构。以下是具体步骤:
1. 观察 nal_unit_type 输出
运行命令后,你会看到类似这样的输出(示例):
[nal_unit_type: 7(SPS)]
[nal_unit_type: 8(PPS)]
[nal_unit_type: 5(IDR)]
[nal_unit_type: 1(slice)]
...
nal_unit_type值代表不同的 NALU 类型,例如:7= SPS(序列参数集)8= PPS(图像参数集)5= IDR帧(关键帧)1= 非IDR帧(普通帧)
2. 判断格式(Annex B 或 AVCC)
(1) 如果是 Annex B 格式
- 每个 NALU 前面会有
00 00 01或00 00 00 01起始码。 - 示例输出:
[h264 @ 0x7ff0b8000000] nal_unit_type: 7(SPS), nal_ref_idc: 3, payload_size: 17 [h264 @ 0x7ff0b8000000] nal_unit_type: 8(PPS), nal_ref_idc: 3, payload_size: 4- 表明 NALU 直接以起始码分隔,没有额外的长度前缀。
(2) 如果是 AVCC 格式
- 每个 NALU 前面会有 4字节的长度信息(大端序),而不是
00 00 01。 - 示例输出:
[h264 @ 0x7ff0b8000000] nal_unit_type: 7(SPS), nal_ref_idc: 3, payload_size: 17 [extradata] sps_len: 17, pps_len: 4- 表明 NALU 前面有长度前缀(如
00 00 00 11表示 17 字节的 SPS)。
- 表明 NALU 前面有长度前缀(如
** 结论**
- 如果
nal_unit_type输出中直接显示 SPS/PPS 而没有长度前缀 → Annex B。 - 如果
ffmpeg显示extradata或avc1→ AVCC。