前言
前一篇文章的视频后期处理部分,我直接用MediaCoder来简单的压缩视频,仔细看了那三张对比图,会发现压缩后的视频相对于原始视频,质量上的损失还是挺严重的,用来收藏的话还是有点不能接受。于是我放弃使用MediaCoder,转而使用x264的命令行方式来压缩视频,于是便有了这篇文章。
注意事项
- 我是使用64bit系统和64bit x264编码器的,但Dxtory 1.0.71的视频解码器只有32bit版本,因此需要将Dxtory录制的原视频pipe给64bit的x264编码器,所以64bit需要额外使用『avs4x264』这个工具,使用32bit系统的请无视。
- 本篇文章的目的是把压制出来的成品视频用于收藏,所以在画质与体积大小之间偏向于前者,有机会的话我会介绍如何压制出体积小的成品视频,但不能保证完美,毕竟这不是我所需要的。
需要软件与运行环境
- CPU:Intel Core2 Duo CPU E8400 @ 3.0GHz
- RAM:8GB DDR2 800
- Windows 7 64bit
- x264_10bit.exe(我使用06_taro的编译版)
- flac.exe
- Avisynth 2.6.0 32bit
- MKV Muxer(我使用MeGUI来实现)
- AVIMux_GUI(MeGUI自带)
- avs4x264.exe(我使用06_taro的修改版)
我是分别处理原始视频的视频流和音频流,视频流用x264_10bit.exe编码成 xxx.264 文件,音频流用flac.exe编码成 xxx.flac 文件,最后用MKV Muxer将这两个文件合成为 xxx.mkv 文件。
文章修订记录
- 2012-02-11 00:38:22
- modify:修改x264命令行参数,去除 --qpmin 0 和 --qpmax 40。
- modify:把 --psy-rd 参数的值从 1:0.20 改为 0.60:0.10。
- fix:修改错字。
- 2012-02-13 17:09:38
- note:本文内的所有命令行参数,都不在进行更新,需要新版参数的请围观《我自己使用的FEZ游戏视频压制脚本》。
视频流部分
制作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左右,而且成品视频的画质已经非常接近原始视频,可以参考下面的对比图。
原始视频与压缩后视频对比图
图一
图二
图三
题外: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:实时(最高优先级,谨慎使用)
本系列相关文章
全文完
没有评论:
发表评论