Featured image of post x264 高清压制指南

x264 高清压制指南

指南原文来自:https://tehconnection.eu/forums.php?action=viewthread&threadid=3251。

已知问题:

  • 本文的 AnyDVD HD 链接不可用,破解版请自寻。

所需环境

  • 多核处理器
  • 约 100 GB 的空闲硬盘空间
  • Windows 64 位操作系统
  • Microsoft Visual C 2010 Redistributable Package 的 x86 和 x64 版本
  • .NET Framework 3.5 或更新版本(Windows 7 已内含)

所需软件

  • eac3to:为 eac3to 制作的图形界面有好几个,我建议不要使用它们——坚持命令行好榜样。相关 wiki 在此。
  • dtsdecoderdll.dll:解压并移入 eac3to 的安装目录。
  • Haali Media Splitter:在 eac3to 更新到可与 LAV Splitter 共事之前,它是必需的。在安装 Haali 时取消所有选项的勾选。假设你在回放时采用的分离器不是 Haali,你得将之阻挡在外部滤镜列表之外,因为它会想要强制让你使用它。
  • DTS-HD Master Audio Suite:下载并将文件扩展名重命名为 .zip 然后将内容解压到某处。
  • oggenc2:下载 aoTuV 版本,因为它提供更优的音频质量,尤其是在低比特率下。解压 oggenc2.exe 并移入 eac3to 的安装目录下。
  • AviSynth:所有的 32 位 AviSynth 插件都应放入 %programfiles%\AviSynth\plugins 文件夹。
  • 64-bit AviSynth 及任何必须的 插件:它们仅会用于去隔行、detelecining (IVTC) 或是部分视频的清洁。
  • AvsPmod
  • ffmpegsource:下载简单标着 FFmpegSource 2.xx 的那个。解压 ffms2.dll 和 FFMS2.avsi 并移入 %programfiles%\AviSynth\plugins
  • DGMPGDec:安装完成之后,从安装目录中复制 DGDecode.dll 到 %programfiles%\AviSynth\plugins。然后打开 DGIndex.exe,前往「Video」→「iDCT Algorithm」勾选「IEEE-1180 Reference」,然后关闭程序。
  • TIVTC:只有电视转播源需要它,解压 TIVTC.dll 并移入 %programfiles%\AviSynth\plugins
  • x264:下载其最新的 32 位及 64 位版本。解压 64 位的压缩包并将 x264.exe 重命名为 x264_x64.exe。
  • Simple x264 Launcher:滚动到网页底部找到它的最新版本。在安装时将路径更改到 Program Files\x264。将此处的两个 x264 可执行文件替换成上一条中你刚下载的那俩。
  • SupRip
  • Chapter Grabber:eac3to 也能提取章节信息,但 ChapterGrabber 能够同时搜索各章节的章节名。
  • MKVToolNix
  • AnyDVD HD:到目前为止,这是将蓝光/HD-DVD 碟复制到你硬盘中的推荐软件。在教程中我没有提到任何关于它使用方法的内容,因为我觉得这玩意儿太简单以至于任何人都能自学成才。下载文件,然后重命名文件扩展名为 .zip,然后将其中的内容解压到某处。

详细步骤

准备视频源

在开始劳动之前,你得在硬盘中准备好你用于压制的源文件,无论是自己抓还是从网上下。首先,通过复制粘贴的方法导航到源文件的目录并找到电影本体。如果你的源是蓝光,就在 BDMV/STREAM 文件夹中找到最大的那个 .m2ts 文件:

为使下一步更容易进行,复制或移动该文件至 eac3to 的安装目录下。如果你懒得挪窝,则可以指定不同的源文件目录,但请注意,eac3to 并不能从带空格的文件名或目录名中读取,除非用引号包裹起来。

使用 eac3to 解流

前往 eac3to 的安装文件夹,并在其中启动一个命令提示符。如果你只打算使用最优质的音频流(DTS-MA、TrueHD、LPCM),就使用如下命令:

1
eac3to source.m2ts demuxed.mkv

