[Linux 音视频技术] x264 压缩笔记

Mar 22nd, 2009

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2009/03/22/x264.html

象x264本身是不能直接处理视频的,因为他没有解码部分,所以需要 mencoder 和 ffmpeg 之类解码成 yuv 的文件,然后在用他来编码.但在处理时一定要指定宽高.

象mplayer如果播放 y4m,原始 yuv 不带 y4m 头,播放时要手动指定正确分辨率.宽高错一点都会花.另外,二个程序编码和解码通信时,最好使用 mkfifo 来建立一个管道(pipe)这样能更加好的通信,不然 mencoder 的输出会搞花 x264 的编码.

$ mplayer i420.yuv -demuxer rawvideo -rawvideo w=320:h=240

解码的过程用mencoder可以这样写

$ mencoder   -really-quiet $Videotime  -of rawvideo -ovc raw  \
-ofps $fps -noautosub -vf scale=$Scale,harddup,format=i420 -nosound  $FileName -o -

然后通过管道传送给x264的程序来处理.

 如果 mencoder 加字幕有问题,可以使用 mplayer 来加字幕

 

mplayer new.mp4 -really-quiet  -sub /root/sub.ssa -ass -subcp utf-8 -font /root/wendy.ttf  -fps 25 -vf scale=640:368,harddup,format=i420   -vo yuv4mpeg:file=>(x264 --demuxer y4m   --bitrate 515 --preset slow --profile baseline --level 30 --vbv-bufsize 10000 --vbv-maxrate 10000 --threads auto --input-res 640x368 --fps 25.000 --sar 507:500 --output output1.264 - 2>/dev/null) -ao null -nosound -noframedrop 

 

使用x264程序的格式:

x264 默认选项 -o 输出文件 输入文件 [长x宽]
输入支持格式:RAW/y4m/avi/avs(编译时可选)
输出支持格式:264/mkv/mp4(编译时可选)

 

三次编码,画质最好.但需要的时间长

1:第一次压缩,创建统计文件

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \ --merange 16   --non-deterministic --subme 1 --ref 1 --bframes 3  --trellis 1 --weightb  \ --direct auto --bitrate $(VideoBitrate) --qcomp 0.6 --threads auto  --stats "$(PassLogFile)" \  --pass 1 -o /dev/null 


2:按建立的统计文件压缩并输出,不覆盖统计文件

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \  --merange 16   --non-deterministic --subme 1 --ref 1 --bframes 3  --trellis 1 --weightb \ --direct auto --bitrate $(VideoBitrate) --qcomp 0.6 --threads auto  --stats "$(PassLogFile)" \ --pass 3 -o /dev/null


3:按建立的统计文件压缩,优化统计文件

 

 

 

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \
--merange 16   --non-deterministic --aq-mode 1 --aq-strength 1.0 --b-adapt 1 --ref 1 --subme 6 \
--psy-rd 1:0 --bframes 3  --trellis 1 --weightb --direct auto --bitrate $(VideoBitrate) --qcomp 0.6 \
 --threads auto  --stats "$(PassLogFile)" --pass 2 -o "$(DestFile)"


二次

编码测试视频流

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \
--merange 16   --non-deterministic --subme 1 --ref 1 --bframes 3  --trellis 1 --weightb \
--direct auto --bitrate $(VideoBitrate) --qcomp 0.6 --threads auto  --stats "$(PassLogFile)" \
 --pass 1 -o /dev/null

正式编码

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \
--merange 16   --non-deterministic --aq-mode 1 --aq-strength 1.0 --b-adapt 1 --ref 1 --subme 6 \
 --psy-rd 1:0 --bframes 3  --trellis 1 --weightb --direct auto --bitrate $(VideoBitrate) --qcomp 0.6 \
--threads auto  --stats "$(PassLogFile)" --pass 2 -o "$(DestFile)"


一次质量优先
,但这样没法保证码流,也就是讲,你不知道出来的文件有多大.

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \
--merange 16   --non-deterministic --aq-mode 1 --aq-strength 1.0 --b-adapt 1 --ref 1 --subme 6 \
--psy-rd 1:0 --bframes 3  --trellis 1 --weightb --direct auto --crf 25 --threads auto  -o "$(DestFile)"


一次大小优先
,但有可能动作快的地方.因为码流太少,感觉很不好.

$ x264  "$(SourceFile)" --no-psnr --no-ssim --keyint 250 --min-keyint 25 --level 40 --me hex \
--merange 16   --non-deterministic --aq-mode 1 --aq-strength 1.0 --b-adapt 1 --ref 1 --subme 6 \
--psy-rd 1:0 --bframes 3  --trellis 1 --weightb --direct auto --bitrate $(VideoBitrate) --qcomp 0.6 \
--threads auto  -o "$(DestFile)"

