【教程】使用VapourSynth+ffmpeg将HLG视频压制为SDR
本文首发于:https://github.com/nilaoda/Blog/issues/16

前言
鉴于目前HLG
视频越来越多,本教程旨在帮助小白从零开始学会将HLG
视频压制为普通的SDR
视频并完成色彩转换
使用VapourSynth
的好处是更加强大,可以做更多的事情
下载资源
下载ffmpeg
https://ffmpeg.zeranoe.com/builds/
解压后将bin
目录下的ffmpeg.exe
拿出来即可
下载VapourSynth
https://github.com/vapoursynth/vapoursynth/releases

下载VapourSynth Editor
https://bitbucket.org/mystery_keeper/vapoursynth-editor/downloads/
下载L-SMASH-Works
https://www.dropbox.com/sh/3i81ttxf028m1eh/AAABkQn4Y5w1k-toVhYLasmwa?dl=0&lst=

下载vapoursynth-tonemap
https://github.com/ifb/vapoursynth-tonemap/releases

下载Python便携版
https://www.python.org/ftp/python/3.7.6/python-3.7.6-embed-amd64.zip

开始
资源下载完毕后,解压VapourSynth64-Portable-R48.7z、python-3.7.6-embed-amd64.zip、VapourSynthEditor-r19-64bit
将python-3.7.6-embed-amd64、VapourSynthEditor-r19-64bit中的所有内容移动到VapourSynth64-Portable-R48文件夹中:

此文件夹下,在地址栏输入cmd并回车:

测试环境
在cmd下,输入python.exe进入交互模式,并输入:

配置插件
解压L-SMASH-Works-r929-20170224-64bit.7z,将其中的\VapourSynth\vslsmashsource.dll复制到VapourSynth64-Portable-R48\vapoursynth64\plugins

测试
打开vsedit.exe,输入如下代码,加载我们的视频文件,按下F6检测脚本(需要等待其制作索引文件):
import vapoursynth as vs
core = vs.get_core()
src = core.lsmas.LWLibavSource(source=r"E:\星月神话_1080pHLG10.mp4")
src.set_output()
下方变绿说明没有问题:

按下F5可以预览视频:

显示色彩是欠饱和的,接下来就想办法给他转换到SDR

转换
配置插件
解压下载好的tonemap-r2-win64.7z,解压后的tonemap.dll复制到VapourSynth64-Portable-R48\vapoursynth64\plugins

修改脚本
方案1:
import vapoursynth as vs
core = vs.get_core()
src = core.lsmas.LWLibavSource(source=r"E:\星月神话_1080pHLG10.mp4")
#参数需要根据不同视频进行微调,不能做到普适
src = core.resize.Lanczos(clip=src, format=vs.RGBS, width=None, height=None,matrix_in_s="2020ncl",transfer_in_s="std-b67", transfer_s="linear",nominal_luminance=1000)
src = core.tonemap.Mobius(src, exposure=6, transition=0.2, peak=300)
src = core.resize.Lanczos(clip=src, format=vs.YUV420P10, matrix_s="709",primaries_in_s="2020", primaries_s="709",transfer_in_s="linear", transfer_s="709")
src.set_output()
F5预览效果:

方案2:
import vapoursynth as vs
core = vs.get_core()
src = core.lsmas.LWLibavSource(source=r"E:\星月神话_1080pHLG10.mp4")
#参数需要根据不同视频进行微调,不能做到普适
src = core.resize.Lanczos(clip=src, format=vs.RGBS, width=None, height=None,matrix_in_s="2020ncl",transfer_in_s="std-b67", transfer_s="linear",nominal_luminance=1200)
src = core.tonemap.Hable(src, exposure=9, a=0.22, b=0.3, c=0.1, d=0.2, e=0.01, f=0.3, w=11.5)
src = core.resize.Lanczos(clip=src, format=vs.YUV420P10, matrix_s="709",primaries_in_s="2020", primaries_s="709",transfer_in_s="linear", transfer_s="709")
src.set_output()
F5预览效果:

方案3:
import vapoursynth as vs
core = vs.get_core()
src = core.lsmas.LWLibavSource(source=r"E:\星月神话_1080pHLG10.mp4")
#参数需要根据不同视频进行微调,不能做到普适
src = core.resize.Lanczos(clip=src, format=vs.RGBS, width=None, height=None,matrix_in_s="2020ncl",transfer_in_s="std-b67", transfer_s="linear",nominal_luminance=1200)
src = core.tonemap.Reinhard(src, exposure=2.7, contrast=0.5, peak=1.0)
src = core.resize.Lanczos(clip=src, format=vs.YUV420P10, matrix_s="709",primaries_in_s="2020", primaries_s="709",transfer_in_s="linear", transfer_s="709")
src.set_output()
F5预览效果:


压制
将脚本保存好(此为为test.vpy),就可以开始压制了。我新建了Encode文件夹,方便整理。
通过VSPipe.exe喂给ffmpeg压制:
..\VSPipe.exe --y4m "test.vpy" - | "ffmpeg" -y -i - -color_range pc -pix_fmt yuv420p test.mp4
参数什么的自己设置吧


打包分享 开箱即用
(自行修改为zip后缀解压)
下载地址:http://pan.iqiyi.com/ext/paopao/?token=eJxjYGBgmBQtsZUBBNZ9qgMAFooD2Q.zip