【问题标题】:how to differentiate between valid and invalid NALU in AVCC?如何区分 AVCC 中的有效和无效 NALU?
【发布时间】:2021-03-16 05:15:48
【问题描述】:

我有一个 mp4 文件,它只有视频数据,没有 moov atom。我已经解析了SPS,PPS。我正在尝试解码此数据中的视频帧和 NALU。当我处理这些数据的每个字节以查找 NALU 时,我得到一个错误的 NALU,因为在 RBSP 数据中有一些字节类似于 NALU 标头(0x65、0x01、0x21、0x61)。视频数据是 AVCC 格式,不在附件 B 中,所以我找不到知道 NALU 开始的起始码。有什么我可以比较 NALU 的大小来确定它是否是有效的 NALU?

【问题讨论】:

    标签: video video-processing h.264 mpeg-4 nalu


    【解决方案1】:

    我猜你有 MP4 'mdat' 原子,每个原子中有一些 h.264 有效载荷数据。或者也许你有RFC 6184 payload data。你没说。

    您应该查看第一个“mdat”原子以查找您的 SPS 和 PPS NALU。

    那个“mdat”原子可能看起来像这样。

     ---length-- m  d  a  t
     00 00 07 a9 6d 64 61 74 
    
        ---length-- SPS atom......... NALU id 7 ................  
        00 00 00 0f 67 42 c0 14 8c 8d 41 42 2f 2c 03 c2 21 1a 80
    
        ---length-- PPS atom...  NALU id 8
        00 00 00 04 68 ce 3c 80 
    
        ---length-- pix ... 
        00 00 00 ed 65 b8 00 04 00 00 09 fd b9 48 88...
    

    换句话说,'mdat' 中的每个 NALU 都以四字节长度开始,然后是 NALU。它也可以是 3 字节或 2 字节长度(2 字节是非常无用的)。 RFC 6184Single Time Aggregation Units 的定义要求四字节长度。

    如果流在附件B中,每个NALU都以00 00 0100 00 00 01开头,而不是长度。

    SPS 和 PPS NALU 没有固定大小。而且它们很难解析,因为它们的内容是使用称为exponential Golomb coding 的可变长度方案编码的。因此,如果可能的话,最好的选择是找到它们的边界并将它们视为不透明但长度可变的字节块。

    我把 some Javascript 放在一起来解析 SPS 和 PPS NALU,因为我遇到了和你类似的问题。

    【讨论】:

    • 我已经使用 exp Golomb 代码解析了 SPS 和 PPS NALU。我想验证下一个 IDR 和非 IDR NALU,特别是 NALU 类型 1 和 5 是否有效。您的 javascript 链接指向维基百科。
    • 糟糕。请原谅不正确的链接。固定。
    • 我通过你的Javascript来解析SPS和PPS NALU..我已经完成了这部分,我需要解析下一个I帧和IDR NALU。我们可以检查类型为 1 或 5 的 NALU 是否具有有效内容,就像您在构造函数中检查 SPS、PPS NALU 一样?
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多