“使用AviSynth做DVDrip”的版本间的差异

来自NMM Doc
跳转至: 导航搜索
(以内容'围绕AviSynth等工具做DVDrip,视频部分处理大致可以分为以下几步 *判断类型,IVTC或反交错 *保持正确的SAR *编码及封装 == 准备工作 …'创建新页面)
 
第21行: 第21行:
 
|-
 
|-
 
|A||B||C||D||E
 
|A||B||C||D||E
|-
 
 
|}
 
|}
  
第227行: 第226行:
 
 总结视频处理过程,有以下几步:
 
 总结视频处理过程,有以下几步:
  
{{|class="wikitable"  
+
{| class= "wikitable"  
 
|-
 
|-
 
!判断类型 -> IVTC -> 改变分辨率 [-> 降噪等处理]
 
!判断类型 -> IVTC -> 改变分辨率 [-> 降噪等处理]
|-
 
 
|}
 
|}
  

2010年8月12日 (四) 17:39的版本

围绕AviSynth等工具做DVDrip,视频部分处理大致可以分为以下几步

  • 判断类型,IVTC或反交错
  • 保持正确的SAR
  • 编码及封装


准备工作

Telecine概念

IVTC(InVerse TeleCine,反胶卷过带)是DVDRip中的一个基本概念。

为了将电影(24fps)转换到NTSC电视(30fps)上能够正常播放的格式,需要作Telecine(胶卷过带)。其做法是先把电影的一帧拆成两个场,拥有第0条扫描线的场叫top field(顶场),也叫odd field(奇数场),拥有第1条扫描线的场叫bottom field(底场),也叫even field(偶数场)。0t和0b两个场可以组成完整的第0帧。

取出前4帧看,拆成了8个场,重新组合(这里用top field first,tff):

0t 1t 1t 2t 3t
0b 1b 2b 3b 3b
A B C D E

这样8个场又以这种方式组成了5帧。24帧中每4帧都如此组合,24 * 5 / 4 = 30,就成了30fps的影片。因为原来的显像管电视本来就是交错显示的,这种方式看起来并不会有问题但是电脑显示器或液晶电视是逐行扫描的,其中的C和D帧由于是由两个来自不同帧的场组成的,因此看起来可能就有交错,有人称为梳状波纹。

以上这个过程叫做3:2 pulldhwon。做过3:2 pulldown的电影就变成30fps的了,在NTSC的电视上播放就没有同步问题了,NTSC的DVD也用此种方式的视频。但是在电脑上播放每5张画面会有2张有交错,有人称之为“5烂2”。这种DVD处理起来最简单。

30fps的影片就不必做3:2 pulldown了,因为本来就是30fps的。

电影要在pal的电视上播放,需要做2:2 pulldown。不过没有NTSC那样的复杂组合,只是将播放速度加快5%,既把24fps的画面以25fps播放,声音也加快5%,保持同步。

把3:2 pulldown后的30fps通过重新组合场,删掉重复的帧,还原成原本的24fps的过程叫做IVTC广义上的IVTC包括了处理混合类型的DVD,还原成正常帧率的过程。

DVD的类型

要正确的IVTC,首先要明白动画DVD的类型

  1. Film
    3:2 pulldown的类型。
    有些DVD encoder在压制前会先做IVTC,再做压缩,这样做的好处是每5帧可以省掉1帧,而且可以对纯净的帧进行编码,帧的压缩率比场要高。但是如何在NTSC电视上播放呢?编码器会写入pulldown flag,解码器在播放时按照pulldown flag播放画面,就能在NTSC电视上同步了。
    绝大多数电影都是在完成剪辑后再去telecine,然后以这种方式编码的,处理起来非常简单。在DGIndex里Force film,就会输出24fps无交错的。DGIndex报告95%film以上的类型用Force Film处理。
    也有剪辑的乱七八糟的pulldown的片子,在压DVD时不做IVTC。这种片子也会在IVTC之后也会还原成24fps,但是不能在DGIndex里用Force Film,要用honor pulldown flag。IVTC的工作交给IVTC滤镜处理。
  2. NTSC Video
    本身就是30fps的片子,在DVD里也存为30fps。这种片子不能做IVTC,不然每5帧就会少1帧,动态就不连贯了。
    DGIndex里报告95%Video以上的片子就是这种片子,前提是源是逐行扫描的。30i的隔行扫描需要做Deinterlace。
  3. Hybrid
    混合了film和和video的DVD。有很多具体的情况。
    • 30p是30p,pulldown的是pulldown的,互不影响。比如OP/ED是30p,正片是pulldown。
    • 30p和pulldown内容交叉溶解。
    • 30i滚动字幕覆盖在pulldown的画面上。
    • 淡入淡出处是30i的。
    • 前景是pulldown的,背景是30p的。
    • 先telecine再拉伸的。
    • 画中画的pattern或类型不一样的。
    • 剪辑时少掉一个场,造成scene cut处无法匹配。


常见的IVTC工艺

  • 场匹配 Field Match
    把场和之前之后的场组合,还原出无交错的帧。
  • 反交错 Deinterlace
    这里是狭义的反交错,把场补成帧,但保持帧率不变。
  • Bob
    由于Interlaced视频每个场是在不同的时间拍摄的,比如NTSC DV拍摄的视频每秒拍摄60个场,相当于30fps。为了保持动态,把每个场都补成帧,就形成了60fps。二倍帧率并补全每个场的过程叫Bob。
  • Decimate
    删除场匹配后重复的帧,还原原本的帧率。

一部片里可能会遇到各种情况,比如有些地方是pulldown的,能做成24p,有些地方必须bob到60fps,因此只用一种帧率,即cfr就无法兼顾,这时候就必须把片子作成vfr的。mkvmp4都支持vfr。

准备工具

  • VirtualCloneCD或Deamon等虚拟光驱工具和DVDDecrypt
    用于抽出一话一话的vob和其他工作,比如也可以抽章节文件。
  • DGIndex
    存d2v,包含视频解码器,分离音频
  • AviSynth及其插件、IDE(avsp)和文本编辑器
    IVTC等工作
  • x264
    视频编码器
  • 音频压缩工具
  • mkvtoolnix或mp4box
    封装工具


DVDrip中视频处理部分

用DVD Decrypt按照不同话数抽出

用虚拟光驱载入DVDISO,打开DVDDecrypt,用ifo模式,找到合适的章节,注意要选择完整的一话。靠什么判断选择了完整的一话呢?注意下面的时间,再说,抽出来试试不就知道了。

图-DVDdecrypt截图,标注光驱、目标目录、选择章节。

如果没有设置过切割选项,DVDDecrypt则默认按照1GB分割文件。不过没有什么影响,DGIndex可以打开多个文件。

DVDDecrypt还可以抽出章节文件,但这个不准,必须调整。

图-DVDDecrypt设置截图,不分割文件

图-DVDDecrypt设置截图,抽出章节文件

用DGIndex保存d2v

用DGIndex打开抽出来的vob,按F4(或file->play)后DGIndex开始播放片子,并且会出现一个信息窗口。我们需要借助信息窗口返回的信息初步判断片子的类型。

我们看到Video Type是film,那么这个片子是film类型的,我们可以直接选择force film,这样在avs里载入d2v会得到24fps的正确帧率的视频。因此说film类型的DVD最简单。除了film类型,DGIndex还会返回另一种类型:Video。

Frame Struct是Frame,表示此帧是按照Frame编码的。还有按照Field编码的。

Frame Type是Progressive,只是反应MPEG2码流中的progressive_frame旗标,和片源到底是隔行扫描/逐行扫描没有关系。把逐行扫描当作隔行扫描和把隔行扫描当作逐行扫描压制的有不少。

我们可以试试在菜单的Video->Field Operation里选择Honor Pulldown Flags,保存一个d2v。DGIndex会读取整个流的数据,生成d2v文件,同时还会分离出音频。等保存完毕,再看信息框:

图->保存完毕时的信息框。

可以看到100%Film,这下就可以放心大胆的Force Film了,但其实靠刚才的预览就可以放心force film。当Film不足95%时,选择Honor Pulldown Flags模式。注意千万不要选错,把不能Force Film的给Force Film了,是得不到正确结果的。

在Video菜单里,还有别的会影响解码的选项。在Avs里载入d2v,DGDecodec会直接把解码后的YV12传递过来,这里设置的PC/TV Scale是不影响的。Crop是会影响avs里的画面的。这里的Crop滤镜在高度上必须切4的倍数,在宽度上可以切2的倍数,原因请复习YV12色彩空间

IVTC操作

得到了d2v,我们就可以用avs了。先把DGIndex文件夹里的DGDecodec.dll放到avs的语法:插件插件自动加载目录里。打开avsp,把d2v拖进去,avsp会自动生成一行

MPEG2Source("Direction\DVDvob.d2v")

如果有其他选项,就去掉;如果你想知道具体有哪些选项,这些选项是什么意思,就看DGDecode的Manual吧。

MPEG2Source是源滤镜,负责解码并载入vob中的视频流。

此时会得到一个720x480的视频。假如刚才是Force Film后存的d2v,这一步就不要看了,直接看选择正确的分辨率。如果没有Force Film,就利用AviSynth以及他的插件和脚本做IVTC。

常用的IVTC和反交错插件有:

还有一些IVTC和反交错脚本:

如果下面冒出来了新的插件,也不要惊讶


使用TIVTC做IVTC

TIVTC是tritical大神写的一套IVTC滤镜,包括

  • tfm - 场匹配滤镜,先用多种方式组合附近的场,以匹配成完整的帧,即没有交错的帧。如果实在没有办法匹配出完整的无交错的帧,就把该帧反交错(DeInterlace)掉。
  • tdecimate - 删掉重复的多余帧的滤镜,可以用2pass实现vfr。
  • Mergehints、RequestLinear、FrameDiff、FieldDiff和ShowCombedTIVTC - 众多辅助滤镜。
  • IsCombedTIVTC、CFieldDiff和CFrameDiff - 条件函数,用来给ConditionFilter当判定标准的函数。

一般只用到tfm和tdecimate。

TIVTC的manual给出了9个例子,都非常简单易用,概括了各种情况。

 1.) NTSC Film, normal source (not anime or cartoon).  One pass.
        mpeg2source("c:\oursource.d2v")
        tfm(d2v="c:\oursource.d2v")
        tdecimate()

