页面

2012年2月9日

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

前言

在《FEZ游戏视频后期处理(高清篇)》里,介绍了如何使用x264压制出高清晰度的FEZ视频,但这是以牺牲视频体积为代价的,一个25分钟视频起码有3GB以上的大小,仍然不适合分享,特别是要分享到视频网站的。所以本文将介绍如何压制出体积小、画质也不至于太差的FEZ游戏视频

本文介绍的压制方法仍然是以x264的命令行方式为主,并且是把成品视频用于上传到YouTube共享,而且达到720p的清晰度(国内的优酷、土豆之类的估计也和YouTube差不多)。

YouTube推荐的分辨率和比特率
类型 分辨率 视频比特率 立体声音频比特率
1080p 1920x1080 8000 kbps 384 kbps
720p 1280x720 5000 kbps 384 kbps
480p 854x480 2500 kbps 128 kbps
360p 640x360 1000 kbps 128 kbps
(数据来源)

在浏览本文章前,请先围观上一篇《FEZ游戏视频后期处理(高清篇)》,不然会不知道我在说啥的。 罒ω罒


文章修订记录

  1. 2012-02-11 00:23:15
    • modify:修改x264命令行参数,去除 --qpmin 0--qpmax 40
    • fix:修改错字。
  2. 2012-02-13 17:20:12

视频流部分

生成AVS脚本文件

将下面的内容粘贴到一个新的txt文件里,然后将txt后缀名改为avs。注意红字部分要替换成相应的视频文件。

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

因为我使用Dxtory录制出来的FEZ游戏视频都是1440x900分辨率,属于标准的16:10画面,但YouTube上720p的视频分辨率是1280x720(16:9画面),所以这里我把1440x900的视频分辨率resize成接近YouTube 720p标准的1280x800(上面蓝色那句)。这里假设把生成的AVS脚本命名为『input.avs』。


x264编码器参数

既然是以高压为目的的,所以推荐使用 --preset veryslow,在其他参数相同的情况下,--preset veryslow 比 --preset slow 压制出来的视频体积上要小。

64bit x264编码器参数

avs4x264mod.exe --x264-binary "x264_64.exe" --profile high --tune animation --preset veryslow --bitrate 5000 --ref 3 --bframes 2 --rc-lookahead 250 --qcomp 0.5 --keyint 10 --min-keyint 1 --scenecut 60 --merange 32 --psy-rd 0.30:0.10 --colorprim bt709 --transfer bt709 --colormatrix bt709 --threads 0 --output "output.264" "input.avs"

说明一下上面的参数:

  • --ref 3
    设置可以使用多少帧作为参考帧(reference frames)。该值越大,压缩率越高,但压制速度损失很明显,而且对视频解压的要求也高。
  • --bframes 2
    设置在I帧和P帧之间最大并行B帧数。一般可以提高压缩率。YouTube要求为2。
  • --rc-lookahead 250
    设置mb-tree可用帧的数量。这里配合下面的--qcomp 0.5直接取最大值250。
  • --qcomp 0.5
    该值越小越能让mb-tree发挥更大作用。
  • --keyint 10
    YouTube要求值为帧速率的一半。
  • --scenecut 60
    设置额外插入IDR帧的参数。该值越大,会增加侦测到场景变更的数目。

注意:--rc-lookahead 250 参数需要消耗不少的内存,而32bit系统有每个进程2GB内存的限制,因此需要使用64bit系统和64bit的x264编码器,而且坊间一直流传64bit的x264编码器比32bit的快10%。


x264编码器超出内存上限提示


64bit系统则没有每线程2GB内存限制

等待x264编码器压缩完成后会得到一个『output.264』文件。一个时长25分钟的FEZ视频大小有800MB左右。


音频流部分

由于YouTube推荐的音频流编码为 AAC-LC,所以音频流的处理将使用 neroAacEnc.exe 编码并把比特率设为 384 kbps。

生成WavPack文件

由于 neroAacEnc.exe 只接受 WavPack 输入文件,所以需要先把导出的 Raw PCM 文件转换成 WavPack 格式,我使用 sox 这个工具。

sox.exe -e signed -r 48000 -b 16 -c 2 "input.raw" "wavpack.wav"

说明一下上面的参数:

  • -r 48000
    设置raw输入文件的采样率。
  • -b 16
    设置raw输入文件的位深。
  • -c 2
    设置raw输入文件的声道数量。
  • input.raw
    从Dxtory录制视频分离出来的 Raw PCM 音频文件。sox.exe的输入文件。
  • wavpack.wav
    生成的 WavPack 格式临时文件。sox.exe的输出文件。

这时得到一个『wavpack.wav』的WavPack文件。


生成AAC LC文件

把上一步得到的『wavpack.wav』文件作为 neroAacEnc.exe 编码器的输入文件。

neroAacEnc.exe -cbr 384000 -ignorelength -if "wavpack.wav" -of "output.m4a"

说明一下上面的参数:

  • -cbr 384000
    设置码率为CBR 384 kbps。
  • -if "wavpack.wav"
    上一步中生成的 WavPack 临时文件。neroAacEnc.exe的输入文件。
  • -of "output.m4a"
    生成的 AAC LC 音频文件。neroAacEnc.exe的输出文件。

得到一个『output.m4a』文件,这时可以把上一步生成的『wavpack.wav』文件删除了。

然后还需要把视频流和音频流放到容器里,这里推荐使用 MP4 Muxer,这也是YouTube推荐的容器格式。操作方面和上一篇文章提到的 MKV Muxer 基本一样,这里就不重复说明了。最后把成品视频『output.mp4』丢上YouTube即可。


YouTube上的视频

呃,围观就好了,请不要VIP我。 ≧﹏≦


本系列相关文章


(全文完)

没有评论:

发表评论