Skip to content

Latest commit

 

History

History
518 lines (338 loc) · 24.1 KB

压制基础教程.md

File metadata and controls

518 lines (338 loc) · 24.1 KB

压制基础教程(FXXS出品)

源、编码、透明度对比

:源是指高质量可以用于进行压制编码的视频,一般包括蓝光圆盘、高质量的Web(一般4K的SDR)等。压片时应采用 最优质的源 进行压制,提高压制质量。

随着很多老片的BD推出,很多蓝光源是从低分辨率拉到高分辨率,被称为 Upscaled,在压制时应注意复原为原版的分辨率,不要压制过高的分辨率。关于WEB源应谨慎使用,尤其1080p的web-dl一般都为低质量不可以进行二次压制源,如非必要请勿压制,4k的SDR web源目前评价较好,往往好于1080p的BD来源,对于压制1080p的视频可以进行比较使用。

!!!对于已经编码过的视频禁止二次编码!!! (通常而言,二次编码违反选择最优质源进行压制的原则。)

编码:编码是指对于高质量来源进行压缩编码,进一步节约体积。编码过程种主要进行片源处理,修复源较为明显常见问题,通常包括脏边、色带、碎块、颜色偏差、伽马矫正等;切除黑边,去除源中16:9比例下的黑色边框;压制空间,主要将源采用更高的压缩方式进行重新编码,通常为有损方式。

透明度对比:透明度是评价源于编码之间的相似程度的指标。良好的透明度是指在有经验的编码人员下都不能较为明显区分压制作品与源之间的差距。

根据I、P、B帧的功能,在编码过程中,编码器一般会尊重I帧内容,哪怕再劣质的压制,都不会对其进行明显的转换;而针对p帧,编码器可以转化为B帧进行编码节约空间,对于B帧进行重新编码。因此透明度应该从源与压制中P->B以及B->B的转换质量对比评判的压制质量。

Bloating:称为臃肿,是指实现在相同透明度情况下,码率较高。根据压制较为广泛接受的规则,当压制作品太过接近源的码率也被认为Bloating,数值如下表:(x265建议更小的比例)

1080p 720p 576p 480p
原盘码率比例 75% 50%

x264 与 x265

在安装比 VapourSynth 更容易找到的 x264 和 x265 编码器前,你也可以选择使用它们的修改版。 最主流 x264 的修改版是 tmod 。值得注意的改进包括淡化补偿(fade-compensate),在**宏块树(mbtree)**开启的情况下对淡入淡出进行编码,以及更多的 自适应量化(aq-mode) 选项。除非你不使用这些选项(但现在几乎没有人这么做),那么你可以直接使用 vanilla x264 代替。而如果你希望在转码时更加精确地控制,毫无疑问你应该尝试使用 tmod 并捆绑使用它提供的aq-mode ,这样你就能够从中榨取出更高的质量,从而在保护噪点的同时不至于破坏线条。

最主流的 x265 修改版则是 yukki ,相比 x264 的修改版它却没有那么让人印象深刻。所有这一切都包括一些外观上的变化,比如更准确的预计完成时间。

x264参数

--crf * --preset placebo --profile high --threads auto --deblock -3,-3 --me umh --merange 32 --rc-lookahead 60 --aq-mode 2 --no-mbtree --aq-strength 1.0 --qcomp 0.60 --psy-rd 1.0:0.00 --bframes 16 --ref *

ref计算方法:

x265非HDR参数(仅供参考)

-D 10 --preset veryslower --level-idc 5.1 --ctu 32 --rd 4 --subme 7 --ref 5 --pmode --no-rect --no-amp --rskip 0 --tu-intra-depth 4 --tu-inter-depth 4 --range limited --no-open-gop --no-sao --rc-lookahead 100 --no-cutree --bframes 8 --vbv-bufsize 160000 --vbv-maxrate 160000 --colorprim bt709 --transfer bt709 --colormatrix bt709 --deblock -3:-3  --no-strong-intra-smoothing --ipratio 1.3 --pbratio 1.2 --qcomp 0.6 --aq-mode 2 --aq-strength 1.0 --psy-rd 1.00 --psy-rdoq 1.00

