分类
嵌入式开发

如何判断视频采集卡送过来的H.264具体的视频格式是Annex B格式还是AVCC格式?

先用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 0100 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)。

** 结论**

  • 如果 nal_unit_type 输出中直接显示 SPS/PPS 而没有长度前缀Annex B
  • 如果 ffmpeg 显示 extradataavc1AVCC