use*_*774 5 ffmpeg h.264 mpeg2-ts
我正在一个项目中工作,需要Access units在H.264原始基本流中删除一些,例如删除4个访问单元并播放剩余的视频.
为此,我将Access unit Delimiter(NAL Unit Type:9)作为边界Access Unit并切断视频,但视频以丢包结束.但是如果我把Sequence parameter set(NAL Unit type :7)作为边界,结果视频播放没有任何丢包.
有人请帮我解决这个问题:我应该在哪里剪切视频?
由于您没有更详细地描述您的流,例如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单元,因为该条件将指定a的开始.新的访问单元.)
(注3)当在访问单元中存在nal_unit_type等于7或8的NAL单元时,它可以在或者可以不在其所在的访问单元的编码图像中被引用,并且可以在后续访问单元的编码图片.)
不包含任何NAL单元的结构的访问单元的nal_unit_type等于0,7,8,或者在12到18的范围内,包括端点,或者在20到31的范围内,包括端点,如图7-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单元)也可用于检测访问单元之间的边界,因此可以帮助检测到新的主要编码图像的开始.)
据我所知,访问单元分隔符不是强制性的。h.264 流通常仅在流的开头包含一个序列参数集。
我认为您不能仅根据最终单元标头信息安全地找到访问单元边界。您将需要解析切片标头中的一些信息。参数frame_num标识一个图片,因此也是一个访问单元,但为了解析它,您可能需要来自比特流的更多信息。
您可以尝试假设一个访问单元始终只包含一个切片(最终单元类型 1-5),尽管这绝对不符合标准。