x265的HDR参数(仅供参考,HDR参数需要计算,不能直接使用)

-D 10 --crf * --preset slower --level-idc 5.1 --bframes 8 --rd 4 --me 3 --subme 7 --ref 5 --merange 57 --ipratio 1.3 --pbratio 1.2 --aq-mode 2 --aq-strength 1.00 --qcomp 0.60 --psy-rd 1.5 --psy-rdoq 1.00 --ctu 64 --rc-lookahead 100 --deblock -3:-3 --no-strong-intra-smoothing --cbqpoffs 0 --crqpoffs 0 --qg-size 8 --range limited --no-frame-dup --selective-sao 0 --no-cutree --tu-intra-depth 4 --no-open-gop --tu-inter-depth 4 --rskip 0 --no-tskip --no-early-skip --min-keyint=1 --no-rect --no-amp --vbv-bufsize 160000 --vbv-maxrate 160000 --no-sao --aud --repeat-headers --hrd --hdr-opt --colorprim bt2020 --colormatrix bt2020nc --transfer smpte2084 --chromaloc 2 --pmode --master-display "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50)" --max-cll=577,512

其中的HDR参数应根据源进行计算设置

压制环境构建

全套软件打包(请联系相关人员获取)

便携版压制软件带集成环境

https://github.com/ted423/Simple-x264-x265-Launcher-with-vapoursynth-protable

VS集成环境(其他人维护,脚本可能不太全,ffms2等版本存在已知issue)

https://github.com/theChaosCoder/vapoursynth-portable-FATPACK

基础软件

  • Mediainfo =:媒体信息检查软件,查看片源以及压制信息使用。
  • MKVToolNix: mkv混流软件,也能实现以下基本的视频分割。
  • SubtitleEdit: 字幕编辑软,可以实现ORC等功能。
  • DGDemux: Demux 软件,目前作为默认标准的Demux软件
  • eac3to: 存在已知Issue音轨转码编辑软件,也可实现Demux等功能。推荐使用eac3to with UsEac3to版本,并应包含一些对应的其他转换格式插件。
  • BDinfo: 蓝光原盘信息检测分析软件。
  • VLC: 能播放蓝光菜单,辅助确认音轨字幕章节信息

基础部分软件直接使用或者安装即可。 AVS和VS为两种方向,推荐选VS

AVS相关教程Archive

VapourSynth环境

官方文档

VapourSynth是基于python编写新一代的视频处理工具,解决了许多AVS遗留的问题,显著提高了运行速度。

Python:安装VS之前必须装好Python环境,不同VS版本要求的Python版本不同,下载安装前请先看好所需要的Python版本。安装时候必须选择 Add Python to PATH !!

VapourSynth:VapourSynth的主体安装程序,安装过程推荐安装所有推荐内容。除了安装位置外推荐使用默认设置。安装完后只包括主程序,以及官方的自带的插件,VS使用过程需要大量的插件以及脚本:主要分为 Script(.py)脚本Plugins(.dll)插件 两个部分。安装插件脚本,需要将对应文件放入对应目录,目录在官方文档内有详细介绍。在Windows下官方提供了方便的下载管理。下文对于使用到部分将会介绍。

请注意脚本主要是 Python 环境,Python 版本兼容,通过 import 加载,而dll加载与VS本身,是需要考虑系统兼容,通过 core.XXX 加载,很多插件没有 Release Linux 版本,所以 Linux 环境可能会有部分插件需要自己想办法编译或者没法编译。

口语环境里,很多人会把脚本也叫成插件,但自己注意区分,以免造成混淆

VapourSynth 文档中列出了放置插件的路径。

Windows 的推荐路径<AppData>\VapourSynth\plugins32<AppData>\VapourSynth\plugins64。Unix 用户可以创建一个配置文件来指定路径。

VapourSynth的Python脚本应该放在你的Python site-packages文件夹中。在 Arch Linux上,位于 /usr/lib64/Python3.*/sitepackages/。Windows 用户可以在本地AppData文件夹【译者注:即C:\Users\<用户名>\AppData\Local】中找到这个文件夹。

