“X264使用介绍”的版本间的差异

来自NMM Doc
跳到导航 跳到搜索
 
(未显示4个用户的17个中间版本)
第2行: 第2行:


 主页: http://www.videolan.org/developers/x264.html
 主页: http://www.videolan.org/developers/x264.html
x264.nl当前版本信息:{{X264ver}}


== H.264和x264 ==
== H.264和x264 ==
第16行: 第14行:


x264的主页上只用[http://git.videolan.org/?p=x264.git;a=summary git提供源代码]。虽然官方网站不提供编译好的版本,但是有很多人在编译x264,特别是Win32平台的编译版。
x264的主页上只用[http://git.videolan.org/?p=x264.git;a=summary git提供源代码]。虽然官方网站不提供编译好的版本,但是有很多人在编译x264,特别是Win32平台的编译版。
*http://x264.nl 的编译版没有任何patch,即所谓纯净版。
*[http://x264.nl/x264_main.php x264.nl]
*[http://tmod.nmm-hd.org 06_taro Mod]
*[http://x264.fushizen.eu/ jeeb编译版]
*[http://x264.fushizen.eu/ jeeb编译版]
*[http://komisar.gin.by/ komisar编译版]
*[http://komisar.gin.by/ komisar编译版]
第22行: 第21行:
*[http://vfrmaniac.fushizen.eu/x264/ VFR Maniac编译版]
*[http://vfrmaniac.fushizen.eu/x264/ VFR Maniac编译版]
*[http://www.xvidvideo.ru/x264-video-codec/ xvidvideo.ru编译版]
*[http://www.xvidvideo.ru/x264-video-codec/ xvidvideo.ru编译版]
*MythCreator的编译版
*[http://www.nmm-hd.org/x264/ MythCreator的编译版]
*[http://sourceforge.net/projects/direct264/ roozhou的支持DirectShow输入的版本]。
*[http://sourceforge.net/projects/direct264/ roozhou的支持DirectShow输入的版本]。
*还有doom9上的[http://forum.doom9.org/showthread.php?t=130364 Current Patches, Where to get them, How they affect speed/output]和doom10上的[http://doom10.org/index.php?topic=3.0 Getting the latest x264],都会有最新的编译版
*还有doom9上的[http://forum.doom9.org/showthread.php?t=130364 Current Patches, Where to get them, How they affect speed/output]和doom10上的[http://doom10.org/index.php?topic=3.0 Getting the latest x264],都会有最新的编译版
我们一般选择32位的最新版。
此外,可以关注由[http://twitter.com/dgwxx @dgwxx]维护的twitter机器人[http://twitter.com/264bot @264bot],它每半小时检查一次x264.nl更新,报告32bit和64bit版本的更新。


== 命令行界面的x264 ==
== 命令行界面的x264 ==
第42行: 第37行:


 假设x264.exe在E:\Encoder\文件夹,输入
 假设x264.exe在E:\Encoder\文件夹,输入
  cd /D E:\Encoder
  >cd /D E:\Encoder


 回车
 回车
第49行: 第44行:


 改变当前目录到E:\Encoder了。接下来,输入
 改变当前目录到E:\Encoder了。接下来,输入
  x264
  >x264
 回车
 回车


第63行: 第58行:
 返回
 返回


  x264 core:84 r1416 fcf70c2
  x264 core:104 r1688M 0b36c6d
  Syntax: x264 [options] -o outfile infile [widthxheight]
  Syntax: x264 [options] -o outfile infile
  
  
  Infile can be raw YUV 4:2:0 (in which case resolution is required),
  Infile can be raw (in which case resolution is required),
   or YUV4MPEG 4:2:0 (*.y4m),
   or YUV4MPEG (*.y4m),
   or Avisynth if compiled with support (yes).
   or Avisynth if compiled with support (no).
   or libav* formats if compiled with lavf support (yes) or ffms support (yes).
   or libav* formats if compiled with lavf support (no) or ffms support (yes).
  Outfile type is selected by filename:
  Outfile type is selected by filename:
   .264 -> Raw bytestream
   .264 -> Raw bytestream
   .mkv -> Matroska
   .mkv -> Matroska
   .flv -> Flash Video
   .flv -> Flash Video
   .mp4 -> MP4 if compiled with GPAC support (yes)
   .mp4 -> MP4
Output bit depth: 8 (configured at compile time)
  
  
  Options:
  Options:
第87行: 第83行:
        x264 --crf 24 -o <output> <input>
        x264 --crf 24 -o <output> <input>
  
  
    Two-pass with a bitrate of 1000kbps:
  '''中间略...'''
       x264 --pass 1 --bitrate 1000 -o <output> <input>
       x264 --pass 2 --bitrate 1000 -o <output> <input>
  
    Lossless:
       x264 --crf 0 -o <output> <input>
    Maximum PSNR at the cost of speed and visual quality:
       x264 --preset placebo --tune psnr -o <output> <input>
    Constant bitrate at 1000kbps with a 2 second-buffer:
       x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>
Presets:
    --profile        Force the limits of an H.264 profile [high]
                  Overrides all settings.
                  - baseline,main,high
    --preset         Use a preset to select encoding settings [medium]
                  Overridden by user settings.
                  - ultrafast,veryfast,faster,fast,medium
                  - slow,slower,veryslow,placebo
    --tune          Tune the settings for a particular type of source
                or situation
                  Overridden by user settings.
                  Multiple tunings are separated by commas.
                  Only one psy tuning can be used at a time.
                  - psy tunings: film,animation,grain,psnr,ssim
                  - other tunings: fastdecode,zerolatency
Frame-type options:
  -I, --keyint <integer>    Maximum GOP size [250]
    --interlaced       Enable pure-interlaced mode
Ratecontrol:
  -B, --bitrate <integer>   Set bitrate (kbit/s)
    --crf <float>      Quality-based VBR (0-51, 0=lossless) [23.0]
    --vbv-maxrate <integer> Max local bitrate (kbit/s) [0]
    --vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0]
  -p, --pass <integer>     Enable multipass ratecontrol
                  - 1: First pass, creates stats file
                  - 2: Last pass, does not overwrite stats file
  
  
  Input/Output:
  Input/Output:
第141行: 第94行:
     --level <string>     Specify level (as defined by Annex A)
     --level <string>     Specify level (as defined by Annex A)
     --quiet         Quiet Mode
     --quiet         Quiet Mode
Filtering:
    Filter options may be specified in the name=value format
--vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file
    Available filters:
    crop:left,top,right,bottom
    resize:[width,height][,sar][,fittobox][,csp][,method]
    select_every:step,offset1[,...]




 这下返回了不少字符。x264先告诉我们他的版本号,再告诉我们他的基本用法是“x264 --output output.mkv input.avs ”。还提示我们可以输入“--longhelp”或“--fullhelp”查看详细选项或所有的选项。
 这下返回了不少字符。x264先告诉我们他的版本号,再告诉我们他的基本用法是“x264 [options] -o outfile infile ”。还提示我们可以输入“--longhelp”或“--fullhelp”查看详细选项或所有的选项。


 接着输入 
 接着输入 
第152行: 第114行:


x264.exe的用法是,在命令行里输入形如
x264.exe的用法是,在命令行里输入形如
  x264 [--参数名 参数值 ...] --output 输出文件 输入文件 [宽x高]
  >x264 [--参数名 参数值 ...] --output 输出文件 输入文件


:其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号 ,输入文件后可以跟文件的分辨率(“宽x高”),有时也可以不指定分辨率
:其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。


 此外,还有短参数模式。这是为了简化某些常用参数名设计的。一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。注意此时这个字母区分大小写。在--fullhelp列表里,有短参数的参数的短参数都列在此参数的前面。
 此外,还有短参数模式。这是为了简化某些常用参数名设计的。一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。注意此时这个字母区分大小写。在--fullhelp列表里,有短参数的参数的短参数都列在此参数的前面。
第163行: 第125行:
 调用x264编码当前目录下的"ep01.avs"文件,输入"psp.264"。
 调用x264编码当前目录下的"ep01.avs"文件,输入"psp.264"。


  >"D:\encoder tools\x264.exe" --crf 18 --tune touhou --preset slower -I 24 -o "D:\touhou\out.mkv" "D:\touhou\yyc\yyc.avi"
  >"D:\encoder tools\x264.exe" --crf 18 --tune touhou --preset slower -I 24 -o "D:\touhou\out.mkv" "D:\touhou\th9\rec.avi"


 这个例子中,x264.exe、和输入文件都不在当前目录下,也不输出到当前路径,就要写完整的路径,如果有空格就需要在完整的路径左右加上引号。
 这个例子中,x264.exe、和输入文件都不在当前目录下,也不输出到当前路径,就要写完整的路径,如果有空格就需要在完整的路径左右加上引号。
第188行: 第150行:
 通过--preset的参数调节编码速度和质量的平衡。
 通过--preset的参数调节编码速度和质量的平衡。


--preset的值有ultrafast、superfast、veryfast、fast、medium、slow、slower、veryslow、placebo。从快到慢,参数越来越EP。默认是medium。
--preset的值有ultrafast、superfast、veryfast 、faster 、fast、medium、slow、slower、veryslow、placebo。从快到慢,参数越来越EP。默认是medium。


=== --tune ===
=== --tune ===
第225行: 第187行:


--bitrate 1000 (以1000kbps码率为例)
--bitrate 1000 (以1000kbps码率为例)
  x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs
  >x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs
  x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output.264 input.avs
  >x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output.264 input.avs


:先输入第一行,等1pass跑完之后再输入第二行跑2pass。1pass主要为了得到1pass.stats和1pass.stats.mbtree两个文件,2pass需要这两个文件已完成最后的编码,最后输出文件。
:先输入第一行,等1pass跑完之后再输入第二行跑2pass。1pass主要为了得到1pass.stats和1pass.stats.mbtree两个文件,2pass需要这两个文件已完成最后的编码,最后输出文件。
:默认情况下,1pass是以“快速”参数跑的,而不是以指定的参数跑。因此一般1pass会比2pass的速度快上很多。而这里1pass指定输出的文件名是NUL,在Windows里,这个文件名是保留的,因此不会有任何输出的 编码的文件。
:默认情况下,1pass是以“快速”参数跑的,而不是以指定的参数跑。因此一般1pass会比2pass的速度快上很多。而这里1pass指定输出的文件名是NUL,在Windows里,这个文件名是保留的,因此不会有任何输出的 编码的文件。
:尽量让1pass和2pass的视频一致,如果改变了视频,分析的结果就会变得比较不准确。
:尽量让1pass和2pass的视频一致,如果改变了视频,分析的结果就会变得比较不准确。


 此外,1pass可以用crf方式跑,而且可以输出编码的结果,也就是说先跑个1pass看看,如果大小和预想的偏差太多,就再跑个2pass。但由于1pass默认用“快速”参数跑,因此这里的1pass需要加上--slow-firstpass强制x264用我们给的参数跑。
 此外,1pass可以用crf方式跑,而且可以输出编码的结果,也就是说先跑个1pass看看,如果大小和预想的偏差太多,就再跑个2pass。但由于1pass默认用“快速”参数跑,因此这里的1pass需要加上--slow-firstpass强制x264用我们给的参数跑。


  x264 --crf 20 --pass 1 --slow-firstpass animation --preset slower --stats "1pass.stats" -o output1pass.264 input.avs
  >x264 --crf 20 --pass 1 --slow-firstpass --tune animation --preset slower --stats "1pass.stats" -o output1pass.264 input.avs
  x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output2pass.264 input.avs
  >x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output2pass.264 input.avs


:1pass会输出3个文件:1pass.stats、1pass.stats.mbtree和output1pass.264。前两个是分析文件,后一个是编码的结果。如果对编码结果不满意,则继续用分析的结果跑2pass。
:1pass会输出3个文件:1pass.stats、1pass.stats.mbtree和output1pass.264。前两个是分析文件,后一个是编码的结果。如果对编码结果不满意,则继续用分析的结果跑2pass。
第244行: 第206行:
 如果用了64位的Windows Vista或Windows 7,就可以用64位的x264。64位的x264大约能比32位的x264快上10%左右,能节省的时间还是比较可观的。但是用AviSynth输入时,64位的x264只接受64位的AviSynth输入,32位的x264只接受32位的AviSynth。虽然现在有64位的AviSynth和不少常用的滤镜,但是大多数人还是愿意用32位的AviSynth。那么如何用让64位的x264配合32位的AviSynth呢?
 如果用了64位的Windows Vista或Windows 7,就可以用64位的x264。64位的x264大约能比32位的x264快上10%左右,能节省的时间还是比较可观的。但是用AviSynth输入时,64位的x264只接受64位的AviSynth输入,32位的x264只接受32位的AviSynth。虽然现在有64位的AviSynth和不少常用的滤镜,但是大多数人还是愿意用32位的AviSynth。那么如何用让64位的x264配合32位的AviSynth呢?


 方法是用'''pipe'''。用命令行工具(如ffmpeg、mencoder 或avs2uv )打开avs,让输出的raw yuv画面直接输入给x264,期间不产生中间文件。这个操作也是在命令行里实现的。
 方法是用'''pipe'''。用命令行工具(如ffmpeg、mencoder 或avs2yuv )打开avs,让输出的raw yuv画面直接输入给x264,期间不产生中间文件。这个操作也是在命令行里实现的。


=== 用ffmpeg输入 ===
=== 用ffmpeg输入 ===


 先下载ffmpeg的Windows编译版,可以用static link版本。目前ffmpeg在Windows只有32位的编译版。和x264一样,ffmpeg放在任何目录里都能运行,假设和x264、要进行编码的input.avs (分辨率是1280x720) 放在一个目录里。
 先下载ffmpeg的Windows编译版,可以用static link版本。目前ffmpeg在Windows只有32位的编译版。和x264一样,ffmpeg放在任何目录里都能运行,假设和x264、要进行编码的input.avs放在一个目录里。


  >ffmpeg -i input.avs -pix_fmt yuv420p -an - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 -
  >ffmpeg -i input.avs -f yuv4mpegpipe -an -v 0 - | x264 [options] --demuxer y4m -o output.264 -


 先用ffmpeg打开input.avs,并不指定输出的文件,而是以“-”代替输出的文件。后面写“|”,再写x264,x264的选项和输出文件写法不变,但是输入文件写“-” ,最后一定要指定分辨率。分辨率不能写错,不然编码速度极慢,而且画面出错。如果在编码时发现速度极慢,就要看看是不是分辨率搞错了
 先用ffmpeg打开input.avs,并不指定输出的文件,而是以“-”代替输出的文件。后面写“|”,再写x264,x264的选项和输出文件写法不变,但是输入文件写“-”。


=== 用mencoder输入 ===
=== 用mencoder输入 ===


mencoder有很多有价值的滤镜,用起来也很方便。libx264可以编译进mencoder本身,和单独的x264效果一样。mencoder也可以打开avs文件,pipe给64位的x264。mplayer-ww的命令行版里带 有mencoder。
mencoder有很多有价值的滤镜,用起来也很方便。libx264可以编译进mencoder本身,和单独的x264效果一样。mencoder也可以打开avs文件,pipe给64位的x264。mplayer-ww的命令行版里 带有mencoder。


 同样假设mencoder、x264和要编码的的input.avs(1280x720)在一个目录里。
 同样假设mencoder、x264和要编码的的input.avs(1280x720)在一个目录里。


  mencoder input.avs -vf fmt=yv12 -of rawvideo -ovc raw -nosound -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 - 
  >mencoder input.avs -vf format=yv12 -of rawvideo -ovc raw -nosound -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 - 


mencoder部分不同,x264部分和用ffmpeg时一样。
mencoder部分不同,x264部分和用ffmpeg时一样。
第268行: 第230行:
avs2yuv本来是为了给linux上wine来用的,因为AviSynth是运行在Windows的,在linux里必须wine avs2yuv来打开avs,再pipe给x264。当然也可以用来pipe给64位的x264。
avs2yuv本来是为了给linux上wine来用的,因为AviSynth是运行在Windows的,在linux里必须wine avs2yuv来打开avs,再pipe给x264。当然也可以用来pipe给64位的x264。


 同样假 设mencoder 、x264和要编码的的input.avs (1280x720) 在一个目录里。
 同样假 设avs2yuv 、x264和要编码的的input.avs在一个目录里。


  >avs2yuv input.avs -raw -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 -
  >avs2yuv input.avs - | x264 [options] --demuxer y4m -o output.264 -


avs2yuv的输出格式默认是yuv4mpeg,x264用y4m格式解码即可从中读取分辨率,所以无须再用--input-res指定分辨率。


 以上介绍了3种方法,个人比较倾向于用ffmpeg。2pass的编码也是像上面所讲的方法一样。
 以上介绍了3种方法,个人比较倾向于用ffmpeg。2pass的编码也是像上面所讲的方法一样。


== DXVA ==
==x264压制的自动化==
DXVA(DirectX Video Accelaration)通常被称为硬解 是在Windows上 显卡解码H.264等 码视频的方式。AMD的显卡方面,HD2xxx 上的系列都可以DXVA;nVidia的显卡方面,GeForce8000以上的系列都可以DXVA。
虽然MeGUI等程序实现了x264压制的批量化,但并无法实现crf 1st pass + bitrate 2nd pass的自动2pass 也无法实现1st pass和2nd pass使 不同avs脚本。
 
为此SAPikachu 写了Python脚本encx264,实现了 下功能:


符合一定条件的H.264编 的片子才能正常的DXVA 由于H.264 复杂性,用 较老的CPU解码720p和1080p通常比较吃力 因此720p和1080p的片子 否DXVA常常成为矛盾的焦点 为了让大 多数 人都能正常 看到片子,建议尽量 使用 能够DXVA 参数压制
*支持1Pass crf + 2Pass bitrate模式,自动获取crf出来的 率作为2pass参数 也可设定2pass码率 的比 自动计算2nd pass码率功 能。
*自动记录压制log。
*可自定义 套预置参
*可分别使用不同脚本跑1st和2nd pass。如1st pass使用较快 滤镜,2nd pass再 使用 速度慢效果好 滤镜,牺牲一定精度来提高速度。
*支持脚本自动升级最新版


  随着显卡驱动程序的完善,DXVA(硬解) H.264视频的限制条件也越来越少。无论是A卡还是N卡,现在都可以DXVA L5.1@HiP,ref=16的片子,但是不能保证完全没解码错误,特别是在A卡上。由于DXVA的需求主要集中在720p和1080p上,SD的视频一般CPU都无压力,因此讲解一下针对高清片子的“安全DXVA”参数
  下载、讨论、反馈请前往论坛[http://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=168 讨论发布专用贴]


== DXVA ==
参考主条目: [[DXVA和psp]]


[[待补充]]
DXVA(DirectX Video Accelaration)通常被称为硬解,是在Windows上用显卡解码H.264等编码视频的方式。AMD的显卡方面,HD2xxx以上的系列都可以DXVA;nVidia的显卡方面,GeForce8000以上的系列都可以DXVA。


符合一定条件的H.264编码的片子才能正常的DXVA。由于H.264的复杂性,用比较老的CPU解码720p和1080p通常比较吃力,因此720p和1080p的片子能否DXVA常常成为矛盾的焦点。为了让大多数人都能正常的看到片子,建议尽量使用能够DXVA的参数压制。


== PSP上的480p H.264 编码 的mp4片子 ==
[[分类:视频 编码 器]]
[[分类:x264]]

2013年7月23日 (二) 22:10的最新版本

x264是一个开源的H.264视频编码函数库。是最好的有损视频编码器。

主页: http://www.videolan.org/developers/x264.html

H.264和x264

H.264是ITU(International Telecommunication Unite 国际通信联盟)MPEG(Motion Picture Experts Group 运动图像专家组)联合制定的视频编码标准。从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264,在MPEG的标准里是MPEG-4的一个组成部分--MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

H.264编码能实现非常好的压缩比,有广泛的适用码率(适于从超低码率低延迟的电话会议到高码率的BluRay光盘和HDTV码流),良好的硬件支持(以PSP、iPod和显卡DXVA为代表)和众多强大的厂商作后盾。

x264始于2003年,从当开源社区的MPEG4-ASP编码器Xvid小有所成时开始的,经过几年的开发,特别是Dark Shikari加入开发后,x264逐渐成为了最好的视频编码器。

获取x264

x264的主页上只用git提供源代码。虽然官方网站不提供编译好的版本,但是有很多人在编译x264,特别是Win32平台的编译版。

命令行界面的x264

我们下载到的x264.exe是一个命令行工具,不需要安装,随便放在哪里都能运行。双击x264.exe只能看到打开了一个黑色的窗口里在刷着什么,然后就没了。x264.exe需要在命令行里输入命令,没有GUI。

不可否认有GUI的工具用来很方便,更容易上手,比如用的最广泛的[http:// MeGUI],此外还有ripbot、staxrip等GUI。doom9上有[1]都是各种GUI,一一试过来看看自己喜欢什么。MeGUI可以自动更新编码常用的软件,作为自动下载的工具倒是不错。本篇教程主要讲解命令行参数,GUI也是调用同一个x264,因此都用对应的选项。

命令行的操作

按Win+R键调出运行,输入cmd,回车,出现黑底白字的窗口和几行字,其中有 “C:\Document and Settings\User\>”表示当前所在的目录,后面闪的光标代表等待输入内容。

假设x264.exe在E:\Encoder\文件夹,输入

>cd /D E:\Encoder

回车

改变当前目录到E:\Encoder了。接下来,输入

>x264

回车


接下来,不用截图说明会返回的信息了,而直接粘贴cmd里返回的字符。输入命令会以“>”提示,看到“>”就代表此行是输入命令并回车。

我们看到,如果只运行x264,什么都不提供给他,x264会返回一个错误。他告诉我们缺少输入文件,并提示我门输入“x264 --help”会列出选项。照他说的,加--help试试。

>x264 --help

返回

x264 core:104 r1688M 0b36c6d
Syntax: x264 [options] -o outfile infile

Infile can be raw (in which case resolution is required),
  or YUV4MPEG (*.y4m),
  or Avisynth if compiled with support (no).
  or libav* formats if compiled with lavf support (no) or ffms support (yes).
Outfile type is selected by filename:
 .264 -> Raw bytestream
 .mkv -> Matroska
 .flv -> Flash Video
 .mp4 -> MP4
Output bit depth: 8 (configured at compile time)

Options:

  -h, --help                  List basic options
      --longhelp              List more options
      --fullhelp              List all options

Example usage:

      Constant quality mode:
            x264 --crf 24 -o <output> <input>

中间略...

Input/Output:

  -o, --output                Specify output file
      --sar width:height      Specify Sample Aspect Ratio
      --fps <float|rational>  Specify framerate
      --seek <integer>        First frame to encode
      --frames <integer>      Maximum number of frames to encode
      --level <string>        Specify level (as defined by Annex A)
      --quiet                 Quiet Mode

Filtering:

      Filter options may be specified in the name=value format
--vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file
      Available filters:
      crop:left,top,right,bottom
      resize:[width,height][,sar][,fittobox][,csp][,method]
      select_every:step,offset1[,...]


这下返回了不少字符。x264先告诉我们他的版本号,再告诉我们他的基本用法是“x264 [options] -o outfile infile”。还提示我们可以输入“--longhelp”或“--fullhelp”查看详细选项或所有的选项。

接着输入

>x264 --fullhelp

列出了所有选项。

x264.exe的用法是,在命令行里输入形如

>x264 [--参数名 参数值 ...] --output 输出文件 输入文件
其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。

此外,还有短参数模式。这是为了简化某些常用参数名设计的。一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。注意此时这个字母区分大小写。在--fullhelp列表里,有短参数的参数的短参数都列在此参数的前面。

实际命令实例:

>x264 --crf 22 --profile main --tune animation --preset medium --b-pyramid none -o psp.mp4 ep01.avs

调用x264编码当前目录下的"ep01.avs"文件,输入"psp.264"。

>"D:\encoder tools\x264.exe" --crf 18 --tune touhou --preset slower -I 24 -o "D:\touhou\out.mkv" "D:\touhou\th9\rec.avi"

这个例子中,x264.exe、和输入文件都不在当前目录下,也不输出到当前路径,就要写完整的路径,如果有空格就需要在完整的路径左右加上引号。

在Windows XP和Windows 7中,把文件拖拽到cmd里,cmd会自动把文件的完整路径写在命令行上的。

x264的输入输出文件类型

在加入了ffms/lavf后,x264可以直接输入几乎所有类型的片子,而不是像原来一样必须借助于avs。下面所讲的是输入输出的片子类型,除此之外的输入输出还有多pass中的stats文件、qp file、量化矩阵和tc file。

  • 输入:

x264支持输入的文件类型有raw yuv、y4m、avs和任何可以由ffmslavf打开的文件。raw yuv会用在64位的x264里。有ffms/lavf打开的片子会自动正确的处理vfr问题。avs和ffms/lavf输入不需要指定片子的分辨率。

  • 输出:

x264可以输出没有封装的H.264视频流,扩展名是.264;matroska视频,扩展名是.mkv;flash视频,扩展名是.flv;mp4视频,扩展名是.mp4。mkv、mp4和flv可以是vfr的。

x264通过输出文件的扩展名判断输出文件类型。

x264的preset和tune系统

x264的参数繁多,开发者为了方便使用者、简化输入和提出编码建议,设计了一套快速调用参数的系统。如果没有特别的需要,请尽量使用preset和tune系统。这套开发者推荐的参数比各种道听途说的参数更合理。

在使用了preset和tune以后,依然可以指定里面已经有的参数。手动指定的参数会覆盖preset和tune里的参数。

--preset

通过--preset的参数调节编码速度和质量的平衡。

--preset的值有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo。从快到慢,参数越来越EP。默认是medium。

--tune

通过--tune的参数值指定片子的类型,是和视觉优化的参数,或有特别的情况。

--tune的值有

  • film:电影、真人类型;
  • animation:动画;
  • grain:需要保留大量的grain时用;
  • stillimage:静态图像编码时使用;
  • psnr:为提高psnr做了优化的参数;
  • ssim:为提高ssim做了优化的参数;
  • fastdecode:可以快速解码的参数;
  • zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

码率控制

视频的码率直接影响到了片子的编码质量。要想效果好,码率足够是最重要的必要条件之一。但是想实现更好的效果和控制文件的体积(码率)之间始终是一对矛盾。这就需要我们通过实践,在强大的编码器的帮助下总结出合适的码率,实现尽量好的效果。

x264有4种码率控制方式,分别是1pass bitrate、crf、qp和2pass bitrate。其中2pass bitrate包含pass bitrate。

1pass bitrate和qp(恒定量化值)一般不推荐使用。

crf

--crf 23 (默认)

一种根据片子质量自动分配码率的vbr码率控制方式。一遍编码,如果对码率没要求请尽量使用crf模式。

可用的值从1到51,越小编码质量越好,码率越高。一般使用16到24,可以为浮点。

crf并不是恒定质量的方式,同一片子同一crf值,其他参数不同可能码率和质量能差比较大,不同的片子之间就更没有可比性了。

2pass bitrate

这种方式可以精确的得到想要的平均码率,2pass代表需要做2次编码,第一遍编码x264先分析全片,得到一个stats文件和一个mbtree文件(默认使用mbtree)。第二遍编码以这两个文件作参考分配合理的码率。需要特定的码率(或文件大小)一定要用2pass(或多pass)编码。

除了2pass,还有多pass模式,在之前分析的基础上再继续分析,理论上会使码率分配更加合理,但实际上2pass已经足够了。

--bitrate 1000 (以1000kbps码率为例)

>x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs
>x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output.264 input.avs
先输入第一行,等1pass跑完之后再输入第二行跑2pass。1pass主要为了得到1pass.stats和1pass.stats.mbtree两个文件,2pass需要这两个文件已完成最后的编码,最后输出文件。
默认情况下,1pass是以“快速”参数跑的,而不是以指定的参数跑。因此一般1pass会比2pass的速度快上很多。而这里1pass指定输出的文件名是NUL,在Windows里,这个文件名是保留的,因此不会有任何输出的已编码的文件。
尽量让1pass和2pass的视频一致,如果改变了视频,分析的结果就会变得比较不准确。

此外,1pass可以用crf方式跑,而且可以输出编码的结果,也就是说先跑个1pass看看,如果大小和预想的偏差太多,就再跑个2pass。但由于1pass默认用“快速”参数跑,因此这里的1pass需要加上--slow-firstpass强制x264用我们给的参数跑。

>x264 --crf 20 --pass 1 --slow-firstpass --tune animation --preset slower --stats "1pass.stats" -o output1pass.264 input.avs
>x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output2pass.264 input.avs
1pass会输出3个文件:1pass.stats、1pass.stats.mbtree和output1pass.264。前两个是分析文件,后一个是编码的结果。如果对编码结果不满意,则继续用分析的结果跑2pass。
2pass必须用bitrate模式跑,不能用crf跑。

64bit的x264

如果用了64位的Windows Vista或Windows 7,就可以用64位的x264。64位的x264大约能比32位的x264快上10%左右,能节省的时间还是比较可观的。但是用AviSynth输入时,64位的x264只接受64位的AviSynth输入,32位的x264只接受32位的AviSynth。虽然现在有64位的AviSynth和不少常用的滤镜,但是大多数人还是愿意用32位的AviSynth。那么如何用让64位的x264配合32位的AviSynth呢?

方法是用pipe。用命令行工具(如ffmpeg、mencoder或avs2yuv)打开avs,让输出的raw yuv画面直接输入给x264,期间不产生中间文件。这个操作也是在命令行里实现的。

用ffmpeg输入

先下载ffmpeg的Windows编译版,可以用static link版本。目前ffmpeg在Windows只有32位的编译版。和x264一样,ffmpeg放在任何目录里都能运行,假设和x264、要进行编码的input.avs放在一个目录里。

>ffmpeg -i input.avs -f yuv4mpegpipe -an -v 0 - | x264 [options] --demuxer y4m -o output.264 -

先用ffmpeg打开input.avs,并不指定输出的文件,而是以“-”代替输出的文件。后面写“|”,再写x264,x264的选项和输出文件写法不变,但是输入文件写“-”。

用mencoder输入

mencoder有很多有价值的滤镜,用起来也很方便。libx264可以编译进mencoder本身,和单独的x264效果一样。mencoder也可以打开avs文件,pipe给64位的x264。mplayer-ww的命令行版里就带有mencoder。

同样假设mencoder、x264和要编码的的input.avs(1280x720)在一个目录里。

>mencoder input.avs -vf format=yv12 -of rawvideo -ovc raw -nosound -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 - 

mencoder部分不同,x264部分和用ffmpeg时一样。

用avs2yuv输入

avs2yuv本来是为了给linux上wine来用的,因为AviSynth是运行在Windows的,在linux里必须wine avs2yuv来打开avs,再pipe给x264。当然也可以用来pipe给64位的x264。

同样假设avs2yuv、x264和要编码的的input.avs在一个目录里。

>avs2yuv input.avs - | x264 [options] --demuxer y4m -o output.264 -

avs2yuv的输出格式默认是yuv4mpeg,x264用y4m格式解码即可从中读取分辨率,所以无须再用--input-res指定分辨率。

以上介绍了3种方法,个人比较倾向于用ffmpeg。2pass的编码也是像上面所讲的方法一样。

x264压制的自动化

虽然MeGUI等程序实现了x264压制的批量化,但并无法实现crf 1st pass + bitrate 2nd pass的自动2pass,也无法实现1st pass和2nd pass使用不同avs脚本。

为此SAPikachu编写了Python脚本encx264,实现了以下功能:

  • 支持1Pass crf + 2Pass bitrate模式,自动获取crf出来的码率作为2pass参数。也可设定2pass码率的比例,自动计算2nd pass码率功能。
  • 自动记录压制log。
  • 可自定义多套预置参数。
  • 可分别使用不同脚本跑1st和2nd pass。如1st pass使用较快的滤镜,2nd pass再使用速度慢效果好的滤镜,牺牲一定精度来提高速度。
  • 支持脚本自动升级最新版。

下载、讨论、反馈请前往论坛讨论发布专用贴

DXVA

参考主条目: DXVA和psp

DXVA(DirectX Video Accelaration)通常被称为硬解,是在Windows上用显卡解码H.264等编码视频的方式。AMD的显卡方面,HD2xxx以上的系列都可以DXVA;nVidia的显卡方面,GeForce8000以上的系列都可以DXVA。

符合一定条件的H.264编码的片子才能正常的DXVA。由于H.264的复杂性,用比较老的CPU解码720p和1080p通常比较吃力,因此720p和1080p的片子能否DXVA常常成为矛盾的焦点。为了让大多数人都能正常的看到片子,建议尽量使用能够DXVA的参数压制。