返回列表 发布新帖

[家庭影院/碟机] x264压制向导

3530 0
发表于 2010-1-16 11:04:14 | 查看全部 阅读模式

来吧兄弟,一起玩一起讨论!

您需要 登录 才可以下载或查看,没有账号?注册

×
采用x264程序进行视频压制,包括要想把视频压制好不是什么高科技,此向导旨在向大家推广x264的使用,让每个人都能压制出高品质的Encode。
本向导的目的:普及x264
x264压制向导

1,需要的软件


GraphStudio...................Link
Eac3to..........................: Link
x264.............................: Link
AVSP............................: Link
AviSynth........................: Link
MeGUI...........................: Link
Haali..............................: Link
FFDShow.......................: Link
SurCode DTS.................: Link
Arcsoft DTS DLLs............: Link
Arcsoft Total media.........: Link
MKVtoolnix.....................: Link
Sonic HDDVD Decoder 4.2: Link

对于HD DVD,你也可以使用此向导。如果失效,你可以用Eac3to将.EVO文件转换为mkv文件再按次向导进行处理。

2,FFDShow

下载最新版本的FFDShow,FFDShow在安装的时候会默认为H264的解码;对于VC-1与MPEG-2,也可以使用FFDShow解码,打开“ffdshow video decoderconfiguration”,在“Codecs”的这部分,将VC-1的解码器设置为“libavcodec”,将MPEG-2的解码器设置为“libmpeg2”。经过我的测试,使用WMV Video Decoder DEMO与FFDShow做为VC-1的解码器,截图上没有区别。

3,GraphStudio

GraphStudio可以制作出包含我们所指定的对Source的解码器或插件的.grf文件。“Ctrl + F”可以把插件列表打开。

1,用“Haali Media Splitter”将你的源文件打开;
2,选择“FFDShow Video Decoder”;
3,将源的Video与FFDShow的In连接上

4. AvsP  (本部分由jaychu128编写)

AvsP适用于所有压制之前的准备工作。鉴于你选取将视频流传值给编码器方式的不同,你可以使用几乎所有多样化的选项和滤镜。

我们可以用AvsP制作一个avs脚本以便输入视频流到MeGUI。
打开刚才步骤中生成的grf文件(需将选取窗口中浏览文件类型改为所有),这时脚本语句区将出现如下语句:
DirectShowSource("C:\your_movie\filename.grf")
如果你已经了解了该片的帧率那么请在该语句中加入“Fps=XX.[已屏蔽]”,同时也不要忘记加上“Audio=false”以屏蔽音频流。你可以在后面的教程中看到如何使用Eac3to来查看各种媒体信息包括帧率等。如你所见,每个参数之间都用“,”分隔(本文所述标点均为英文半角)。
这时候脚本应该是这样的:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)

现在另起一行,把“ConvertToYV12()”加入到脚本中以达到转换色域的目的(可能只适用于HDTV录制的源但加上这句有益无害)。
第一步基本做完了:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()

Cropping(裁切,俗称“切黑边”)
如果我们想要裁切视频的画面,就必须找到一帧明亮场景的帧然后把黑边都切掉。如果宽高比不正确,建议你多切1-2个像素以达到正确的比例。
"Crop(0,0,-0,-0)" Left,Top,-Right,-Bottom L,T,R,B都是裁剪数值的绝对值,但要注意进行右部和底部的裁剪时必须加上负号(相对方向)。

通常情况下我们只能裁切偶数个像素,但通过Spline36Resize的细微变形可以实现奇数个像素的裁切。语句例子如下:
spline36resize(1920,816,0,131,0,-133)
但这种方法可能会引起轻微的画质损失,所以压制前事先检查下avs脚本所呈现的画面表现。

Mod16&Mod4
按照惯例,我们总是多裁切一点以使高和宽符合Mod16或是Mod4(被16或者4整除),来达到尽可能高的压缩率,Mod2也未尝不可(对压缩率的影响轻微)。

下面我将举例详细说明。
比如有部视频原始分辨率是1920x1080,我用“Crop(0,144,-0,-136)”语句将其裁切成了1920x800的分辨率,如何判断它是否符合Mod16或者Mod4呢?
此例中:
裁切后的宽度 W = 1920 – ( 左部切掉的像素数 + 右部切掉的像素数 ) = 1920
裁切后的高度 H = 1080 – ( 上部切掉的像素数 + 下部切掉的像素数 ) = 800
W / 16 = 120  W / 4 = 480;
H / 16 = 50    H / 4 = 200;
均符合,目标达成。

这时我们的脚本应该是这样的:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()
Crop(0,144,-0,-136)
(若你想压制的视频不需要变形,则你可以保存avs脚本,无须继续向下阅读)