需要注意的是 Python 自身也会有个 site-packages 文件夹,注意不要放错位置或者混放,可能会造成不知道加载了什么东西的问题

VSRepoGUI:官方提供了方便的下载管理插件以及脚本的GUI界面,下载解压后点开后即可使用,推荐放在VS的安装目录内。

image-20200209025555494

通过软件可以查看对应的VS安装信息和脚本插件的所在位置,同时可以实现对插件的脚本安装、更新和卸载,软件插件安装位置,再右上角可以快速点开。在Windows下推荐本软件进行维护插件和脚本。

VapourSynth 编辑器

VapourSynth Editor:VS Editor是目前较为广泛使用的VS编辑器(目前会使用Mod版本)。下载后,直接解压即可使用。第一次使用时候,需要配置VapourSynth文件的位置。VS plugins paths 可以是用VSRepoGUI中的路径进行查看。

image-20200210015648555

独立版本

Yuuno 是 Jupyter 记事本的一个扩展,允许你编辑和导出 VapourSynth 脚本。你可以通过以下代码来安装。

$ pip install yuuno
$ yuuno jupyter install

注意你需要安装 Jupyter 或 Jupyter Lab。

VapourSynth Preview 需要一个单独的文本编辑器或 IDE 来编写脚本,这使得它对那些不喜欢 VSEdit 中内置编辑器的人来说非常有用。 AvsPmod是用于 AviSynth 的编辑器,但它也支持 VapourSynth。

它们都有各自的优点和缺点,但对于新手来说,我更推荐 VSEdit 进行本地编辑,而希望在服务器上也能够写脚本的用户,更推荐 Yuuno。这是因为 Jupyter 只需要少量配置就可以远程使用。建议 Yuuno 用户试试使用 Jupyter Lab 替代 Jupyter。

此处举例两者最大的差别:

VSEdit

  • 不需要保持浏览器开启
  • 内置基准和编码工具
  • 通过CTRL + SHIFT + 方向键轻松浏览视频
  • 更稳定
  • 几乎无需二次开发
  • 大多数PT用户在使用它,因此它可能更容易获得帮助与支持
  • VapourSynth 特有的语法高亮及输入建议
  • 允许你存储片段和模板

Yuuno

  • 非常易于远程使用
  • 可以通过 iPython magic 轻松导出
  • 更好的比较工具,通过使用%%vspreview clipa --diff clipb ⇒ 实现鼠标悬停即可预览更改效果
  • 程序不太成熟,因此更可能发生崩溃
  • 允许你在一个 Jupyter 编辑器中处理和导出多个脚本

压制工具

使用压制工具大部分核心都是x264和x265(x265如无必要不在重复)。本人推荐压制软件功能越为简单越好,推荐2个使用,适合新手的**Simple x264/x265 Launcher以及适合有经验的纯命令行(CLI)的x264.exex265.exe**。Simple下载安装即可使用,本教程将以此为基础进行讲解。工具需要简单的设置,推荐log文件保存等设置,根据个人习惯修改。

image-20200210024626480

大部分压制组要求,压制工具要求及时更新,使用最新版的压制工具。

压制步骤

1.压制源分析

要想做一个较为高质量作品,应采用最好的来源进行压制。HDR电影来源较为单一,4k的原盘和Remux资源为主,版本较少能选择不多。SDR目前可用压制版本较多,各个发行商的在不同时期也发行过不同蓝光版本,随着web的兴起,AZ和NF也都发布了较高码率的4k的sdr版本,所以在SDR压制时,需要对于来源进行对比,选取最为高质量的来源进行压制。对于蓝光原盘与remux两者相同时候,推荐使用Remux的更为方便。

对于原盘使用 BDInfo 检查原盘信息,查看原盘主要视频对应播放列表。对于复杂原盘,可能出现多版本混合的情况,需要确定所需要版本对应的MPLS,并确定原盘的主要码率 。在压制前推荐进行分离提取(Demux)后再进行压制。

BDInfo

2.分离提取(Demux)与音频转换

Demux&Remux以及Audio

3.输入脚本编写

