我正在一个项目中工作,需要在Access units
原始基本流中删除一些H.264
,例如删除4个访问单元并播放剩余的视频。
为此,我将Access unit Delimiter
(NAL Unit Type:9
)作为Access Unit
的边界并剪切视频,但视频以丢包结束。但是,如果我将Sequence parameter set
(NAL Unit type :7
)作为边界,那么播放的视频不会丢失任何数据包
有人请帮我解决这个问题:我应该在哪里剪切视频?
答案 0 :(得分:5)
由于您没有详细描述您的信息流,例如NALU的存在以及这里的内容格式是一些一般性指导原则:
您始终需要SPS / PPS,因为它们包含如何解码帧的信息。我假设您收到附件B类型的流,在这种情况下,缓存最后一个SPS / PPS,直到新的SPS / PPS出现,用旧的解码剩余的图片,然后应用新的。
如果您有AUD NALU,那么您已经拥有了最后一个访问单元的末尾,您可以轻松拆分视频,而且不需要做太多。
如果您需要深入挖掘,请参阅有关NAL单元顺序以及如何检测主要编码图像的第一个VCL NAL单元的规格摘录。
来自ITU-T H.264(05/2013)
7.4.1.2.3 NAL单位和编码图片的顺序以及与访问单元的关联
本节规定了NAL单元和编码图像的顺序以及与符合附件A中规定的一个或多个配置文件的编码视频序列的访问单元的关联,并使用第2-9条规定的解码过程进行解码。
访问单元包括一个主要编码图像,零个或多个相应的冗余编码图像,以及零个或多个非VCL NAL单元。 VCL NAL单元与主要或冗余编码图像的关联在第7.4.1.2.5节中描述。
比特流中的第一个访问单元从比特流的第一个NAL单元开始。
在主要编码图片的最后一个VCL NAL单元之后的以下任何NAL单元中的第一个指定新访问单元的开始:
访问单位分隔符NAL单位(如果存在),
序列参数集NAL单位(如果存在),
图片参数集NAL单元(如果存在),
SEI NAL单位(如果有),
nal_unit_type的NAL单位,范围为14到18,包括(如果存在),
主要编码图片的第一个VCL NAL单元(始终存在)。
主要编码图像的第一个VCL NAL单元的检测限制在7.4.1.2.4中规定。
访问单元内的编码图片和非VCL NAL单元的顺序应遵守以下约束条件:
当存在访问单元定界符NAL单元时,它应该是第一个NAL单元。最多只能有一次访问权限 任何访问单元中的单元分隔符NAL单元。
当存在任何SEI NAL单位时,它们应位于主要编码图像之前。
当存在包含缓冲时段SEI消息的SEI NAL单元时,缓冲时段SEI消息应该是访问单元中第一SEI NAL单元的第一SEI消息有效载荷。
主要编码图像应位于相应的冗余编码图像之前。
当存在冗余编码图像时,它们应按值的升序排序 的redundant_pic_cnt。
当存在序列参数集扩展NAL单元时,它应该是序列参数集NAL单元之后的下一个NAL单元,其具有与序列参数集扩展NAL单元中相同的seq_parameter_set_id值。
当存在不分割NAL单元的辅助编码图像的一个或多个编码切片时,它们应遵循主编码图像和所有冗余编码图像(如果有的话)。
当存在序列NAL单元的结束时,它应遵循主编码图像和所有冗余编码图像(如果有的话)和辅助编码图像的所有编码片而不分割NAL单元(如果有的话)。
当流NAL单元的末尾存在时,它应该是最后一个NAL单元。
nal_unit_type等于0,12或在20到31的范围内的NAL单元不应在主要编码图像的第一VCL NAL单元之前。
(注2 - 序列参数集NAL单元或图片参数集NAL单元可以存在于访问单元中,但不能跟随访问单元内主要编码图像的最后一个VCL NAL单元,因为这种情况将指定开始新的访问单元。)
(注3)当访问单元中存在nal_unit_type等于7或8的NAL单元时,它可能存在或不存在于其所在的访问单元的编码图像中,并且可以是在随后的访问单元的编码图片中提到。)
图7显示了不包含任何NAL单元的结构,其中nal_unit_type等于0,7,8,或者在12到18的范围内,包括端点,或者在20到31的范围内。 -1
7.4.1.2.4检测主要编码图像的第一个VCL NAL单元
本节规定了对VCL NAL单元语法的约束,这些约束足以使每个主要编码图像的第一个VCL NAL单元能够检测到符合附件A中规定的一个或多个配置文件并被解码的编码视频序列使用第2-9节中指定的解码过程。
任何编码切片NAL单元或编码切片数据分区当前存取单元的主要编码图像的NAL单元应不同于任何编码切片NAL单元或编码切片数据分区A NAL单元的主要编码图像。先前的访问单元有以下一种或多种方式:
(注1 - 上述陈述的结果是,frame_num等于1的主要编码图像不能包含等于5的memory_management_control_operation,除非下面列出的下一个主要编码图像满足下面列出的其他条件(如果有的话。
pic_parameter_set_id的值不同。
field_pic_flag的值不同。
bottom_field_flag存在于两者中且值不同。
nal_ref_idc的值与nal_ref_idc值中的一个等于0不同。
pic_order_cnt_type对于两者都等于0,并且pic_order_cnt_lsb的值不同,或者 delta_pic_order_cnt_bottom的值不同。
pic_order_cnt_type对于两者都等于1,并且delta_pic_order_cnt [0]的值不同,或者 delta_pic_order_cnt [1]的值不同。
IdrPicFlag值不同。
两者的IdrPicFlag等于1,而idr_pic_id的值不同。
(注2 - 冗余编码图像中的一些VCL NAL单元或一些非VCL NAL单元(例如,访问单元定界符NAL单元)也可用于检测访问单元之间的边界,并且可以因此有助于检测新的主要编码图像的开始。)
答案 1 :(得分:1)
据我所知,访问单元分隔符不是强制性的。并且h.264流通常在流的开头只包含一个序列参数集。
我认为您不能单独根据nal unit header信息安全地找到访问单元边框。您需要解析切片标头中的一些信息。参数frame_num标识图片,因此标识一个访问单元,但是为了解析它,您可能需要来自比特流的更多信息。
你可以试试假设一个访问单元总是只包含一个切片(nal单元类型1-5),虽然这绝对不符合标准。