Resize(720p变形)
如果你想要把视频变形到720p分辨率(1280x???),你可以使用以下语句组合:
若裁切后的源尺寸接近1920x1080:Spline36resize(1280,720)
1920x1040:Spline36resize(1280,688)
1920x816:Spline36resize(1280,544)
1920x800:Spline36resize(1280,536)
1920x800:Spline36resize(1280,528)
(最后两种情况,取决于哪种变形相对于裁切后的源画面尺寸变形程度更小)

如果上述情况均不符合,建议使用以下公式计算:
变形后的目标高度 = 裁切后的源画面高度 x ( 1280 / 裁切后的源画面宽度 ) 若计算出来数字去小数部分后为奇数,请将小数部分四舍五入取变形程度更小的那个偶数值。

现在脚本应该是这样的:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()
Crop(0,144,-0,-136)
Spline36resize(1280,536)

OAR(原始显示比例)
进行变形后,确保目标画面接近或者达到原始显示比例。尽可能满足Mod16或者Mod4。
裁切后的源画面高度 /裁切后的源画面宽度 = OAR

假设我们有视频源文件在裁切后分辨率为1920x1040,则变形的目标高度应为693.33。当然了,非偶数是不能作为参数进行变形和裁切的,那么我们就尽量满足Mod4或者Mod16,则脚本如下:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()
Crop(0,144,-0,-136)
Spline36resize(1280,692)

但个人推荐变形为1280x694,虽然压缩率有轻微影响,但相比于画面比例的改善可以忽略不计。

5,MeGUI

MeGUI是一个简易的集成化的压制软件。
当你打开MeGUI时,他会自动检查是否有更新可用;如果你使用MeGUI,建议将最新版的x264复制到“\megui\tools\x264\”里,因为MeGUI的x264更新常常不是很快。

MeGUI里带有很多的预设定的profiles可供使用:


Quote:
x264: DXVA-HD-HQ
x264: DXVA-HD-Insane
x264: Unrestricted 2Pass HQ



以下是MeGUI的一些操作:

启动MeGUI后,将更新完毕,你可以按下“ctrl+O”打开你预先制作好的.avs文件,如果你制作的.avs文件没有问题,你将会看到预览图。选择文件格式为.mkv。

然后我们来进入profile的Config:

进入Config界面,会出现选项,在下端会出现对应于选项的命令行。

如果你选择的是DXVA-HD-HQ(DXVA可以适用于Gpu与硬件解码)这个profile,下面会是一个基本的命令行:


Quote:
program --pass 2--bitrate 1000 --stats ".stats" --level 4.1 --ref 4 --mixed-refs--bframes 3 --b-adapt 2 --weightb --direct auto --deblock -1:-1 --subme7 --trellis 2 --partitions p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-bufsize50000 --vbv-maxrate 50000 --me umh --threads auto --thread-input--progress --no-psnr --no-ssim --output "output" "input"



选择好自己需要的参数,就点击下面的“New”,然后输入自定义的profile的名字,然后保存,以后就可以快速的选取自己想要的设置了。

至于x264参数的作用,后面讲解。

6,一些重要的基本的x264信息

由于每一部HD源的可压缩性、颗粒感的程度、扭曲性都有很大的不同,所以你需要针对每一部源做出各自不同的设置以达到压制的目的。

a,L4.1

以下是常见的分辨率所对应的最大可取的reference frames值:


Quote:
|-----------------|-----------|
|Resolution   | no. ref|
|-----------------|----------|
| 1280x544  |    12   |
| 1280x720  |     9    |
| 1920x800  |     5    |
| 1920x816  |     5    |
| 1920x1080|     4    |
|----------------|-----------|




如果你的视频分辨率不在上面的范围,你可以用下面这个公式自己计算你的encode的最大ref值:

    8388608
__________________

(width x height)

b,Deblocking

顾名思义,这个参数是用来防止block(色块成堆)的发生的,这里我用我的一个Encode对比举个例子,什么叫full of block:
http://hdbits.org/details.php?id=39888, 这里的SLO那个版本就是一个典型的full of block的Encode,而且扭曲变形很严重,颗粒丢失严重。而造成block的最主要的原因,是码率,其次是参数设置。


x264里有2个Deblocking单元,分别叫Deblocking strength与Deblockingthreshold,Deblocking strength主管Alpha Deblocking,Deblockingthreshold主管Beta Deblocking(Alpha与Beta Deblocking都是官方称谓)。

4. AvsP

AvsP适用于所有压制之前的准备工作。鉴于你选取将视频流传值给编码器方式的不同,你可以使用几乎所有多样化的选项和滤镜。

