页面

2012年2月1日

FEZ游戏视频后期处理(高清篇)

前言

前一篇文章的视频后期处理部分,我直接用MediaCoder来简单的压缩视频,仔细看了那三张对比图,会发现压缩后的视频相对于原始视频,质量上的损失还是挺严重的,用来收藏的话还是有点不能接受。于是我放弃使用MediaCoder,转而使用x264的命令行方式来压缩视频,于是便有了这篇文章。

注意事项

  1. 我是使用64bit系统和64bit x264编码器的,但Dxtory 1.0.71的视频解码器只有32bit版本,因此需要将Dxtory录制的原视频pipe给64bit的x264编码器,所以64bit需要额外使用『avs4x264』这个工具,使用32bit系统的请无视。
  2. 本篇文章的目的是把压制出来的成品视频用于收藏,所以在画质与体积大小之间偏向于前者,有机会的话我会介绍如何压制出体积小的成品视频,但不能保证完美,毕竟这不是我所需要的。

需要软件与运行环境

我是分别处理原始视频的视频流和音频流,视频流用x264_10bit.exe编码成 xxx.264 文件,音频流用flac.exe编码成 xxx.flac 文件,最后用MKV Muxer将这两个文件合成为 xxx.mkv 文件。

文章修订记录

  1. 2012-02-11 00:38:22
    • modify:修改x264命令行参数,去除 --qpmin 0--qpmax 40
    • modify:把 --psy-rd 参数的值从 1:0.20 改为 0.60:0.10。
    • fix:修改错字。
  2. 2012-02-13 17:09:38

视频流部分

制作AVS脚本

什么是AVS脚本我就不说了,详细的可以Google之。生成AVS脚本的方法挺简单的,可以用MeGUI的『AVS Script Creator』;也可以直接将下面一行的内容粘贴到新的txt文件里,然后将txt后缀名改为avs。选择自己喜欢的方法即可。

AVISource("E:\FEzero_Client 2011-12-31 14-33-04-050.avi", audio=false)
ConvertToYV12(matrix="PC.709")

把上面红色部分改为自己视频的位置。

下文假设把生成的AVS脚本命名为『input.avs』。


x264编码器参数

因为我比较倾向使用x264预设的preset和tune系统,而且FEZ视频动态画面比重非常高,在x264里属于动态预测分析类的参数有--partitions, --direct, --me, --merange, --subme, --trellis,有经验的可以自己调教。我就直接使用--preset slow--tune animation--crf 16,如果不在意压缩时间或者CPU高能的话,推荐用 --preset veryslow。以下是我个人使用参数:

32bit x264编码器参数

x264.exe --profile high10 --tune animation --preset slow --crf 16 --deblock -2:-2 --keyint 300 --min-keyint 1 --merange 32 --subme 9 --psy-rd 0.60:0.10 --partitions all --colorprim bt709 --transfer bt709 --colormatrix bt709 --threads 0 --output "output.264" "input.avs"

64bit x264编码器参数

avs4x264mod.exe --x264-binary "x264_64.exe" --profile high10 --tune animation --preset slow --crf 16 --deblock -2:-2 --keyint 300 --min-keyint 1 --merange 32 --subme 9 --psy-rd 0.60:0.10 --partitions all --colorprim bt709 --transfer bt709 --colormatrix bt709 --threads 0 --output "output.264" "input.avs"