压制前一般需要对片源就行处理,一般包括去除黑边、修复脏边脏线、去除片源的一些问题等,并且在压制时一般需要进行部分压制测试,也需使用脚本进行实现。本节将对介绍压制中的最基本脚本的编写,分为VS和AVS两个部分。编写脚本使用对应的编辑器较为方便。以及基础例子如下

1).AVS例子
FFVideoSource("J:\BluryBD\After.the.Storm.2016.BluRay.Remux.1080p.AVC.TrueHD.5.1-HiFi.mkv")
Crop(0, 20, -0, -22)
FillBorder(0,1,0,0)
bbmod(2,0,0,0,128,21)
Z_Spline36Resize(1280, 692,dither="error_diffusion")
2).VS例子
import vapoursynth as vs
#import kagefunc as kgf
import fvsfunc as fvf
import havsfunc as haf
import vsTAAmbk as taa
#import mvsfunc as mvf
#import muvsfunc as muf
#import nnedi3_resample as nnrs
#import nnedi3_rpow2 as nnrp
import awsmfunc as awf
#import vsscale
import vsutil
#导入相关函数(上面导入的很多范例脚本中没有使用,不过去交错那用到了haf),awsmfunc早期包没包含,故先注释掉
#core = vs.core 在R55 API4及之后版本使用,早期版本可以使用vs.get_core()
#core = vs.get_core()
core = vs.core
#请依据自己内存调整(单位MB)
core.max_cache_size = 27384

#加载片源输入即为16bit色深
src = core.lsmas.LWLibavSource(source=r"J:\BluryBD\After.the.Storm.2016.BluRay.Remux.1080p.AVC.TrueHD.5.1-HiFi.mkv",format="yuv420p16")


#另一种加载片源
#src = core.ffms2.Source(source=r'J:\BluryBD\After.the.Storm.2016.BluRay.Remux.1080p.AVC.TrueHD.5.1-HiFi.mkv')

#通常来说,有些比较特殊的片源可能在ffms2或lsmas下会有不正常的表现或者报错,故有时候需要更换使用

#处理前调整为16bit色深,可以降低运算带来的损失,lsmas不需要这个步骤
#src = fvf.Depth(src, 16)

#切边
src=core.std.Crop(src, left=0, right=0, top=20, bottom=20)

#脏边处理相关
#FillBorders基本是复制一条或几条线,作为填充,在任何情况下都不建议超过一条使用
#src = core.fb.FillBorders(src, 0, 1, 0, 0, mode="fillmargins")
#src = core.edgefixer.Continuity(src,left=4, right=4, top=0, bottom=0)
#src = awf.fb(src, top=1,bottom=1)
#如果边缘呈灰色,awf.fb 可以填充 luma&chroma
#src = awf.bbmod(src,left=3, right=6, top=10, bottom=4, thresh=30, blur=20)
#对于边缘本身不是正常画面的,可以接一下bbmode,但请注意,严禁乱用,具体参数请看Pro mit 翻译的AHD压制指南(Others里)

#AutoDeblock(请在指导下使用)
#src = fvf.AutoDeblock(src)

#将分辨率(压制为720p)
#src=core.resize.Spline36(src, 1280, 692)
#另一种缩小算法,gamma是HDR才需要开启
#src = muf.SSIM_downsample(src, 1280, 692, use_fmtc=False,gamma=True)
#src =vsscale.scale.ssim_downsample(src, width=None, height=720)
#
#去交错(正常不需要使用)
#src  = haf.QTGMC(src, Preset="slow", TFF=True)

#去锯齿
#src = taa.TAAmbk(src, aatype=-3, preaa=-1, strength=0, mtype=2, opencl=True)

#转为10bit再输出,x265一般压制为10bit,x264为8bit
#之前得降bit函数
#src = fvf.Depth(src, 10)

src = vsutil.depth(src, 10, dither_type='error_diffusion')
src.set_output()

Tips:

1.修复脏边脏线以及去色带等属于进阶部分,将单独介绍

VS由C++编写的核心库和允许创建视频脚本的Python模块组成,脚本部分作为Python模块实现,因此脚本完全使用Python语法