事实上,TIVTC自动处理情况复杂的动画还是远远不够的。动画中的渐变,包括淡入淡出和场景之间的交叉溶解在内的渐变,有非常大的隔行扫描频率。也就是说渐变场景处是没有完整帧的,无法匹配出原本逐行扫描的帧。但是在这种地方,tfm是相当无力的,经常发生检测不出来的情况,把这些帧当作匹配成功而错误地放走。

好在tfm提供了一种强制某一帧用模个pattern匹配,或者强制其反交错行为的方法。见这篇文章:

使用AAD做IVTC操作

AAD()

选择正确的分辨率

之前曾提到,DVD大多数是可变高宽比的,产生可变高宽比是因为现实的摄像机一般会拍摄宽屏的,16:9或2.35:1的画面,但是NTSC的DVD分辨率是720x480,PAL的DVD分辨率720x576,并不是4:3或16:9,因此在DVD的MPEG2码流中会标明DAR,播放时按照这个标记将画面拉伸至该比例,而且2.35:1的影片会在画面上加黑边,以保证比例正确。加黑边称为letterbox,拉伸至16:9称为Anamorphic。

我们的目的是最终得到画面比例正确的视频,特别指解码后显示出来的SAR为视频,而且不留黑边。一般来说有两种做法,一是在压制前把SAR调整到1:1,二是在压制时给码流定义SAR,播放时就能得到不变形的画面,两种方法都要裁掉黑边。