说明一下上面的参数:

  • --profile high10
    使用 10bit 位深。
  • --deblock -2:-2
    设置循环去区块滤镜,偏向负值能更好地保留细节性的东西,偏向正值则能使视频画面显得更为干净和柔和。
  • --keyint 300 与 --min-keyint 1
    设置最大和最少IDR帧(亦称为关键帧)间隔,IDR的存在对视频跳转有极大帮助,但IDR不参考其他帧注定压缩率不高,过多的IDR就会影响视频的压缩率。
  • --qpmin 0 与 --qpmax 40
    设置可以使用的最小量化值和最大量化值。量化值越小,编码后的视频品质就越接近编码前;量化值越大,品质越低。
  • --merange 32
    设置动态搜索的最大范围(单位是像素)。在 --preset slow(--me umh) 时,增加 --merange 数值会大幅减慢编码速度。
  • --psy-rd 0.60:0.10
    第一个数是Psy-RD的强度,第二个数是Psy-Trellis的强度。这是一种心理视觉模型算法,能提升细节。
  • --partitions all
    启用所有的宏区块分割。
  • --colorprim bt709,--transfer bt709和--colormatrix bt709
    设置以ITU-R BT.709规则进行RGB色彩转换。
  • --threads 0
    设置x264的线程数,0为自动。
  • --x264-binary "x264_64.exe"
    此为avs4x264mod.exe的选项,用于指定使用哪个64bit的x264编码器,不指定的话默认使用同目录下的x264_64.exe。

如果按照上面的参数跑一遍时长25分钟的FEZ视频,我的CPU需时大概8小时,我都是晚上睡觉前开始跑,一个晚上基本完工。注意 --output "output.264" 参数,请使用264作为输出文件的后缀名

等待x264编码器压缩视频,压缩完成后会得到一个『output.264』文件。


音频流部分

从AVI文件提出音频流

提取音频流需要用到『AVIMux_GUI』软件,该软件在 MeGUI 目录的 tools\avimux_gui\ 下,运行后按照下图操作。


导出成功后,得到一个raw后缀的音频流文件,这里取名为『input.raw』。注意,这里导出是否为raw文件取决与你Dxtory上的设置,如果 Dxtory 里的 Audio Setting 的 Audio Codec 处选择的是 “None” ,导出的即为raw文件。


使用flac.exe压缩音频流

下面是我的flac压缩参数:

flac.exe -8 --sample-rate=48000 --bps=16 --channels=2 --sign=signed --endian=little --force-raw-format "input.raw" -o "output.flac"

说明一下上面的参数:

  • -8
    使用 level-8 进行压缩
  • --sample-rate=48000
    设置采样率
  • --bps=16
    设置位深
  • --channels=2
    设置声道
  • --sign=signed
    具体作用不明(必要参数)
  • --endian=little
    具体作用不明(必要参数)
  • --force-raw-format
    设置输入文件为raw格式

等待flac编码完成后,得到一个『output.flac』文件。


把视频流和音频流装进容器

到目前为止,一共生成了两个文件,一个是『output.264』,一个是『output.flac』。还需要将这两个文件装进容器里,我选择的是 MKV Muxer 容器,而且 MeGUI 里还自带有GUI工具,可以直接拿来用。

MKV Muxer

打开 MeGUI ,按下 Ctrl+4 快捷键打开 MKV Muxer,或者按下图操作。

分别导入『output.264』和『output.flac』,然后点 Queue 添加到队列中,回到 MeGUI ,点 Queue 选项卡,点 Start 开始处理。



最后得到一个『output-muxed.mkv』文件,这便是成品。如果x264和flac都按照上面的参数编码,一个时长25分钟的FEZ原始视频能压缩到3GB左右,而且成品视频的画质已经非常接近原始视频,可以参考下面的对比图。


原始视频与压缩后视频对比图

图一


使用crf16参数压缩的视频截图(png格式


原始视频截图(png格式

图二


使用crf16参数压缩的视频截图(png格式


原始视频截图(png格式

图三


使用crf16参数压缩的视频截图(png格式


原始视频截图(png格式

题外:x264编码器进程优先级的问题

图形界面的MeGUI和MediaCoder都能设置x264编码器的进程优先级,但如果使用的是x264命令行方式的话,需要用到『Windows命令提示符』的 start 命令来预先设置x264以什么优先级运行,命令格式如下:

C:\>start "title" /b /wait /low x264.exe -o "output.264" "input.avs"

其中红字部分可以是以下参数

  • /low:低(最低优先级)
  • /belownormal:低于标准
  • /normal:普通(默认优先级)
  • /abovenormal:高于标准
  • /high:高
  • /realtime:实时(最高优先级,谨慎使用)

本系列相关文章


全文完

没有评论:

发表评论