DVD 处理包括
色彩空间变换
通常 DVD 是 BT.601-6
SMPTE 170M:是北美及其他采用 NTSC 电视制式的国家所使用的标清视频标准。
ITU-R BT.470-BG:是欧洲及其他采用 PAL 电视制式的国家所使用的标清视频标准。
| 特性 (Feature) | SMPTE 170M | ITU-R BT.470-BG |
|---|---|---|
| 主要应用地域 | 北美、日本、韩国、台湾等 | 欧洲、澳大利亚、中国大陆、中东等 |
| 电视制式 | NTSC (National Television System Committee) | PAL (Phase Alternating Line) |
| 扫描系统 | 525 行 / 59.94 场/秒 (常简称为 480i) | 625 行 / 50 场/秒 (常简称为 576i) |
| 色彩编码 | NTSC 色彩编码,使用正交幅度调制 (QAM) | PAL 色彩编码,采用“逐行倒相”技术 |
| 色域 / 原色 | SMPTE C Primaries | EBU Tech 3213 Primaries |
| 帧率 (约) | 29.97 帧/秒 (隔行) | 25 帧/秒 (隔行) |
| 垂直分辨率(有效) | 480 或 486 行 | 576 行 |
| 数字化标准 | 对应 ITU-R BT.601 (525/60) 部分 | 对应 ITU-R BT.601 (625/50) 部分 |
https://zh.wikipedia.org/wiki/BT.601
注意是一个色彩空间 两个标准,两个标准使用相同的色彩空间
用下面代码转换到 BT.709 (可以自行搜索了解下为什么要这么做)
1 | src = core.resize.Point(src, matrix_in_s='470bg', matrix_s='709') |
参考下这里 https://fxxs-encoder.github.io/2.Tools/placebo/#Matrix-值列表
注意看这里的官方文档
https://www.vapoursynth.com/doc/functions/video/resize.html#resize.Bob
SMPTE ST 170 (functionally the same as the value 5 (470bg)) 就是注意上面那串代码的小问题你还是要知道的
SAR
https://en.wikipedia.org/wiki/Pixel_aspect_ratio
SAR (Storage Aspect Ratio),即存储宽高比
DAR 的全称是 Display Aspect Ratio,中文翻译为 显示宽高比。
PAR (Pixel Aspect Ratio, 像素宽高比)
SAR = DAR / PAR
通常我们需要保证压出来的视频是符合 DAR 的。通常我是直接调整分辨率,不过 jetpack 有函数,但是我还不会用。
vivtc
以下翻译自 https://amusementclub.github.io/doc/plugins/vivtc.html
VFM
VFM 是一种场匹配滤镜,用于从经过胶片过带(Telecine)处理的视频流中恢复原始的逐行帧。VFM 的输出会包含重复帧,因此必须再使用像 VDecimate 这样的抽帧滤镜进行后续处理。
与 TFM 不同,VFM 本身不具备任何后处理功能。
不过,你可以像下面这样编写自己的脚本来实现后处理(请确保去交错器和 VFM 的参考场设置相同,以避免画面出现抖动)。
1 | import vapoursynth as vs |
VFM 会为其输出的每一帧添加以下属性:
VFMMics
一个包含五个整数的数组。它会包含五种可能匹配模式 (p/c/n/b/u) 的 “mic” 值。根据
micout和micmatch的设置,其中一些值可能未被设置(显示为 -1)。这些数值代表了在该帧的任意块(block)中发现的梳理像素(combed pixels)的最高密度。(“梳理/拉丝”是指由于错误的场组合而产生的横向交错线条伪影)。
_Combed
如果 VFM 认为该帧是梳理帧(有拉丝),则为 1,否则为 0。VFMMatch
用于该帧的匹配模式。0 = p(previous, 使用前一帧的场)1 = c(current, 使用当前帧的场)2 = n(next, 使用后一帧的场)3 = b(blend/both, 混合或两者)4 = u(unmatched, 未匹配或另一种组合)
VFMSceneChange
如果 VFM 认为该帧是场景切换点,则为 1,否则为 0。
参数 (Parameters):
clip
输入剪辑。支持 YUV420P8、YUV422P8、YUV440P8、YUV444P8 和 GRAY8 格式。必须具有固定的格式和尺寸。order
设置剪辑的场序。通常场序信息是从_FieldBased帧属性中获取的。此参数仅在_FieldBased属性值无效或不存在时使用。如果场序设置错误,VFM 在
mode=0下的输出将会有明显的错误。0- 底场优先 (Bottom Field First, BFF)1- 顶场优先 (Top Field First, TFF)
field
设置用于匹配的参考场。这是指在进行 p 或 n 匹配时,VFM 将从当前帧中提取的场。建议将此设置与场序(order)保持一致,除非在该设置下你遇到了匹配失败的问题。在某些情况下,更改用于匹配的参考场会对匹配性能产生很大影响。0- 底场1- 顶场2- 与场序相同3- 与场序相反
0和1会忽略_FieldBased帧属性。2和3会根据从_FieldBased属性获取的场序进行自适应调整。默认值: 2
mode
设置要使用的匹配模式或策略。- 模式 0 (2-way match) 是所有选项中最安全的,因为它不会冒险在可能的情况下因重复帧而产生画面抖动。但如果视频中有错误的剪辑点或混合场,它最终可能会输出带拉丝的帧,即使一个好的匹配可能实际存在。
- 模式 5 (3-way match + 尝试第4/5种匹配) 在产生抖动方面风险最高,但如果存在一个好的帧,它几乎总能找到。
- 其他设置(模式 1, 2, 3, 4)在“产生抖动和重复帧的风险”与“在有错误剪辑、孤立场、混合场的片段中找到好匹配”之间取得了不同的平衡。
请注意,这里的“梳理状态”与
_Combed帧属性不同。它是一个相对和绝对阈值比较的组合,即使原始帧的_Combed标志未被设置,也可能导致匹配模式被更改。0 = 2-way match (p/c):双向匹配1 = 2-way match + 3rd match on combed (p/c + n):双向匹配,若有拉丝则尝试第三种匹配2 = 2-way match + 3rd match (same order) on combed (p/c + u):双向匹配,若有拉丝则尝试第三种匹配(同序)3 = 2-way match + 3rd match on combed + 4th/5th matches if still combed (p/c + n + u/b):双向匹配,若有拉丝则尝试第三种,若仍有拉丝则尝试第四/五种4 = 3-way match (p/c/n):三向匹配5 = 3-way match + 4th/5th matches on combed (p/c/n + u/b):三向匹配,若有拉丝则尝试第四/五种
末尾括号中的字母表示在
order=1和field=1的假设下,每种模式会使用的匹配类型。默认值: 1
mchroma
设置在匹配比较中是否包含色度(chroma)信息。在大多数情况下,建议保持启用。只有当你的剪辑有严重的色度问题,如严重的彩虹效应或其他伪影时,才应将其设置为false。将其设置为false也可以用来提速,但会牺牲一些准确性。默认值: true
cthresh
这是用于梳理帧检测的区域梳理阈值。它实质上控制了拉丝需要多“强”或多“明显”才会被检测到。值越大,意味着拉丝必须更明显;值越小,意味着不太明显或较弱的拉丝也会被检测到。有效设置范围从 -1(每个像素都将被检测为梳理)到 255(没有像素会被检测为梳理)。这基本上是一个像素差异值。一个较好的范围是 8 到 12。默认值: 9
mi
在一个blockxxblocky大小的块内,需要有多少个梳理像素才将该帧判定为梳理帧。cthresh控制了拉丝的“可见度”,而此设置则控制了在任何局部区域(由blockx和blocky定义的窗口)需要“有多少”拉丝。最小值为 0,最大值为blocky * blockx(此时没有帧会被检测为梳理帧)。默认值: 80
chroma
设置在判断梳理帧时是否考虑色度信息。只有当你的源视频有色度问题(如彩虹效应等)并且这些问题在启用色度检测时导致了麻烦,才禁用此项。实际上,使用chroma=false通常更可靠,除非源视频中存在仅在色度通道出现的拉丝。默认值: true
blockx,blocky
设置在梳理帧检测期间使用的窗口大小。这关系到在多大的区域内需要达到mi个梳理像素才能将帧声明为梳理帧。更多信息请参见mi参数的描述。可能的值是 4 到 512 之间的任何 2 的幂次方。默认值: 16, 16
y0,y1
从y0到y1的行将被排除在场匹配决策之外。这可以用来忽略字幕、台标或其他可能干扰匹配的元素。将y0设置为与y1相等以禁用此功能。默认值: 16, 16
scthresh
设置场景切换阈值,作为亮度平面上最大变化的百分比。较好的值在 8 到 14 的范围内。默认值: 12
micmatch
当micmatch大于 0 时,VFM 在决定最终使用哪种匹配模式时会考虑匹配的 mic 值。只有在当前匹配模式下可能被使用的匹配才会被考虑。micmatch有 3 个可能的设置:0- 禁用。模式 1、2 和 3 实际上变得与模式 0 相同。模式 5 变得与模式 4 相同。1- mic 匹配将仅在场景切换点附近使用。请参见scthresh参数。2- mic 匹配将在所有地方使用。
默认值: 1
micout
如果为true,VFM 将为所有可能的匹配模式 (p/c/n/b/u) 计算 mic 值。否则,只会计算mode参数所允许的匹配模式的 mic 值。默认值: false
clip2
VFM 将用clip2来创建输出帧。如果使用了clip2,VFM 将基于clip执行所有计算,但会从clip2复制选定的场。这可以用来绕过 VFM 的视频格式限制。例如,如果你有一个 YUV444P16 的输入剪辑:1
2yv12 = vs.core.resize.Bicubic(clip=original, format=vs.YUV420P8)
fieldmatched = vs.core.vivtc.VFM(clip=yv12, order=1, chroma=False, clip2=original)注意
在这个例子中,色度被忽略了,因为所使用的到 YUV420P8 的转换无法精确保留它。
VDecimate
VDecimate 是一个抽帧滤镜。它会从每 cycle 帧中删除一帧——最可能是重复的那一帧(相当于 TDecimate 中的 mode 0)。
参数 (Parameters):
clip
输入剪辑。必须具有固定的格式和尺寸、已知的长度、整数样本类型,且位深度在 8 到 16 位之间。cycle
一个周期的帧数。每cycle帧中将有一帧被删除。默认值: 5
chroma
控制在计算帧差异度量时是否考虑色度。默认值: 当输入剪辑有色度时为 true
dupthresh
设置重复检测的阈值。如果一帧的差异度量小于或等于此值,则它被声明为重复帧。该值是blockx和blocky定义的块最大变化的百分比,所以1.1意味着最大可能变化的 1.1%。默认值: 1.1
scthresh
设置检测场景变化的阈值。该值是亮度平面上最大变化的百分比。较好的值在 10 到 15 之间。默认值: 15
blockx,blocky
设置用于度量计算的块大小。较大的块能更好地抑制噪点,但对小范围移动的检测能力较差。可能的值是 4 到 512 之间的任何 2 的幂次方。默认值: 32, 32
clip2
此参数与 VFM 的clip2参数用途相同。ovr
包含覆盖设置的文本文件。可用于手动选择要删除的帧。以#开头的行将被忽略。删除特定的一帧:
1
314 -
从第 1001 帧开始,到第 5403 帧结束,每四帧删除一帧:
1
1001,5403 +++-+
当然,这里的帧号适用于未经过抽帧的输入剪辑。
抽帧模式必须包含
cycle个字符。如果覆盖设置为每个周期标记了多于一帧,则周期内第一个被标记为删除的帧将被丢弃。
dryrun
如果为true,“空跑模式”,VDecimate 将不会删除任何帧。相反,它会为每一帧附加以下属性:VDecimateDrop: 如果 VDecimate 正常情况下会删除这一帧,则为 1,否则为 0。VDecimateMaxBlockDiff: 在任何blockx*blocky大小的块中,当前帧与前一帧之间的最大绝对差异。在 Yatta 中被称为 “DMetric”。VDecimateTotalDiff: 当前帧与前一帧之间的总绝对差异。
默认值: false
etc
sample
1 | dvd = core.vivtc.VFM(dvd, order=1).vivtc.VDecimate() |
vs-jetpack
(不过测试下面这个不如最基础的 TWO_WAY_MATCH)
1 | from vsdeinterlace import (QTempGaussMC,sivtc,jivtc,IVTCycles,vfm,vdecimate,VFMMode) |
VCB Guide
https://guides.vcb-s.com/basic-guide-10#3-ivtc24t-%E4%B8%8E-24d
VCB 的代码,这个主要是考虑原教程可能失联才补的,如果原教程在线,建议看原教程
1 | import vapoursynth as vs |
jetpack
使用 VFM 进行场匹配。
该函数使用 VIVTC 的 VFM 插件,来检测和匹配经过胶片过带(telecine)处理的内容中的场。
你可以传递一个后处理剪辑或函数,用于处理残留的拉丝帧(combed frames)。如果你传递的是一个剪辑,它将用该剪辑的对应帧来替换拉丝帧。如果你传递的是一个函数,该函数会作用于你的原始输入剪辑,然后用其处理结果来替换拉丝帧。
Example:
1 | # Run vsaa.NNEDI3 on combed frames |