公式: 目标分辨率 = 当前分辨率 x SAR 原则:黑边切干净,变形尽可能小,mod2,但是为了迁就传统,大多数时候考虑mod8。不要怕切掉画面,准备切掉的这部分画面本来就是在电视上会被切掉的部分,这些边缘的画面是为了保险起见设置的OverScan。


观察DGIndex信息框的提示,一般有以下几种DVD。

  1. NTSC 4:3,分辨率720x480,SAR=10:11
    1. 左右各切8像素,得到704x480,再缩放至640x480
      AviSynth中: LanczosResize(640, 480, 8, 0, -8, 0)
      640/480 = 704/480 x 10/11
      由于缩放到640x480比不缩放利用码流SAR的分辨小,可以省码率,一般没有人用10:11的SAR做DVDrip。
  2. NTSC 16:9,分辨率720x480,SAR=40:33
    1. 左右切7像素,再缩放至864x480
      LanczosResize(864, 480, 4, 0, -3, 0)
      864/480 = 713/480 x 40/33 x 0.99971954
      误差在3%%左右,非常小。
      若发现黑边比较大,总共切7不够,就多切一点。切到706,在缩放到856x480
      LancozsResize(856, 480, 7, 0, -7, 0)
      856/480 = 706/480 x 40/33 x 1.000283286
      误差也很小。
    2. 利用H.264的SAR
      首先把黑边切干净,不要在AviSynth里缩放,用x264时加一个选项:--sar 40:33。一定要在x264里加这个参数,不然即使在容器里设置了DAR,播放器可能还是会无视掉容器的DAR,但是视频码流的SAR是不会被解码器/播放器忽视的,在播放时会自动按照视频码流的SAR拉伸。
  3. PAL 4:3,分辨率720x576,SAR
  4. PAL 16:9