看这里以便于理解vpy写法以及含义

Python 文档https://docs.python.org/zh-cn/3.9/reference/index.html

VS文档http://www.vapoursynth.com/doc/pythonreference.html

其中最前面的

import vapoursynth as vs
import kagefunc as kgf
import fvsfunc as fvf
import havsfunc as haf
import vsTAAmbk as taa
import mvsfunc as mvf
import muvsfunc as muf
import nnedi3_resample as nnrs
import nnedi3_rpow2 as nnrp
#import awsmfunc as awf

就是 python 的 模块/modules导入/import

(1).片源载入

载入片源需要使用对应的解码器,ffm2(ffmpeg)是目前脚本广泛使用的解码器,支持格式较为广发,其第一次载入时需要进行全片的检索。

1).AVS语法
FFVideoSource(str filePath) #指定文件的路径
2).VS语法
src = core.ffms2.Source(str source) #指定文件的路径

Tips:

1.右键可以直接选择插入文件完整路径。

2.首次执行载入预览会卡死,需要等待一定时间。

(2).切除边缘

1).avs语法
Crop(clip, int left=0,int top=0,int -right=0,int -bottom=0) #切割必须为偶数,right与bottom为负数
2).VS语法
clip=core.std.Crop(clip, int left=0, int right=0, int top=0, int bottom=0) #切割必须为偶数

Tips:

1.Crop切割方式只能以偶数方式切割,奇数切割属于进阶内容

2.切割奇数边需要使用下节介绍的resize方法

(3).变换大小

$$ w $$

1).AVS语法
z_Spline36Resize(int Width, int height, int src_left=?, int src_top, int src_width, int src_height, str dither) #
2).VS语法
clip = core.resize.Spline36(clip clip, int Width, int height) #

(4).抽取测试

压制前使用脚本一般间断抽取共约5k~10K帧进行参数测试,需要在脚本进行抽取。

1).AVS语法
SelectRangeEvery(int every, int length, int offset) #every为间隔,length为长度,offset为启示帧数
2).VS语法
select=core.std.SelectEvery(clip[8000:-8000],cycle=4000, offsets=range(10))
clip= core.std.AssumeFPS(select, fpsnum=clip.fps.numerator, fpsden=clip.fps.denominator)

4.压制测试

在压制前应该进行参数测试,以便获取较高的压制质量,一般需要确定合理码率大小(crf)以及对于码率分配参数(ap-mode、ap-s、qcomp)以及psy等重要参数进行测试。使用抽取测试代码,大约抽取6k帧进行参数测试,送入Simple-x264进行测试。

(1).压制参数配置

使用Simple进行压制,其设置如下所示。在设置界面记得开始log自动保存!!!

image-20200220003824403

--level 4.1 --threads auto --vbv-bufsize 78125 --vbv-maxrate 62500 --colormatrix bt709 --colorprim bt709 --no-mbtree --no-dct-decimate --min-keyint 24 --me umh --merange 48 --deblock=-3,-3 --ipratio 1.3 --pbratio 1.2 --qcomp 0.6 --aq-mode 1 --aq-strength 0.8 --psy-rd 1.00:0.00

(2).CRF测试

CRF测试主要确定合适码率,根据压制目标,确定合理的码率。推荐测试起始CRF为17,根据范围码率以0.5步进进行CRF测试。

合理码率评判方式
1.追求体积

压制效果受码率影响很大,在追求体积时,很容易造成欠码的问题。所以要设置合理的码率范围,防止出现因为码率不足导致的质量问题。需要主要检查需要码率较高的场景,例如,复杂的场景和暗的场景。

主要辨别问题有:

  • 是否新产生了新的block
  • 复杂的场景的细节是否丢失
  • 是否压出明显的色带
2.保证与原盘相似透明度

前景无损失,背景没有明显损失

(3).其他参数

本部分十分建议进行,但是对于一些压制组不是强制要求。可以编写脚本进行批量测试

确定合理的码率后,切换2-pass方式使用预计码率,采用单一变量方式进行参数测试,每次测试只改变一个参数,每个参数推荐测试范围如下:

参数 真人类型 步进
qcomp

(4).最终CRF测试

在新参数下,进行最终使用的crf测试。

(5).压制对比脚本编写

1).avs语法
# 导入压制使用的脚本文件,并添加帧信息与名字
a=import("C:\Path\To\source.avs").subtitle("Source", align=9).ffinfo(framenum=true,frametype=true,cfrtime=false,vfrtime=false,version=false,cropping=false,colorrange=false,colorspace=false,sar=false) 
# 导入压制后的对比的视频文件
b=ffvideosource("C:\Path\To\b.mkv").subtitle("b", align=9).ffinfo(framenum=true,frametype=true,cfrtime=false,vfrtime=false,version=false,cropping=false,colorrange=false,colorspace=false,sar=false)
# 其他的压制文件
c=ffvideosource("C:\Path\To\c.mkv").subtitle("c", align=9).ffinfo(framenum=true,frametype=true,cfrtime=false,vfrtime=false,version=false,cropping=false,colorrange=false,colorspace=false,sar=false)
# 交错视频文件
interleave(a,b)
2).VS语法

下面的代码大部分已经不能在最新的VS里使用,仅作参考,请使用 awf 以及 Scrips 里的 snap

import vapoursynth as vs
core = vs.get_core()

# 生成帧信息,并打入标签
def FrameInfo(clip, title,
              style="sans-serif,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,0,7,10,10,10,1"):
    import functools
    def FrameProps(n, clip):
        clip = core.sub.Subtitle(clip, "Frame " + str(n) + " of " + str(
            clip.num_frames) + "\nPicture type: " + clip.get_frame(n).props._PictType.decode(), style=style)
        return clip

    clip = core.std.FrameEval(clip, functools.partial(FrameProps, clip=clip))
    clip = core.sub.Subtitle(clip, ['\n \n \n' + title], style=style)
    return clip

# VS editor输出显示bug,对于压制后的文件需要进行,进行处理。
def outfix(clip):
	encode = core.std.SetFrameProp(clip,prop="_Matrix",delete=True)
	encode = core.std.SetFrameProp(encode,prop="_Transfer",delete=True)
	encode = core.std.SetFrameProp(encode,prop="_Primaries",delete=True)
	return encode

#-------------用于压制脚本的滤镜部分(例子)----------------#
#复制自己脚本出了导入,和输出部分内容
video = core.ffms2.Source(source=r'/Users/hujingyu/Encode/Paris.Texas.1984.1080p.BluRay.Remux.AVC.DTS-HD.MA.5.1-PmP.mkv')
video=core.std.Crop(video,64,64, 0, 0)
select=core.std.SelectEvery(video[8000:-8000],cycle=4000, offsets=range(80))
video= core.std.AssumeFPS(select, fpsnum=video.fps.numerator, fpsden=video.fps.denominator)
#-------------用于压制脚本的滤镜部分----------------#
video=FrameInfo(video,"source")# 标记信息
#-------------encode文件-------------------------#
encode=core.ffms2.Source(source=r"/whalehu/Encode/encode.mkv") # 载入视频
encode=FrameInfo(encode,"encode") # 标记信息
encode=outfix(encode)# 输入修复

out = core.std.Interleave([video,encode]) # 交叉帧
out.set_output()

5.正式压制

将压制脚本中的测试抽帧代码注释掉,进行正式压制。

清晰度越高需要的时间越长,推荐使用较低的分辨率入门

6.封装

封装是将所有素材合成一个mkv的视频文件,封装是一个很简单的工作,没有技术难点,但是封装的好坏会对压制作品评价很为重要,封装主要是认真。这里主要介绍被广泛接受的封装细节,不同压制组对这个有具体的细节要求。

一般封装主要注意以及下内容:

  • 视频、音轨和字幕是否匹配

  • 音轨和字幕是否设置了正确的语言标签

  • 需要标准命名的音轨是否正确

  • 章节信息和标题是否添加并正确命名

  • 正确命名文件标题

文件标题并不是文件名!!!一般主要为IMDB的英文标题并可以添加小组信息

原盘若没有章节信息,推荐5-10min间隔生成章节点