举个例子,下面是使用上述方法完成解流的截图:

如果你的视频源带有 DTS-MA 音频流,且你需要从中提取约 1.5 MB/s 的 DTS 内核,就使用如下命令:

1
eac3to source.m2ts -demux

然后,找到你的 DTS-MA 音频文件,然后再次使用 eac3to 从 .dtsma 流中提取内核 .dts 文件。

1
eac3to input.dtsma output.dts -core

如果你的视频源是 MPEG-2,就删除 eac3to 制成的 .mkv 文件。打开 DGIndex 并拖入你的源文件。前往「Stream」→「Detect PIDs: PAT/PMT」然后确认相应的音视频流。然后选择「File」→「Save Project」。DGIndex 会为视频源制作索引,并将这些信息存入一个 .d2v 文件:

这一步需要几分钟时间。完成之后也不要删掉源文件。

使用 DTS-HD Master Audio Suite Encoder 转码音频

如果你的视频源含有 LPCM、FLAC 或 TrueHD 音频,你可以将它们转码为一个 1509 kbps 的 .dts 流,而不是使用较低质量的 640 kbps 的 ac3 文件。

如果你的视频源含有 DTS-MA 音频,你可以创建相同的 1509 kbps .dts 文件。eac3to 的 -core 方法使用 ArcSoft 的 DTS 解码器从 DTS-MA 流中剥离 .dts 内核,而 DTS HD Encoder Suite 使用 DTS 的官方音频编码器完成这一任务。两种方法生成的 .dts 文件之间的差异再多也多不到哪儿去。我更倾向于 DTS HD Encoder Suite 大法;因为它使用的是官方编码器,而且这个程序无论音频源是不是 DTS-HD 都能正常使用。

使用 eac3to 将你的音频源转换成单独的 .wav 文件:

1
eac3to source.thd/.dtsma/.flac/etc output.wavs

所得结果会是一组 .wav 文件,每个文件对应你音频源中的一个声道。将这些 .wav 文件如下图放入编码组件:

注意 Dialog Normalization 区域应设置为 -31 dBFS (No Attenuation)。这意味着它不会应用 dialog 标准化。还要注意编码器应设置为输出一个 .cpt 文件。在编码进程结束后,将文件扩展名更改为 .dts。

将评论音轨转码到 Ogg

首先,用 eac3to 将评论音轨转换成 .wav 文件。如果评论音轨拥有不止两个声道,就在下方的示例代码的尾部添加 -down2 -mixlfe

1
eac3to commentary.ac3 commentary.wav

然后另开一个命令提示符,使用 oggenc2 将上述的 .wav 文件转码成一个 .ogg 音频流:

1
oggenc2 commentary.wav -q 1.0 -o commentary.ogg

提取章节标记

打开 ChapterGrabber 然后选择「File」→「Open File」。定位到你的源碟片并找到 PLAYLIST 文件夹。第一个 .mpls 文件通常带有电影的章节信息。一旦你找到了正确的 .mpls 文件且章节时间编码出现在 ChapterGrabber 中,便为其填写电影名并点击搜索按钮来查找章节名。最终结果应该如下图所示:

将结果保存为 .xml 文件。

注:这个搜索引擎似乎必须要挂上梯子才能正常联络数据库,否则就会导致软件卡死、自动退出。

准备好视频

启动 AvsPmod,将 eac3to 为你创建的 .mkv 拖入一个新的标签页。一行以 DirectShowSource 为内容的代码就会出现。将 DirectShowSource 改为 ffvideosource,然后按下「F5」以刷新。此时,AvsPmod 看起来就像是卡住了一样。这很正常——ffvideosource 正在为视频创建索引以便正确显示它。这个步骤会花去你几分钟的时间。

如果你的视频源是 MPEG-2,就将你使用 DGIndex 制作的 .dga 文件拖入 AvsPmod。