可以使用avsp的Resize Calculator辅助计算切多少边、缩放到多少、比例误差是多少。

不要改变色彩

从MPEG2Source会输出YV12的视频,在AviSynth里也是全程YV12处理。不要在AviSynth里动色彩。

YC伸张

可能你已经注意到了在DGIndex里的选择TV Scale和PC Scale,色彩是不同的。选择PC Scale时色彩很饱满,很鲜艳,选择TV Scale时显得比较“灰”。这涉及到YUV范围的问题。在电脑上亮度Luma的范围是0~255,色度Chroma的范围也是0~255,但是在TV上为了一些冗余,亮度Luma范围是16~235,色度Chroma的范围是20~240。电视将TV Scale范围内的色彩转换为RGB,范围外的就丢掉了。电脑上则相反,从0到255都用上了。DVD原本是在电视上播放的,因此编码时也用TV Scale,这就导致在电脑上播放时本应该是黑色的地方却是灰色的。很多人将这种情况称为“黑位不准”,其实是不明白这中间的原因。现在的播放器大多数都会自动将TV Scale的转换到PC Scale,因此在DVDrip时不要动“level”,将转换工作交给播放时的软件做。

但是播放时会不会做转换很复杂,不同的播放器、解码器、渲染器、显卡以及显卡驱动表现出的行为均不太一样,可以参考这篇研究:

YUV<->RGB转换系数

我们用到的显示设备是用RGB色彩空间的,但是MPEG视频里是用YUV色彩空间的,这就涉及到RGB和YUV互相转换的问题。 除了上面的YV伸张,还有转换矩阵(转换系数)。ITU推荐了两种转换系数:ITU-R BT.601和ITU-R BT.709。前者ITU-R BT.601主要用在DVD等标清的视频中,ITU-R BT.709主要用在HDTV、BluRay等高清的视频中。

我们在DGIndex里面已经见过转换系数了,在DGIndex信息栏的Colorimetry一栏,其中BT.470-2 B,G*表示MPEG2中并没有指定转换矩阵,DGIndex按照标清级别的分辨率推测位BT.470-2。其实BT.470-2和ITU-R BT.601是一样的,因此这个DVD就是用ITU-R BT.601。

实际上,现在的播放器、解码器、渲染器也是按照分辨率选择变换矩阵的。标清的(720p以下)就用ITU-R BT.601,高清(720p及以上)则用ITU-R BT.709。因此,在做DVDrip的过程中不能改变色彩变换矩阵

更进一步,在做SD<-->HD的缩放时,必须改变YUV的值,让渲染器用分辨率对应的变换时,能够播放出色彩正确的画面。用AviSynth的ColorMatrix插件。

SD->HD

ColorMatrix(clip, "BT.601->BT.709")

HD->SD

ColorMatrix(clip, "BT.709->BT.601")

如果在SD范围内缩放,像在分辨率一节所讲的例子,不要改变色彩变换矩阵

接下来可以降噪、锐化,让画面看起来更舒服,看个人喜好了。

总结视频处理过程,有以下几步:

判断类型 -> IVTC -> 改变分辨率 [-> 降噪等处理]

如果选择输出SAR=1:1的画面,那么缩放一定要在ITVC之后做

之后就可以交给x264压制了。

音频处理

从DGIndex里抽出了音频,一般是AC3、LPCM(wav)等。AC3可以直接封装,LPCM最好压一下

其他DVDrip方案

Direct264

用mencoder做DVDrip

Category:DVDrip Category:视频编码器