1. 帧场处理方法的介绍
帧场信息的介绍详情可参考:隔行扫描的[百度百科],这里做简要说明。(https://baike.baidu.com/item/%E9%9A%94%E8%A1%8C%E6%89%AB%E6%8F%8F/2081106?fr=aladdin)
首先先介绍帧和场的概念。由于视频都是由一幅幅图像组成的,所以视频也称为视频序列。帧图像就是正常的编解码后的图像,而场图像只是帧图像的一半。场图像的生成是采用隔行扫描,就是将帧图像按偶数行(0,2,4,…)和奇数行(1,3,5,…)各自扫描和排列汇成图像,前者叫做顶场,后者叫做底场,顶场和底场交替播放,由于视频中图像播放的时间间隔较小,所以人眼也看不出场图像和帧图像的区别,除非是信号不好的时候,能看到一些明显的条状。
视频有帧率的概念,即每秒钟视频所包含的图像数。早期电影胶片的帧率通常是24 fps(即24Hz),但模拟电视的显示频率通常是50Hz的PAL制式(欧洲及中国)和60Hz的NTSC制式(美国)。如果要在模拟电视播放24Hz的电影胶片,则需要在播放过程对视频进行转换。
- 对于PAL制式,相对比较好办,可以有两种处理方式:(1)每帧重复播放两次,这样24Hz就变成48Hz,接近于50Hz,电影胶片的播放时长会略短,但观众体验基本差别不大;(2)每帧播放一场,顶场和底场交替播放,这样一来,每秒的24个帧图像可以变成48个场图像,也是48Hz,同时还降低码率传输带宽,因为每秒传输的内容降低为一半。
- 对于NTSC制式,相对麻烦些,但注意到一点,如果一半的帧能占用3个播放时间间隔,也就是说将一帧拆分成两场,将重复播放其中一个场,而另外一半的帧还是拆分成两场即可,24*(2+0.5)=60,刚好就能得到60场。在具体操作中,由于需要顶场和底场交替显示,因此对于连续的两帧,要嘛是第一帧显示【顶】-【底】-【顶】,第二帧显示【底】-【顶】,要嘛是第一帧显示【底】-【顶】-【底】,第二帧显示【顶】-【底】。综合起来就是,前一帧占用3个播放位,后一帧占用2个播放位,区别就是先显示底场还是先显示顶场而已。由24Hz的视频转换到60Hz的NTSC制式的过程有个专有术语,称为“3:2 Pull-Down”.
2. H.265/HEVC中的帧场信息
(1) 帧场信息的flag
H.265中的帧场信息是作为SEI(Supplement Enhancement Information)之一,而这个SEI的flag信息是放置在VUI(Video Usability Information)中。
在7.3.2.2.1节中,序列头(Sequence parameter set)中的vui_parameters_present_flag规定了VUI(Video Usability Information)开关,符合H.265/HEVC标准的解码器须正确解码vui_parameters_present_flag的值,当其值为1时,则参数集vui_parameters( ) 呈现在码流中;在E.2.1节中,当vui_parameters( ) 中的field_seq_flag和frame_field_info_present_flag 值为1时,则帧场信息呈现在码流中。
- field_seq_flag:表示图像类型,取值为0是帧图像,取值为1是场图像;当图像是场图像,则picture timing SEI 信息须在码流中呈现
- frame_field_info_present_flag:表示picture timing SEI信息是否在每个图像的码流中呈现,取值为0是不呈现,取值为1是呈现
(2)帧场信息码流
在D.2.3节中,当frame_field_info_present_flag的值为1,则pic_struct、source_scan_type、duplicate_flag三个参数共同作用,确定视频的场图像播放方式(在F.14.3.11节中,frame_field_info包含的ffinfo_pic_struct、
ffinfo_source_scan_type、ffinfo_duplicate_flag三个参数的含义与上述三个参数是等同的)。
- pic_struct:规定显示图像包含一个帧图像或者多个场图像,一个帧图像可能占有两倍或三倍的固定帧刷新间隔。当取值为0、3、4、5、、6、7、8时,图像均为帧图像,field_seq_flag为0;当取值为1、2、9、10、11、12时,图像均为场图像,field_seq_flag为1
- source_scan_type:规定源视频序列的刷新类型,取值为0表示隔行扫描,取值为1表示逐行扫描,取值为2表示扫描类型未知。如该参数不存在,则扫描类型的确定与general_progressive_source_flag和general_interlaced_source_flag有关。当general_progressive_source_flag为0且general_interlaced_source_flag为1,则为隔行扫描;当general_progressive_source_flag为1且general_interlaced_source_flag为0,则为逐行扫描;当general_progressive_source_flag为0且general_interlaced_source_flag为0,则扫描类型未知
- duplicate_flag规定当前图像是否为按照输出顺序的之前图像的复制,取值为0不是复制,取值为1是复制。duplicate_flag用于实现源视频序列在显示模型中的适应性,完成特定的“Pull-Down”功能;特别地,当pic_struct取值为9、10、11、12时,当前图像为一帧图像所包含的场图像之一,其配对关系按表D.2来确定,此时duplicate_flag取值不起作用
3. H.266/VVC和H.274中的帧场信息
(1) 帧场信息的flag
在H.266/VVC中,7.3.2.4节 (Sequence parameter set RBSP syntax) 的序列参数集SPS中包含
sps_field_seq_flag 和 sps_vui_parameters_present_flag 两个flag来控制是否启用帧场信息,其中sps_vui_parameters_present_flag 为1时,VUI信息呈现在码流中,而帧场信息SEI也是在VUI中。
在VUI的码流中,采用vui_progressive_source_flag 和 vui_interlaced_source_flag 两个参数来控制扫描类型,具体如下:
(2)帧场信息码流
在H.274中提供了帧场信息的码流,具体如下:
具体参数介绍为:
- vui_progressive_source_flag 和 vui_interlaced_source_flag,其值综合确定扫描方式,具体如上述在H.266/VVC中的规定
- ffi_field_pic_flag:规定当前图像在显示模型中的类型,取值为0表示帧图像,取值为1表示场图像
- ffi_bottom_field_flag:规定当前图像的场类型,取值为0是顶场,取值为1是底场
- ffi_pairing_indicated_flag:规定当前图像与之前或之后图像是否是配对的一帧中的两场,取值为0表示不配对,取值为1表示配对
- ffi_paired_with_next_field_flag:规定当前图像的配对选择,取值为0表示与之前图像配对,取值为1表示与之后图像配对
- ffi_display_fields_from_frame_flag:规定显示模型对当前图像的处理方式,取值为0表示将当前图像视为完整帧,取值为1表示采用交替奇偶检验将当前图像视为一帧中的独立场
- ffi_top_field_first_flag:规定帧显示场图像的顺序,取值为0表示先显示底场,取值为1表示先显示顶场
- ffi_display_elemental_periods_minus1:取值加1表示当前编码图像或场在显示模型中占有的基本图像时间间隔数
- ffi_source_scan_type:规定原始视频序列的扫描方式,取值为0是隔行扫描,取值为1是逐行扫描
- ffi_duplicate_flag:规定当前图像是否为输出顺序在前的图像的复制,取值为0表示不复制,取值为1表示复制
4. 后语
帧场处理方法在过去的电视广播上发挥了重大的作用,但随着数字电视的发展,这个技术将逐渐成为历史,但在一些地方还能看到这样的视频格式,如720i、1080i等;与隔行扫描相对应的就是逐行扫描,现今已成为主流和趋势,相对应的视频视频格式是720p、1080p等。从视频编解码角度,在最近的两个版本(H.265和H.266)都是很晚才把帧场信息加进去,足以可见标准小组的态度,也许下个版本就没有帧场信息的影子了吧。现在的视频编解码标准已在向高帧率、高色域、高动态范围不断迈进!
科技在不断发展中,我们无时不刻在见证新事物,但一些跟不上时代的事物也将逐渐消失在视野里,最终湮没在历史中。