帧类型选项:

-I/–keyint <整数> 最大IDR帧间距,默认250
-i/–min-keyint <整数> 最小IDR帧间距,默认25
–scenecut <整数> 画面动态变化限,当超出此值时插入I帧,默认40
–pre-scenecut         更快,但低精度的画面动态检测,需要多线程,并且在启用多线程时自动打开.
-b/–bframes <整数>     在IP帧之间可插入的B帧数量最大值,范围0~16,默认0
-b-adapt 自适应B帧判定模式. 0:关闭;1:快速;2:优化(高B帧时速度大大下降),默认1
–b-bias <整数> 控制插入B帧判定,范围-100~+100,越高越容易插入B帧,默认0
–b-pyramid             允许B帧做参考帧
–no-cabac              关闭内容自适应二进制算术编码(CABAC,高效率的熵编码)(会提高速度,但严重影响质量)
-r/–ref <整数>         最大参考帧数,范围0~16,默认1
–no-deblock            关闭环路滤波(一种除马赛克算法)
-f/–filter <alpha:beta>设置环路滤波的AlphaC和Beta的参数,范围-6-6,默认都为0
–interlaced 启用纯交错模式(用于隔行扫描的源)

码率控制选项:

-q/–qp <整数> 固定量化模式并设置使用的量化值,范围0~51,0为无损压缩,默认26
-B/–bitrate <整数> 设置平均码率
–crf <整数> 质量模式,量化值动态可变
–vbv-maxrate <整数> 平均码率模式下,最大瞬时码率,默认0(与-B设置相同)
–vbv-bufsize <整数> 码率控制缓冲区的大小,单位kbit,默认0
–vbv-init <小数> 码率控制缓冲区数据保留的最大数据量与缓冲区大小之比,范围0~1.0,默认0.9
–qpmin <整数> 设置最小量化值,范围0~51,默认10
–qpmax <整数> 设置最大量化值,范围0~51,默认51
–qpstep <整数> 设置相邻帧之间的量化值差,范围0~50,默认4
–ratetol <小数> 平均码率模式下,瞬时码率可以偏离的倍数,范围0.1~100.0,默认1.0
–ipratio <小数> I帧和P帧之间的量化系数,默认1.40
–pbratio <小数> P帧和B帧之间的量化系数,默认1.30
–chroma-qp-offset <整数> 色度和亮度之间的量化差,范围-12~+12,默认0
–aq-mode <整数>     自适应量化模式,可以在1帧中不同宏块间重新分配量化值,能提高暗部细节,但会提高码率.与–qp不能同时使用,0关闭,1开启,默认1
–aq-strength <小数>   AQ强度,减小低细节宏块的量化值,默认1.0
-p/–pass <1|2|3> 多次压缩码率控制
1:第一次压缩,创建统计文件
2:按建立的统计文件压缩并输出,不覆盖统计文件,
3:按建立的统计文件压缩,优化统计文件
–stats <字符串> 统计文件的名称,默认"x264_2pass.log"
–qcomp <小数> 线性量化控制,0.0为固定码率,1.0为固定量化值,默认0.6,只用于2-pass和质量模式
–cplxblur <小数> 根据相邻帧平滑量化值比例的最大值,范围0~99.9,默认20.0,只用于2-pass和质量模式
–qblur <小数> 对统计文件结果平滑量化值比例的最大值,范围0~99.9,默认0.5,只用于2-pass
–zones <z0>/<z1>/… 分段量化,格式为:<开始帧>,<结束帧>,<选项>,可选项为:q=<整数>(量化值)或b=<小数>(码率倍数)
–qpfile <字符串>      强制帧的类型和量化值

分析选项:

-A/–analyse <字符串> 动态块划分方法,默认"p8x8,b8x8,i8x8,i4x4".可选项:p8x8/p4x4/b8x8/i8x8/i4x4;none/all(p4x4需要p8x8. i8x8需要–8x8dct)
–direct <字符串>       动态预测方式,默认"spatial".可选项:none/spatial/temporal/auto
–direct-8×8 <-1|0|1>   动态预测方式宏块大小. 0: 4×4、1: 8×8、-1:尽可能减小体积,默认1
-w/–weightb 允许B帧加权预测(可以减少相邻B帧质量低的影响)
–me <字符串> 对全像素块动态预测搜索的方式,默认"hex",可选项:
dia:菱形搜索,半径1 (快)
hex:正六边形搜索,半径2
umh:可变半径六边形搜索
esa:全面搜索(很慢,而且效果与umh几乎相同)
tesa: 用hadamard方式进行全面搜索,比esa更慢
–merange <整数> –me为umh/esa时的搜索半径,最大64,默认16
–mvrange <整数>     设置运动矢量的最大范围,默认-1(自动确定)
–mvrange-thread <整数>  线程间最小缓冲,用于一些播放器的兼容性,默认-1(自动确定)
-m/–subme <整数> 动态预测和分区方式,可选项1~9,默认6(与压缩质量和时间关系密切,1是7速度的四倍以上)
1:用全像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
2:用半像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
3:用半像素块进行动态搜索,对每个块再用质量模式进行四分之一像素块精确搜索
4:用快速模式进行四分之一像素块精确搜索
5:用质量模式进行四分之一像素块精确搜索
6:进行I、P帧像素块的速率失真最优化(rdo)
7:进行全部帧像素块的速率失真最优化
8:进行I、P帧运动矢量及块内部的速率失真最优化
9:进行全部帧运动矢量及块内部的速率失真最优化(质量最好)
–psy-rd 在rdo中使用Psy算法(一种心理视觉模型)和Psy-Trellis量化,可提高细节,但会大幅提高码率.需要-m>6.默认 ["1.0:0.0"].第一个值为Psy-rdo强度,第二个值为Psy-Trellis强度.
–mixed-refs 可以在一帧内使用不同参考帧
–no-chroma-me 不进行色度的动态预测
-8/–8x8dct 可以使用8×8的离散余弦变换(DCT)
-t/–trellis <整数>     Trellis量化,对每个8×8的块寻找合适的量化值,需要CABAC,默认0
0:关闭
1:只在最后编码时使用
2:一直使用
–no-fast-pskip 关闭快速P帧跳过检测
–no-dct-decimate       关闭P帧联合编码(可以增加细节,但也会增大体积)
–nr <整数> 噪声去除,范围0~100000,默认0
–deadzone-inter <整数>  设置inter模式下,亮度死区量化值,范围0~32,默认21.
–deadzone-intra <整数>  设置intra模式下,亮度死区量化值,范围0~32,默认11.
–cqm <字符串> 设置外部量化矩阵格式,默认"flat",可选项:jvt/flat
–cqmfile <字符串> 读取JM格式的外部量化矩阵文件,自动忽略其他–cqm*选项
–cqm4 <list> 设置4×4的量化矩阵,用逗号分开,范围1~255的16个整数
–cqm8 <list> 设置8×8的量化矩阵,用逗号分开,范围1~255的64个整数
–cqm4i/–cqm4p/–cqm8i/–cqm8p 设置I、P帧不同的量化矩阵
–cqm4iy/–cqm4ic/–cqm4py/–cqm4pc 设置亮度、色度不同的量化矩阵

视频标准化选项:
这些选项与编码无关,不过如果要用mp4之类的播放器,可以设置,风险自担

–overscan <字符串> 过扫描线,默认"undef"(不设置),可选项:show(观看)/crop(去除)
–videoformat <字符串> 视频格式,默认"undef",可选项:component/pal/ntsc/secam/mac/undef
–fullrange <字符串>    Specify full range samples setting,默认"off",可选项:off/on(我也不明白这是干什么的,请高手指点)
–colorprim <字符串>    原始色度格式,默认"undef",可选项:undef/bt709/bt470m/bt470bg,

smpte170m/smpte240m/film
–transfer <字符串>     转换方式,默认"undef",可选项:

undef/bt709/bt470m/bt470bg/linear,log100/log316/smpte170m/smpte240m
–colormatrix <字符串>  色度矩阵设置,默认"undef",undef/bt709/fcc/bt470bg,smpte170m/smpte240m/GBR/YCgCo
–chromaloc <整数> 色度样本指定,范围0~5,默认0

输入、输出选项:

-o/–output 指定输出文件
–sar width:height 设置采样比例设置,表示采样像素长宽比
–fps <小数|rational> 设定帧率
–seek <整数> 设定起始帧
–frames <整数> 最大编码帧数
–level <字符串> 类似于MPEG4里的"profile&level",表示编/解码等级
-v/–verbose 显示每一个帧的信息
–progress 显示编码进程
–quiet 安静模式
–no-psnr 关闭PSNR计算
–no-ssim            关闭SSIM计算
–threads <整数> 编码线程(使用多线程技术)
–thread-input 在自有线程中运行Avisynth
–non-deterministic   非确定性.可以稍微减少多线程的开销
–asm <整数> 覆盖CPU检测
–no-asm 关闭全部CPU优化指令
–visualize 显示编码帧信息图,和XVID类似
–dump-yuv <字符串>   保存帧为yuv格式
–sps-id <整数> 设置SPS和PPS的ID值,默认0
–aud 使用数据定义符号

 

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. reizhi
    Jan 25th, 2011 at 09:32
    Reply | Quote | #1

    正在研究这个,文章有用
    谢谢