点击「Video」→「Crop Editor…」,在为视频裁边时:

  • 移除上下左右的所有黑边。
  • 确保垂直和水平方向的分辨率为偶数。
  • 为了满足上面两条要求,即使裁入电影画面本体也在所不惜。 如果你需要调整视频源的大小,务必记住以下内容:
  • 1080p 不能大于 1920×1080
  • 720p 不能大于 1280×720
  • 480p(标清)不能大于 854×480
  • 出于兼容性原因,Xvid 分辨率不应大于 720×404 调整大小的目标是使宽度(对应宽屏电影)或高度(对应全屏电影)最大化以达到所需的分辨率,同时尽可能保持长宽比与源相近。计算公式很简单:
1
2
3
  裁边后的宽度       调整大小后的宽度
-------------- = -----------------
  裁边后的高度       调整大小后的高度

左边的两个值是已知的,你只需要计算右边分式中的分子或分母。

例:在裁边后,一个蓝光源的分辨率是 1920×816。我想要将它调整为一个 720p 的压制。由于视频是宽屏的,我想要最大化宽度到 1280,需要计算的就是高度了。通过这些已知条件,由公式

1
2
3
 1920      1280
------- = -------
  816        X

可得宽度为 544,我会在 AvsPmod 的裁边设置下另起一行添加 Spline36Resize(1280,544)。请注意,即使初始宽度少于 1920,我仍会将宽度调整到 1280。如果我需要调整到 480p,那么分辨率就应该是 854×362。对于全屏电影,高度就是最大值,你要计算的,就是正确的宽度了。

测试编码,第一步

在你 AvsPmod 的尾部加一行 SelectRangeEvery(20000,500,10000)。SelectRangeEvery 会让 x264 只编码特定的帧。在这个例子中,x264 会编码从第 10000 帧开始的每 20000 帧中的前 500 帧。这些数字可根据需求修改。这样做的目的是让 x264 从你的视频源中编码 1000 到 5000 帧来测试不同的 x264 参数。最初的 10000 帧由于通常是包含各种鸣谢的开头——黑底白字——因而在帮助我们选择怎样的参数这件事情上没啥用处,所以将之跳过。

所以你的脚本看起来应该接近下例:

1
2
3
ffvideosource("C:\Users\Root\Documents\FEAR_AND_LOATHING_IN_LAS_VEGAS\00010.mkv")
Crop(0, 132, -0, -132)
SelectRangeEvery(20000,500,10000)

保存脚本,关闭 AvsPmod。

额外的滤镜

缺。

x264 设置

启动 x264 Launcher:

确保 Mode 设为 CRF,Preset 设为 Placebo,Tuning 设为 None,Profile 设为 High。你输入的文件应当是你刚刚创建好的 .avs 测试脚本。

教程内不会涵盖每个 x264 参数有何用处,只会提及与教程相关的一部分。话虽如此:

1
--ref 5 --direct auto --bframes 16 --b-adapt 2 --b-pyramid normal --no-fast-pskip --psy-rd 1.0:0.0 --deblock -3:-3 --subme 11 --trellis 2 --me umh --merange 64 --aq-mode 2 --rc-lookahead 60 --analyse all --thread-input --vf crop:0,132,0,132/resize:1280,544,0:0,method=spline
  • –crf:对你的压制最终质量和大小最为重要的影响因素。从 15.0 开始逐渐增加直到画面质量开始下降。试着在不损失画面质量的情况下以最小分度值(0.1)为单位达到最适值。
  • –ref:套公式 8388608 / (裁剪后的宽度 × 裁剪后的高度),然后对结果向取整,它就是你应使用的 –-ref 值。超过该值的 ref 会导致在大多数独立播放设备上不兼容的问题,即使是能够调用 CPU 为所有视频进行解码的硬件加速(DXVA)播放设备也是如此。千万别设过头。对于 480p 的编码,设到 16 也毫无问题。
  • –bframes:允许 x264 更多的 B 帧数量并不意味着它一定能让它们都派上用场,但这肯定会导致编码时间延长。x264 极少能利用多于 8 个 B 帧。不过,你可以在测试编码期间将它增至 16 来获取大概的参照信息,关于整个编码实际能利用多少 B 帧。无论是 x264 日志还是程序日志都会展示 B 帧的分配信息。虽然测试编码所产生的百分比和整部电影近似,但出于编写指南的目的,我决定使用 16 个 B 帧编码整部电影。x264 [info]: consecutive B-frames: 0.5% 1.1% 3.6% 24.0% 14.4% 43.3% 4.0% 3.4% 1.1% 1.4% 0.5% 0.9% 0.3% 0.3% 0.2% 0.9% 0.1%。此处列出了 17 个值。每个值对应一个特定的 B 帧数字,从 0 到 16。每个值表示能够利用该数目的连续 B 帧占总帧数的百分比。我通常会从这些数字里选取所有大于 1.0% 的 B 帧值中最大者。在本例中,我使用了 --bframes 9
  • –vf:允许你在不使用 AviSynth 脚本的情况下裁剪和/或为视频源调整尺寸。**不要在测试编码中使用这部分参数,到完整编码时再让它上场。**对于整部电影的编码,你得从 .avs 测试脚本复制任何有关裁剪和调整尺寸的数值到这个参数里来。裁剪应总是在调整尺寸之前。下面展示使用方法:--vf crop:{left},{top},{right},{bottom}/resize:{width},{height},0:0,method=spline。任何不在上述示例中提及的内容应保持不变。/ 是用来分开裁剪和调整尺寸的滤镜的。如果你不需要为视频源调整尺寸,就把 / 及其之后的内容全都扔掉。
  • –psy-rd:对于电脑三维动画可低至 0.9:0.0,动画片(卡通)可比这个值还要低得多。以 artifacts 编码的卡通意味着其 psy-rd 应更低。绝对不要变更「:」右边的数字,也绝对不要在编码真人视频时使用 1.0:0.0 以外的值。
  • –deblock:第一个数字是去区块滤镜的强度,第二个数字则是一个阈值,它决定某个部分是区块,还是需要被保留的细节。对于大多数高清源,这个值定在 -3,-3 即可。
  • –aq-mode:在 2 到 0 之间调试此值可能有助于卡通、动漫和三维动画源的压制。
  • –trellis:在 2 到 0 之间调试此值可能有助于卡通、动漫和三维动画源的压制。
  • –no-dct-decimate:添加此参数有助于改善极为锐利/充满细节的视频源。仅适用于三维动画和细节丰富的动漫
  • –no-weightb:可帮助你的压制保留多一点儿的细节。仅适用于三维动画

任何未在上文中提及的设置,应与示例参数保持一致。

测试编码,第二步

在这一步,你需要将已经确定好的命令行参数粘贴到软件底部的输入框。请确认你已经设置了输出目录和文件名。然后点击「Start!」按钮,等待测试编码的完成。

启动 AvsPmod,另开一个标签页,输入以下脚本:

1
2
3
4
a=import("C:\Users\Root\Documents\loathing_test.avs")
b=ffvideosource("C:\Users\Root\Documents\test_001.mkv")
interleave(a,b)
ffinfo(cfrtime=false, vfrtime=false)

确保你将路径改到你自己的视频源和压制上。第一行是视频源,第二行是压制。最后一行会在屏幕截图的左上角添加黄色的文本,显示当前帧和总帧数以及帧类型。如果你做了不止一次测试编码,你绝对应当在脚本中以如下方式添加更多行:

1
2
3
4
5
6
a=import("C:\Users\Root\Documents\loathing_test.avs")
b=ffvideosource("C:\Users\Root\Documents\test_001.mkv")
c=ffvideosource("C:\Users\Root\Documents\test_002.mkv")
d=ffvideosource("C:\Users\Root\Documents\test_003.mkv")
interleave(a,b,c,d)
ffinfo(cfrtime=false, vfrtime=false)