我们可以用AvsP制作一个avs脚本以便输入视频流到MeGUI。
打开刚才步骤中生成的grf文件(需将选取窗口中浏览文件类型改为所有),这时脚本语句区将出现如下语句:
DirectShowSource("C:\your_movie\filename.grf")
如果你已经了解了该片的帧率那么请在该语句中加入“Fps=XX.[已屏蔽]”,同时也不要忘记加上“Audio=false”以屏蔽音频流。你可以在后面的教程中看到如何使用Eac3to来查看各种媒体信息包括帧率等。如你所见,每个参数之间都用“,”分隔(本文所述标点均为英文半角)。
这时候脚本应该是这样的:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)

现在另起一行,把“ConvertToYV12()”加入到脚本中以达到转换色域的目的(可能只适用于HDTV录制的源但加上这句有益无害)。
第一步基本做完了:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()

Cropping(裁切,俗称“切黑边”)
如果我们想要裁切视频的画面,就必须找到一帧明亮场景的帧然后把黑边都切掉。如果宽高比不正确,建议你多切1-2个像素以达到正确的比例。
"Crop(0,0,-0,-0)" Left,Top,-Right,-Bottom L,T,R,B都是裁剪数值的绝对值,但要注意进行右部和底部的裁剪时必须加上负号(相对方向)。

通常情况下我们只能裁切偶数个像素,但通过Spline36Resize的细微变形可以实现奇数个像素的裁切。语句例子如下:
spline36resize(1920,816,0,131,0,-133)
但这种方法可能会引起轻微的画质损失,所以压制前事先检查下avs脚本所呈现的画面表现。

Mod16&Mod4
按照惯例,我们总是多裁切一点以使高和宽符合Mod16或是Mod4(被16或者4整除),来达到尽可能高的压缩率,Mod2也未尝不可(对压缩率的影响轻微)。

下面我将举例详细说明。
比如有部视频原始分辨率是1920x1080,我用“Crop(0,144,-0,-136)”语句将其裁切成了1920x800的分辨率,如何判断它是否符合Mod16或者Mod4呢?
此例中:
裁切后的宽度 W = 1920 – ( 左部切掉的像素数 + 右部切掉的像素数 ) = 1920
裁切后的高度 H = 1080 – ( 上部切掉的像素数 + 下部切掉的像素数 ) = 800
W / 16 = 120  W / 4 = 480;
H / 16 = 50    H / 4 = 200;
均符合,目标达成。

这时我们的脚本应该是这样的:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()
Crop(0,144,-0,-136)
(若你想压制的视频不需要变形,则你可以保存avs脚本,无须继续向下阅读)

Resize(720p变形)
如果你想要把视频变形到720p分辨率(1280x???),你可以使用以下语句组合:
若裁切后的源尺寸接近1920x1080:Spline36resize(1280,720)
1920x1040:Spline36resize(1280,688)
1920x816:Spline36resize(1280,544)
1920x800:Spline36resize(1280,536)
1920x800:Spline36resize(1280,528)
(最后两种情况,取决于哪种变形相对于裁切后的源画面尺寸变形程度更小)

如果上述情况均不符合,建议使用以下公式计算:
变形后的目标高度 = 裁切后的源画面高度 x ( 1280 / 裁切后的源画面宽度 ) 若计算出来数字去小数部分后为奇数,请将小数部分四舍五入取变形程度更小的那个偶数值。

现在脚本应该是这样的:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()
Crop(0,144,-0,-136)
Spline36resize(1280,536)

OAR(原始显示比例)
进行变形后,确保目标画面接近或者达到原始显示比例。尽可能满足Mod16或者Mod4。
裁切后的源画面高度 /裁切后的源画面宽度 = OAR

假设我们有视频源文件在裁切后分辨率为1920x1040,则变形的目标高度应为693.33。当然了,非偶数是不能作为参数进行变形和裁切的,那么我们就尽量满足Mod4或者Mod16,则脚本如下:
DirectShowSource("C:\your_movie\filename.grf",Audio=false,Fps=23.976)
ConvertToYV12()
Crop(0,144,-0,-136)
Spline36resize(1280,692)

但个人推荐变形为1280x694,虽然压缩率有轻微影响,但相比于画面比例的改善可以忽略不计。
这个世界,真理只存在于导弹的射程范围内

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

淘宝小店

邀请码

VIP会员

微信客服

公众号

微信群

投诉/建议联系

support@gebi1.cn

未经授权禁止转载,复制和建立镜像,
如有违反,追究法律责任
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2024 隔壁网 版权所有 All Rights Reserved. 粤ICP备14056481号-1
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表