Replies: 2 comments 1 reply
-
2. 拼接 k7sfunc 的模块2.1. 创建毛胚有了前文的知识,现在应该理解示例脚本中 我以 “超分+补帧” 这样一套需求组合为例,创建一个示例脚本: ### 这是一个未经优化的完整vpy脚本内容
import k7sfunc as k7f
clip = video_in
ret = k7f.FMT_CTRL(clip, h_max=1080, h_ret=True)
clip = k7f.UAI_NV_TRT(clip, model_pth="Zarxrax_DigitalFlim_SuperUltraCompact_x2_fp16_opset14.onnx", fp16=True, st_eng=True)
clip = k7f.MVT_MQ(clip, fps_in=container_fps)
clip.set_output() UAI_NV_TRT 和 MVT_MQ 这两模块请自行阅读开头文档中的模块功能叙述。 为什么是先放大后补帧?补帧往往带来帧破损,放大在后处理会放大这种瑕疵;当前大多数超分的计算效率远低于补帧 2.2. 性能优化下面讲解拼接顺序的理由和如何优化性能。即用 FMT_CTRL 做多次中间处理: ### 这是优化后的完整vpy脚本内容
import k7sfunc as k7f
clip = video_in
ret = k7f.FMT_CTRL(clip, h_max=1080, h_ret=True)
clip = k7f.FMT_CTRL(clip, h_max=720, fmt_pix=1) ## 第一次
clip = k7f.UAI_NV_TRT(clip, model_pth="Zarxrax_DigitalFlim_SuperUltraCompact_x2_fp16_opset14.onnx", fp16=True, st_eng=True)
clip = k7f.FMT_CTRL(clip, h_max=1440) ## 第二次
clip = k7f.MVT_MQ(clip, fps_in=container_fps)
clip.set_output() 第一次的额外插入 第二次的额外插入 2.3. 按条件可选处理假如你有这样的需求,高分辨率不放大但是补帧,或高帧率不补帧但放大 import k7sfunc as k7f
clip = video_in
if clip.height <= 1200 :
clip = k7f.FMT_CTRL(clip, h_max=720, fmt_pix=1)
clip = k7f.UAI_NV_TRT(clip, model_pth="Zarxrax_DigitalFlim_SuperUltraCompact_x2_fp16_opset14.onnx", fp16=True, st_eng=True)
clip = k7f.FMT_CTRL(clip, h_max=1440)
if container_fps <= 32 :
clip = k7f.FMT_CTRL(clip, h_max=1440, fmt_pix=1)
clip = k7f.MVT_MQ(clip, fps_in=container_fps)
if not (clip == video_in) :
clip.set_output() 暂无解释,自行尝试理解( |
Beta Was this translation helpful? Give feedback.
-
既是零基础的mpv-vs脚本编写指南(但是需要有mpv的进阶使用知识),也是 创建自定义vpy脚本(请先阅读此部分) 的扩展。
把vpy想象成一个非线性视频编辑器,这也许可以帮助减少理解难度。
mpv提供了哪些
变量
?video_in
(当前视频)video_in_dw
(当前视频的输出宽度)video_in_dh
(当前视频的输出高度)container_fps
(当前视频的源帧率)display_fps
(显示器的刷新率)参考: https://mpv.io/manual/master/#video-filters-video-in
如何理解 “变量” ?这相当于在写 mpv.conf/input.conf 时可以直接用的
属性
1. 基础——创建与修改变量
这部分我尝试让你理解脚本的首尾固定框架的含义及作用。
创建一个vpy文件并打开,相当于打开视频编辑器。当然这像是个自动化程度很低的视频编辑软件,所以第一步要"手动导入插件",即导入模块/库,这对应每个脚本开头的固定两行:
这产生的另一个结果是,定义了两个新变量
vs
core
core 是个频繁要被用到的模块,因此大多数脚本开头都会直接导入。第二行不写也可,当然这会影响后续的编写方式
Tip
(补充知识)
导入模块的姿势是多样的,再比如:
它产生的另一个结果是,定义了新变量
vapoursynth
第二步,导入视频。在vpy中,我的习惯是定义一个新变量
视频这个变量已经由mpv提供了,我们可以直接用。这里把 video_in 赋值给新定义的变量 clip ,可以理解为在视频编辑器内创建一个空轨道,然后把在素材库里的视频拖到这个轨道上去。
第三步,尝试对这个视频做一些简单的处理,比如用 vapoursynth 内置的缩放功能,这里当作套用一个滤镜。
此处的
core.resize.Lanczos
相当于你打开一层层菜单最后点选的滤镜条目,然后弹出对话框(clip=xxx, width=xxx, height=xxx)
让你分别填上值。“滤镜” Lanczos 的第一个参数表示要处理的对象是
clip
(这里指的是上一行的clip = video_in
)由于我没有使用新的变量名,因此产生的结果被保存并覆盖在旧变量 clip 中,即此时 clip 已经不是原始的 video_in 了。
Tip
(补充知识)
这一步也可以写成
为什么是这么写?core 是 vapoursynth 的子模块,resize 是 core 的子模块,Lanczos 是 resize 的子模块。
如果你开头没有编写
from vapoursynth import core
那么你只能以这种方式来使用最后,尝试输出修改后的视频:
xxx.set_output() 是固定写法,不用理解原理。
Beta Was this translation helpful? Give feedback.
All reactions