隔行扫描技术是在黑白电视的发展过程中发明的,它可以消除旧有 CRT 显示器中的闪烁问题。此时,视频帧图像被分为多个普通的水平线,这些水平线分为两个域,分别为:奇数行域和偶数行域。
在 NTSC 标准中,帧被分为 525 行,其中 483 行可见,剩下的则用于同步,垂直回扫等等。帧率为 30 fps 等同于每秒 60 个域,这和 U.S.A 的交流电频率 60 Hz是对应的,这个帧率可以防止互调,即屏幕上滚动条行噪声。由于世界上交流电频率为 50 Hz的国家超过了 120 个,因此有了 PAL 和 SECAM 标准。这个标准帧率为 25 fps 即每秒 50 域,并将帧分为 625 个扫描行,分辨率比 NTSC 更高。这两个标准的对比如下所示:
FFmpeg 中有多个 filter 和 选项,它们可以修改帧的类型,域的顺序,以及将视频从隔行扫描转化为逐行扫描等。
下图显示了世界范围内 NTSC,PAL 和 SECAM 标准的使用分布,但最近几年,这些标准正在被 数字TV标准 渐渐替代,详情请查看本章节的最后部分。
我们可以使用 setfield filter 设置输出帧的帧类型(frame type 或 field type),它经常与本章后续要讲解的 fieldorder filter 和 yadif filter 配合使用,setfield filter 详情如下:
例如,想要将帧类型设置为 顶域优先,则命令为:
ffmpeg -i input.vob -vf setfield=tff output.mov
field order:域序
使用 PAL DV 格式编码的视频是以 底域优先 的隔行扫描视频,当转化为其他隔行扫描格式时,可以使用 fieldorder 修改域序:
例如,想要将隔行扫描视频从 DVD 转化成 DV 格式,命令如下:
ffmpeg -i dvd.vob -vf fieldorder=0 output.dv
隔行扫描视频是为 CRT 显示器发明的,在逐行扫描的数据显示器,如 LCD,等离子显示器中并不能使用。因此,必须有一些硬件或者软件工具将隔行扫描视频去隔行化,也就是将对应的域重新合并为一个完整的视频帧,并编码输出为一个视频流。
FFmpeg 中有一个特殊的过滤器 yadif(yet another deinterlacing filter)可以将输入去隔行,但输出的视频质量要比输出低,这是因为隔行扫描的视频不能被完全复原。
例如,想要将 movie.avi 去隔行,命令如下:
ffmpeg -i movie.avi -vf yadir movie-progressive.mov
这个选项没有额外的参数,可以为输出的视频帧去隔行,但由于其输出质量过低,因此建议使用 yadif 或者其他去隔行过滤器。
MPlayer 工程包含多个为去隔行设计的过滤器,如 detc,divtc,ivtc,mcdeint,pullup,softpulldown,softskip 等。这些过滤器都是通过 mp 过滤器使用,其效果并不总是非常理想。例如,使用 ivtc 过滤器去隔行,命令如下:
ffmpeg -i input.mpg -vf mp=ivtc output.mp4
MPlayer 工程中的 pullup 过滤器设计的要比其他去隔行过滤器健壮,这是因为它利用了未来的环境来做决定。和 ivtc 一样,pullup 也是无状态的,它并没有使用固定模式去处理域,而是想要使用接下来的域去找到相应的匹配域,并重建逐行扫描的帧。
输入视频的高度必须被 4 整出,且推荐同时使用 setpts filter 去修改显示时间戳。例如,想要对 film.vob 进行去隔行,命令如下:
ffmpeg -i film.vob -qscale 2 -vf mp=pullup=4:4:20:20:-1:0,mp=softskip,setpts=N/(24000/1001*TB) -r 24001/1001 film.avi
近年来,数字电视正在逐渐替代模拟电视广播,前者的标准使用逐行扫描格式,而后者则使用隔行扫描格式。数字电视提供了更好的显示质量且在同样的带宽下可传递更多的通道。尽管隔行扫描视频的主要传输格式为 MPEG 运输流,但其仍然被 ATSC 和 DVB 标准所支持。下图显示了 2012 年世界范围内数字电视陆地广播的使用分布:
MPEG 传输流(MPEG-TS)的扩展名为 .ts ,它的格式为 mpegts,因此想要将结果转化为这种格式,命令为:
ffmpeg -i input.avi -f mpegts output.ts
`