DVD 处理,NTSC SAR VIVTC

  • ~7.90K 字
  1. 1. 色彩空间变换
  2. 2. SAR
  3. 3. vivtc
    1. 3.1. VFM
    2. 3.2. VDecimate
    3. 3.3. etc
    4. 3.4. VCB Guide
    5. 3.5. jetpack

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import vapoursynth as vs
import functools

input_clip = vs.core.std.BlankClip(format=vs.YUV420P8, length=1000, color=[255, 128, 128])

def postprocess(n, f, clip, deinterlaced):
if f.props['_Combed'] > 0:
return deinterlaced
else:
return clip

matched_clip = vs.core.vivtc.VFM(input_clip, 1)
deinterlaced_clip = vs.core.eedi3.eedi3(matched_clip, field=1)
postprocessed_clip = vs.core.std.FrameEval(matched_clip, functools.partial(postprocess, clip=matched_clip, deinterlaced=deinterlaced_clip), prop_src=matched_clip)
decimated_clip = vs.core.vivtc.VDecimate(postprocessed_clip)
decimated_clip.set_output()

VFM 会为其输出的每一帧添加以下属性:

  • VFMMics
    一个包含五个整数的数组。

    它会包含五种可能匹配模式 (p/c/n/b/u) 的 “mic” 值。根据 micoutmicmatch 的设置,其中一些值可能未被设置(显示为 -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 - 与场序相反

    01 会忽略 _FieldBased 帧属性。23 会根据从 _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=1field=1 的假设下,每种模式会使用的匹配类型。

    默认值: 1

  • mchroma
    设置在匹配比较中是否包含色度(chroma)信息。在大多数情况下,建议保持启用。只有当你的剪辑有严重的色度问题,如严重的彩虹效应或其他伪影时,才应将其设置为 false。将其设置为 false 也可以用来提速,但会牺牲一些准确性。

    默认值: true

  • cthresh
    这是用于梳理帧检测的区域梳理阈值。它实质上控制了拉丝需要多“强”或多“明显”才会被检测到。值越大,意味着拉丝必须更明显;值越小,意味着不太明显或较弱的拉丝也会被检测到。有效设置范围从 -1(每个像素都将被检测为梳理)到 255(没有像素会被检测为梳理)。这基本上是一个像素差异值。一个较好的范围是 8 到 12。

    默认值: 9

  • mi
    在一个 blockx x blocky 大小的块内,需要有多少个梳理像素才将该帧判定为梳理帧。cthresh 控制了拉丝的“可见度”,而此设置则控制了在任何局部区域(由 blockxblocky 定义的窗口)需要“有多少”拉丝。最小值为 0,最大值为 blocky * blockx(此时没有帧会被检测为梳理帧)。

    默认值: 80

  • chroma
    设置在判断梳理帧时是否考虑色度信息。只有当你的源视频有色度问题(如彩虹效应等)并且这些问题在启用色度检测时导致了麻烦,才禁用此项。实际上,使用 chroma=false 通常更可靠,除非源视频中存在仅在色度通道出现的拉丝。

    默认值: true

  • blockx, blocky
    设置在梳理帧检测期间使用的窗口大小。这关系到在多大的区域内需要达到 mi 个梳理像素才能将帧声明为梳理帧。更多信息请参见 mi 参数的描述。可能的值是 4 到 512 之间的任何 2 的幂次方。

    默认值: 16, 16

  • y0, y1
    y0y1 的行将被排除在场匹配决策之外。这可以用来忽略字幕、台标或其他可能干扰匹配的元素。将 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
    2
    yv12 = 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
    设置重复检测的阈值。如果一帧的差异度量小于或等于此值,则它被声明为重复帧。该值是 blockxblocky 定义的块最大变化的百分比,所以 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
2
3
from vsdeinterlace import (QTempGaussMC,sivtc,jivtc,IVTCycles,vfm,vdecimate,VFMMode)
src = vfm(src, mode=VFMMode.THREE_WAY_MATCH_FOURTH_FIFTH)
src = vdecimate(src)

VCB Guide

https://guides.vcb-s.com/basic-guide-10#3-ivtc24t-%E4%B8%8E-24d

https://github.com/vcb-s/guides/tree/master/Basics/%5B10%5D%20%E5%88%9D%E7%AD%89%2030fps%20%E5%A4%84%E7%90%86

VCB 的代码,这个主要是考虑原教程可能失联才补的,如果原教程在线,建议看原教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import vapoursynth as vs
from vapoursynth import core
import havsfunc as haf
import functools

def pp(n, f, clip, deinterlaced):
if f.props['_Combed'] > 0:
return deinterlaced
else:
return clip

src = core.lsmas.LWLibavSource(source_file)
matched = core.vivtc.VFM(src, 1)
deint = haf.QTGMC(matched, TFF=True, FPSDivisor=2)
pp_clip = core.std.FrameEval(matched, functools.partial(pp, clip=matched, deinterlaced=deint), prop_src=matched)
res = core.vivtc.VDecimate(pp_clip)

jetpack

https://jaded-encoding-thaumaturgy.github.io/vs-jetpack/api/vsdeinterlace/ivtc/#vsdeinterlace.ivtc.vfm

使用 VFM 进行场匹配。

该函数使用 VIVTC 的 VFM 插件,来检测和匹配经过胶片过带(telecine)处理的内容中的场。
你可以传递一个后处理剪辑或函数,用于处理残留的拉丝帧(combed frames)。如果你传递的是一个剪辑,它将用该剪辑的对应帧来替换拉丝帧。如果你传递的是一个函数,该函数会作用于你的原始输入剪辑,然后用其处理结果来替换拉丝帧。

Example:

1
2
# Run vsaa.NNEDI3 on combed frames
vfm(clip, postprocess=NNEDI3().deinterlace)
打赏
打赏提示信息
分享
分享提示信息