使用左右方向键在帧之间来回切换。如果你正在将单个编码和视频源作比较,则视频源占据偶数帧,编码占据奇数帧。如果你正在比较多个编码,请密切注意帧的过渡;变化的压缩在应用于同一帧和完全不同的帧之间具有明显的差别。试着在此处忽略 I 帧,因为它们对于质量保持的评判而言是最不可靠的。而在决定哪一个编码参数应作出调整时,不要死盯着两个相同的帧瞧。记住,我们的目标是保留尽可能多的可察觉质量,而非事无巨细地从视频源照搬照抄。

做个不靠谱的假设,你的视频源是一部真人电影,则你唯二需要广泛测试的参数是 crfaq-strength。在第一次测试编码完成之后,你应知道它需要多少 B 帧,–vf 设置可以在你的测试 .avs 脚本里找到,只要你知道目标分辨率,–ref 也就知道了。

编码整部电影

最终你会找到一系列理想的参数可供使用。关闭 AvsPmod,将参数粘贴到图形界面的底部输入框。将输入文件改成 eac3to 早期创建的 .mkv 文件。同时输出文件名也要跟着改变。点击「Start!」按钮:

……然后找些别的事来做。

创建字幕

Suprip,启动!点击「Open…」,然后打开你的 .sup 字幕文件。点击切换到「SRT」标签页下面的选项,确定只有「Convert double, to」和「Replace high, with」被勾选。

现在,返回到「Image」标签页。摁下「Ctrl + O」快捷键,SupRip 会向你展示第一个它无法识别(OCR)的字符,在「OK」按钮旁的输入框中输入它(们)。摁下「Enter」键,然后再次「Ctrl + O」以显示下一个 SupRip 无法识别的字符。如此反复直到将整个字幕都跑完,有个好消息,那就是随着你处理的 .sup 文件越来越多,SupRip 也就能够凭借一己之力识别越来越多的字符了。同时记得确保让「Italic」选项派上用场,你要注意 SupRip 会对整行文字应用斜体效果,即使部分字符不应倾斜。你得在另一个程序中手动修复这个问题。

搞定之后,切换到「SRT」标签页并保存你的 .srt 文件。关闭 SupRip,在 Notepad 中打开你的 .srt 文件。复制其中所有文本并粘贴到一个带有拼写和语法检查功能的文本处理程序中。

有许多可以且应该被忽略的「错误」——注意,.srt 文件并不遵循一般文本书写的格式。然而,还是有一些需要找出来的与 OCR 相关的常见错误:

  • 大写的 I 被小写的 l 取代,反之亦然。这通常发生在包含字母 I 的缩略语、单独存在的字母 I、同时包含字母 I 和 L 的缩略语、任何连着两个 L 等情况下
  • 将 Is 识别成 ls,It 识别成 lt
  • 标点符号前后的冗余空格
  • 数字前后的冗余空格,尤其是数字 1
  • 冗余的引号,即将 " 识别成 “"(你不应使用直引号 “,而是应当使用成对的弯引号「」)
  • 之前提到过的斜体问题。拼写/语法检查并不能修正这个;你需要手动移除它们的斜体标记
  • 在处理非罗马字母(A、B、C、D……)的语言时,你还会遭遇各种稀奇古怪的问题。 一旦你完成了对字幕的一切必要修正,将所有文本复制粘贴回 Notepad 并保存。

混流所有的半成品

启动 MKVToolNix。将所有必要的文件——你编码好的视频、主要的音轨、评论音轨以及字幕——拖入「输入文件」区域。

  • 每一轨都应正确设置语言。
  • 评论音轨和听障辅助字幕轨应恰当命名。
  • 如果你的编码中含有评论音轨,请确保主音轨的「“默认轨道”标记」值为「是」。
  • 除非电影的语言不是英文,否则所有字幕轨的「“默认轨道”标记」值都应为「否」。 为输出文件命名,然后点击「开始混流」。混流进程需要几分钟。等它跑完,前往「章节编辑器」→「打开 Matroska/WebM/章节文件」:

最后,点击「章节编辑器」→「保存到 Matroska 或 WebM 文件」,将章节信息存入你刚混流好的 .mkv 文件。

Written by ZexWoo. All rights reserved.
主题 StackJimmy 设计 | 使用 Hugo 搭建