概念
一个视频是由特定的视频容器,比如flv,hls,mp4包起来的多个流(一个或多个音频、视频、subtitle),每个流的编码可能不一样,比如视频的h265,音频的aac等。
视频处理的过程是:[分解视频=》多个输入路]=》[寻找合适解码器=》解码]=》过滤(缩放,裁剪)=》根据指定格式编码=》合流
FFMPEG
市面上最强的视频处理工具是ffmpeg,解决方案覆盖了多输入(实时流、设备、文件、http),处理包括多种编码的编解码和过滤, 到输出到文件或者实时流
使用:
./ffmpeg -i source.mov -t 100 -vcodec libx264 -acodec copy -vf scale="400:'if(gt(a,4/3),240,300)'" 1.gif
./ffmpeg -i x01.mov -ss 180 -fs 2048k -vcodec libx264 2m.mp4
./ffmpeg -i 2.mp4 -t 0.001 1.jpeg
./ffmpeg -i http://127.0.0.1:8020/help/2.mp4 -vcodec libx264 -acodec copy -vf scale="400:'if(gt(a,4/3),240,300)'" -b 192k 31.mp4
./ffmpeg -i x1.mov -t 100 -vcodec libx264 -f hls index.m3u8
./ffprobe -v error -show_entries stream 2.mp4
./ffprobe -v error -show_entries stream=width,height 2.mp4
./ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
./ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
./ffmpeg -i 2.mp4 -i logo.png -filter_complex "overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0" -vc libx264 over.mp4
./ffprobe -v error -show_entries stream=width,height,codec_name -of default=noprint_wrappers=1 31.mp4
./ffmpeg -i 13554301041685ec0e0365712.mp4 -ab 32k 32.aac
./ffmpeg -i 13554301041685ec0e0365712.mp4 -vf "scale=iw*min(205/iw\,100/ih):ih*min(205/iw\,100/ih),pad=205:100:(205-iw)/2:(100-ih)/2" 2.mp4
./ffmpeg -i 13554301041685ec0e0365712.mp4 -vf "scale=iw*min(200\,max(iw\,ih))/max(iw\,ih):ih*min(200\,max(iw\,ih))/max(iw\,ih)" 21.mp4
./ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output (16:9到4:3的通用命令)
./ffmpeg -i IMG_4940.MOV -strict -2 -vf scale=853:480,crop=480:480:186:0 out.mp4
./ffmpeg -v error -i 35377eb0d1b2caeaac70b019bb1274a6 -i logo.png -ss 20 -filter_complex overlay=x=W-w:y=H-h-5,fps=15,scale=trunc(iw*min(320\,max(iw\,ih))/max(iw\,ih)/2)*2:trunc(ih*min(320\,max(iw\,ih))/max(iw\,ih)/2)*2:flags=lanczos,palettegen -y palette.png
./ffmpeg -v error -i 35377eb0d1b2caeaac70b019bb1274a6 -i palette.png -i logo.png -ss 20 -lavfi "overlay=-w:-h,overlay=x=W-w:y=H-h-5,fps=15,scale=trunc(iw*min(320\,max(iw\,ih))/max(iw\,ih)/2)*2:trunc(ih*min(320\,max(iw\,ih))/max(iw\,ih)/2)*2:flags=lanczos [x]; [x][1:v] paletteuse" -y 1604271337db8bde001a48336883dcfc31b2a3ff68.gif
./ffmpeg -v error -i 35377eb0d1b2caeaac70b019bb1274a6 -i logo.png -filter_complex "overlay=x=W-w:y=H-h-5,scale=trunc(iw*min(320\,max(iw\,ih))/max(iw\,ih)/2)*2:trunc(ih*min(320\,max(iw\,ih))/max(iw\,ih)/2)*2" -ss 20 -y 1604271337db8bde001a48336883dcfc31b2a3ff68.mp4
左上角
./ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
右上角:
./ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w-5 pair2.mp4
左下角:
./ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=5:H-h-5 pair2.mp4
右下角:
./ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w-5:H-h-5 pair2.mp4
1、2秒后logo从左到右移动:
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0
2、2秒后logo从左到右移动后停止在左上角
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
3、每隔10秒交替出现logo。
ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4
编译的过程:
环境
export LIBRARY_PATH=/home/nemo/pkgs/media/binary/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/home/nemo/pkgs/media/binary/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/home/nemo/pkgs/media/binary/lib/pkgconfig
export CPLUS_INCLUDE_PATH=/home/nemo/pkgs/media/binary/include:$CPLUS_INCLUDE_PATH
export C_INCLUDE_PATH=/home/nemo/pkgs/media/binary/include:$C_INCLUDE_PATH
export CFLAGS="$CFLAGS -fPIC"
编译依赖库:
下载openarm libx264 libx265
./configure --prefix=/home/nemo/pkgs/media/binary;make install
编译ffmpeg:
./configure --prefix=/home/nemo/pkgs/media/binary --enable-static --enable-shared --enable-gpl --enable-libx264 --enable-libx265 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3;make install
部分参数说明:
流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
码率、帧率和文件大小
概述
码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。
帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
计算输出文件大小
(视频码率+音频码率) * 时长 /8 = 文件大小K
-acodec codec 使用codec编解码
关于实时流,一般andorid系统使用rtmp(Real Time Streaming Protocol), 而ios用hls(HTTP Live Streaming)
-preset的参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo
-tune的参数主要配合视频类型和视觉优化的参数,或特别的情况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。
tune的值有: film: 电影、真人类型;
animation: 动画;
grain: 需要保留大量的grain时用;
stillimage: 静态图像编码时使用;
psnr: 为提高psnr做了优化的参数;
ssim: 为提高ssim做了优化的参数;
fastdecode: 可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。
更多高级参数:
本机上的ffmpeg支持的编解码和视频容器有:
source path .
C compiler gcc
C library glibc
ARCH x86 (generic)
big-endian no
runtime cpu detection yes
yasm yes
MMX enabled yes
MMXEXT enabled yes
3DNow! enabled yes
3DNow! extended enabled yes
SSE enabled yes
SSSE3 enabled yes
AESNI enabled yes
AVX enabled yes
XOP enabled yes
FMA3 enabled yes
FMA4 enabled yes
i686 features enabled yes
CMOV is fast yes
EBX available yes
EBP available yes
debug symbols yes
strip symbols yes
optimize for size no
optimizations yes
static yes
shared yes
postprocessing support yes
new filter support yes
network support yes
threading support pthreads
safe bitstream reader yes
SDL support no
opencl enabled no
texi2html enabled no
perl enabled yes
pod2man enabled yes
makeinfo enabled no
makeinfo supports HTML no
Enabled programs:
ffmpeg ffprobe ffserver
External libraries:
iconv libopencore_amrwb libx264 libx265 lzma zlib
libopencore_amrnb
Enabled decoders:
aac avs flashsv2 mp3on4 pjs truemotion2
aac_fixed avui flic mp3on4float png truespeech
aac_latm ayuv flv mpc7 ppm tscc
aasc bethsoftvid fourxm mpc8 prores tscc2
ac3 bfi fraps mpeg1video prores_lgpl tta
ac3_fixed bink frwu mpeg2video ptx twinvq
adpcm_4xm binkaudio_dct g2m mpeg4 qcelp txd
adpcm_adx binkaudio_rdft g723_1 mpegvideo qdm2 ulti
adpcm_afc bintext g729 mpl2 qdraw utvideo
adpcm_aica bmp gif msa1 qpeg v210
adpcm_ct bmv_audio gsm msmpeg4v1 qtrle v210x
adpcm_dtk bmv_video gsm_ms msmpeg4v2 r10k v308
adpcm_ea brender_pix h261 msmpeg4v3 r210 v408
adpcm_ea_maxis_xa c93 h263 msrle ra_144 v410
adpcm_ea_r1 cavs h263i mss1 ra_288 vb
adpcm_ea_r2 ccaption h263p mss2 ralf vble
adpcm_ea_r3 cdgraphics h264 msvideo1 rawvideo vc1
adpcm_ea_xas cdxl hap mszh realtext vc1image
adpcm_g722 cfhd hevc mts2 rl2 vcr1
adpcm_g726 cinepak hnm4_video mvc1 roq vmdaudio
adpcm_g726le cljr hq_hqa mvc2 roq_dpcm vmdvideo
adpcm_ima_amv cllc hqx mxpeg rpza vmnc
adpcm_ima_apc comfortnoise huffyuv nellymoser rscc vorbis
adpcm_ima_dk3 cook iac nuv rv10 vp3
adpcm_ima_dk4 cpia idcin on2avc rv20 vp5
adpcm_ima_ea_eacs cscd idf opus rv30 vp6
adpcm_ima_ea_sead cyuv iff_ilbm paf_audio rv40 vp6a
adpcm_ima_iss dca imc paf_video s302m vp6f
adpcm_ima_oki dds indeo2 pam sami vp7
adpcm_ima_qt dfa indeo3 pbm sanm vp8
adpcm_ima_rad dirac indeo4 pcm_alaw screenpresso vp9
adpcm_ima_smjpeg dnxhd indeo5 pcm_bluray sdx2_dpcm vplayer
adpcm_ima_wav dpx interplay_acm pcm_dvd sgi vqa
adpcm_ima_ws dsd_lsbf interplay_dpcm pcm_f32be sgirle wavpack
adpcm_ms dsd_lsbf_planar interplay_video pcm_f32le shorten webp
adpcm_psx dsd_msbf jacosub pcm_f64be sipr webvtt
adpcm_sbpro_2 dsd_msbf_planar jpeg2000 pcm_f64le smackaud wmalossless
adpcm_sbpro_3 dsicinaudio jpegls pcm_lxf smacker wmapro
adpcm_sbpro_4 dsicinvideo jv pcm_mulaw smc wmav1
adpcm_swf dss_sp kgv1 pcm_s16be smvjpeg wmav2
adpcm_thp dvaudio kmvc pcm_s16be_planar snow wmavoice
adpcm_thp_le dvbsub lagarith pcm_s16le sol_dpcm wmv1
adpcm_vima dvdsub libopencore_amrnb pcm_s16le_planar sonic wmv2
adpcm_xa dvvideo libopencore_amrwb pcm_s24be sp5x wmv3
adpcm_yamaha dxa loco pcm_s24daud srt wmv3image
aic dxtory mace3 pcm_s24le ssa wnv1
alac dxv mace6 pcm_s24le_planar stl ws_snd1
alias_pix eac3 mdec pcm_s32be subrip xan_dpcm
als eacmv metasound pcm_s32le subviewer xan_wc3
amrnb eamad microdvd pcm_s32le_planar subviewer1 xan_wc4
amrwb eatgq mimic pcm_s8 sunrast xbin
amv eatgv mjpeg pcm_s8_planar svq1 xbm
anm eatqi mjpegb pcm_u16be svq3 xface
ansi eightbps mlp pcm_u16le tak xl
ape eightsvx_exp mmvideo pcm_u24be targa xma1
apng eightsvx_fib motionpixels pcm_u24le targa_y216 xma2
ass escape124 movtext pcm_u32be tdsc xsub
asv1 escape130 mp1 pcm_u32le text xwd
asv2 evrc mp1float pcm_u8 theora y41p
atrac1 exr mp2 pcm_zork thp yop
atrac3 ffv1 mp2float pcx tiertexseqvideo yuv4
atrac3p ffvhuff mp3 pgm tiff zero12v
aura ffwavesynth mp3adu pgmyuv tmv zerocodec
aura2 fic mp3adufloat pgssub truehd zlib
avrn flac mp3float pictor truemotion1 zmbv
avrp flashsv
Enabled encoders:
a64multi cljr libx264 pcm_s16be_planar prores tiff
a64multi5 comfortnoise libx264rgb pcm_s16le prores_aw tta
aac dca libx265 pcm_s16le_planar prores_ks utvideo
ac3 dnxhd ljpeg pcm_s24be qtrle v210
ac3_fixed dpx mjpeg pcm_s24daud r10k v308
adpcm_adx dvbsub movtext pcm_s24le r210 v408
adpcm_g722 dvdsub mp2 pcm_s24le_planar ra_144 v410
adpcm_g726 dvvideo mp2fixed pcm_s32be rawvideo vc2
adpcm_ima_qt eac3 mpeg1video pcm_s32le roq vorbis
adpcm_ima_wav ffv1 mpeg2video pcm_s32le_planar roq_dpcm wavpack
adpcm_ms ffvhuff mpeg4 pcm_s8 rv10 webvtt
adpcm_swf flac msmpeg4v2 pcm_s8_planar rv20 wmav1
adpcm_yamaha flashsv msmpeg4v3 pcm_u16be s302m wmav2
alac flashsv2 msvideo1 pcm_u16le sgi wmv1
alias_pix flv nellymoser pcm_u24be snow wmv2
amv g723_1 pam pcm_u24le sonic wrapped_avframe
apng gif pbm pcm_u32be sonic_ls xbm
ass h261 pcm_alaw pcm_u32le srt xface
asv1 h263 pcm_f32be pcm_u8 ssa xsub
asv2 h263p pcm_f32le pcx subrip xwd
avrp huffyuv pcm_f64be pgm sunrast y41p
avui jpeg2000 pcm_f64le pgmyuv svq1 yuv4
ayuv jpegls pcm_mulaw png targa zlib
bmp libopencore_amrnb pcm_s16be ppm text zmbv
cinepak
Enabled hwaccels:
Enabled parsers:
aac dca dvdsub h264 mpegvideo tak
aac_latm dirac flac hevc opus vc1
ac3 dnxhd g729 mjpeg png vorbis
adx dpx gsm mlp pnm vp3
bmp dvaudio h261 mpeg4video rv30 vp8
cavsvideo dvbsub h263 mpegaudio rv40 vp9
cook dvd_nav
Enabled demuxers:
aa daud ilbc mmf pcm_u24be sup
aac dcstr image2 mov pcm_u24le svag
ac3 dfa image2_alias_pix mp3 pcm_u32be swf
acm dirac image2_brender_pix mpc pcm_u32le tak
act dnxhd image2pipe mpc8 pcm_u8 tedcaptions
adf dsf image_bmp_pipe mpegps pjs thp
adp dsicin image_dds_pipe mpegts pmp threedostr
ads dss image_dpx_pipe mpegtsraw pva tiertexseq
adx dts image_exr_pipe mpegvideo pvf tmv
aea dtshd image_j2k_pipe mpjpeg qcp truehd
afc dv image_jpeg_pipe mpl2 r3d tta
aiff dvbsub image_jpegls_pipe mpsub rawvideo tty
amr dxa image_pictor_pipe msf realtext txd
anm ea image_png_pipe msnwc_tcp redspark v210
apc ea_cdata image_qdraw_pipe mtv rl2 v210x
ape eac3 image_sgi_pipe mv rm vag
apng epaf image_sunrast_pipe mvi roq vc1
aqtitle ffm image_tiff_pipe mxf rpl vc1t
asf ffmetadata image_webp_pipe mxg rsd vivo
asf_o filmstrip ingenient nc rso vmd
ass flac ipmovie nistsphere rtp vobsub
ast flic ircam nsv rtsp voc
au flv iss nut sami vpk
avi fourxm iv8 nuv sap vplayer
avr frm ivf ogg sbg vqf
avs fsb ivr oma sdp w64
bethsoftvid g722 jacosub paf sdr2 wav
bfi g723_1 jv pcm_alaw segafilm wc3
bfstm g729 live_flv pcm_f32be shorten webm_dash_manifest
bink genh lmlm4 pcm_f32le siff webvtt
bintext gif loas pcm_f64be sln wsaud
bit gsm lrc pcm_f64le smacker wsvqa
bmv gxf lvf pcm_mulaw smjpeg wtv
boa h261 lxf pcm_s16be smush wv
brstm h263 m4v pcm_s16le sol wve
c93 h264 matroska pcm_s24be sox xa
caf hevc mgsts pcm_s24le spdif xbin
cavsvideo hls microdvd pcm_s32be srt xmv
cdg hnm mjpeg pcm_s32le stl xvag
cdxl ico mlp pcm_s8 str xwma
cine idcin mlv pcm_u16be subviewer yop
concat idf mm pcm_u16le subviewer1 yuv4mpegpipe
data iff
Enabled muxers:
a64 dv ipod mpeg2svcd pcm_s32be spdif
ac3 eac3 ircam mpeg2video pcm_s32le spx
adts f4v ismv mpeg2vob pcm_s8 srt
adx ffm ivf mpegts pcm_u16be stream_segment
aiff ffmetadata jacosub mpjpeg pcm_u16le swf
amr filmstrip latm mxf pcm_u24be tee
apng flac lrc mxf_d10 pcm_u24le tg2
asf flv m4v mxf_opatom pcm_u32be tgp
asf_stream framecrc matroska null pcm_u32le truehd
ass framemd5 matroska_audio nut pcm_u8 uncodedframecrc
ast g722 md5 oga psp vc1
au g723_1 microdvd ogg rawvideo vc1t
avi gif mjpeg oma rm voc
avm2 gxf mkvtimestamp_v2 opus roq w64
bit h261 mlp pcm_alaw rso wav
caf h263 mmf pcm_f32be rtp webm
cavsvideo h264 mov pcm_f32le rtp_mpegts webm_chunk
crc hds mp2 pcm_f64be rtsp webm_dash_manifest
dash hevc mp3 pcm_f64le sap webp
data hls mp4 pcm_mulaw segment webvtt
daud ico mpeg1system pcm_s16be singlejpeg wtv
dirac ilbc mpeg1vcd pcm_s16le smjpeg wv
dnxhd image2 mpeg1video pcm_s24be smoothstreaming yuv4mpegpipe
dts image2pipe mpeg2dvd pcm_s24le sox
Enabled protocols:
async ffrtmphttp http mmsh rtmpt tcp
cache file httpproxy mmst rtp udp
concat ftp icecast pipe srtp udplite
crypto gopher md5 rtmp subfile unix
data hls
Enabled filters:
acompressor asettb decimate hqdn3d pixdesctest silenceremove
acrossfade ashowinfo deflate hqx pp sine
adelay asplit dejudder hstack pp7 smartblur
adrawgraph astats delogo hue psnr smptebars
aecho astreamselect deshake idet pullup smptehdbars
aemphasis atadenoise detelecine il qp spectrumsynth
aeval atempo dilation inflate random split
aevalsrc atrim displace interlace realtime spp
afade avectorscope drawbox interleave removegrain ssim
afftfilt bandpass drawgraph join removelogo stereo3d
aformat bandreject drawgrid kerndeint repeatfields stereotools
agate bass dynaudnorm lenscorrection replaygain stereowiden
ahistogram bbox earwax life reverse streamselect
ainterleave biquad ebur128 lowpass rgbtestsrc super2xsai
alimiter blackdetect edgedetect lut rotate swaprect
allpass blackframe elbg lut3d sab swapuv
allrgb blend eq lutrgb scale tblend
allyuv boxblur equalizer lutyuv scale2ref telecine
alphaextract cellauto erosion mandelbrot select testsrc
alphamerge channelmap extractplanes maskedmerge selectivecolor testsrc2
amerge channelsplit extrastereo mcdeint sendcmd thumbnail
ametadata chorus fade mergeplanes separatefields tile
amix chromakey fftfilt metadata setdar tinterlace
amovie codecview field movie setfield transpose
anequalizer color fieldmatch mpdecimate setpts treble
anoisesrc colorbalance fieldorder mptestsrc setsar tremolo
anull colorchannelmixer find_rect negate settb trim
anullsink colorkey flanger nnedi showcqt unsharp
anullsrc colorlevels format noformat showfreqs uspp
apad colormatrix fps noise showinfo vectorscope
aperms compand framepack null showpalette vflip
aphasemeter compensationdelay framerate nullsink showspectrum vibrato
aphaser concat framestep nullsrc showspectrumpic vignette
apulsator convolution fspp overlay showvolume volume
arealtime copy geq owdenoise showwaves volumedetect
aresample cover_rect gradfun pad showwavespic vstack
areverse crop haldclut palettegen shuffleframes w3fdif
aselect cropdetect haldclutsrc paletteuse shuffleplanes waveform
asendcmd curves hflip pan sidechaincompress xbr
asetnsamples dcshift highpass perms sidechaingate yadif
asetpts dctdnoiz histeq perspective signalstats zoompan
asetrate deband histogram phase silencedetect
Enabled bsfs:
aac_adtstoasc h264_mp4toannexb mjpeg2jpeg mov2textsub mpeg4_unpack_bframes remove_extradata
chomp hevc_mp4toannexb mjpega_dump_header mp3_header_decompress noise text2movsub
dump_extradata imx_dump_header
Enabled indevs:
dv1394 fbdev lavfi oss v4l2
Enabled outdevs:
fbdev oss v4l2
参考资料:
bitrate和QP都没有缺省值,一旦设置他们就表示要按照相应的码率控制方法进行编码,CRF有缺省值23,没有任何关于编码控制的设置时就按照CRF缺省值23来编码。
一般的使用建议:
CQP – 一般不推荐使用,在一些算法验证工作中会使用这种模式
CRF – 适合在关注一遍编码质量而输出文件大小或码率不是太紧要的场景下使用,一般网络压片使用CRF。
1 pass ABR – 适用于流媒体或者目标码率受限的实时应用场景。
2 pass VBR – 适用于有目标码率限制而又有时间可以进行二次编码的非实时应用。
2. CQP,恒定QP. 无缺省值
最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的。
参数qp_constant设置的是P帧的QP。I,B帧的QP根据f_ip_factor, f_pb_factor,计算得到。
连续多个B帧时,QP会渐增。 x264 YUV420格式 8比特采样的QP范围是[0, 51]。QP值越小,编码视觉质量越好。QP=0为无失真编码。
在研究编码算法的时候,一般会选用CQP方法,设定QP为24,28,32,36,40等(一般选4个QP值),编码得到RD曲线,然后比较算法优劣。
相同视觉质量时,CQP编码输出的文件会比CRF模式更大。一般而言CRF都能代替CQP方法,不过CQP因为完全不需要预测所以它会运行得更快一些。
帧的重要级别为:IDR帧 > I帧 > P帧 > 做参考的B帧 > 不做参考的B帧。QP可以依次增大。
QPmin,默认值: 0。定义X264可以使用的最小量化值。量化值越小,输出视频质量就越好。
当QP小于某一个值后,编码输出的宏块质量与原始块极为相近,这时没必要继续降低QP。
如果开启了自适应量化器(默认开启),不建议提高QPmin的值,因为这会降低平滑背景区域的视觉质量。
QPmax,默认值: 51。定义X264可以使用的最大量化值。默认值51是H.264规格中可供使用的最大量化值。
如果想要控制X264输出的最低品质,可以将此值设置的小一些。
QPmin和QPmax在CRF,ABR方法下是有效的,过低的设置QPmax,可能造成ABR码率控制失败。不建议调整这个参数。
QPstep,默认值: 4。设置两帧间量化值的最大变化幅度。
帧间QP变化,帧内宏块QP不变,输出码率未知,各帧输出视觉质量有变化(高QP低码率的情况下会更明显)。
3. CRF,恒定Rate Factor (码率系数)缺省值23
CQP是把某个量化值作为目标,bitrate是把某个输出文件大小作为目标,而CRF则是把某个输出“视觉质量”作为目标。
CRF可以提供跟QP一样的视觉质量,但是文件更小,CRF是通过降低那些“less important”帧的质量来达到此目的的。
“less important”的意思是那些过于耗费码率又难以用肉眼察觉的帧,比如复杂或者高速运行的场景。省下来的码率会分配给其它更有效的帧。
在X264编码器内部CRF和bitrate采用了相同的调整策略,只是它不遵循一个特定的输出码率。
它也是通过改变不同重要级别帧(I,P,B类型),以及帧内不同宏块类型(高速运动,复杂纹理,平坦区域)的QP值,以此来调整输出视觉质量。
和QP的范围一样RF的范围也是[0, 51]。其中0为无损模式,23为缺省,51质量最差。和QP一样的趋势。RF值加6,输出码率大概减少一半;减6,输出码率翻倍。
从主观上讲,18~28是一个合理的范围,18往往被认为从视觉上看是近似无损的。
帧间QP变化,帧内宏块QP变化,输出码率未知,各帧输出视觉质量基本恒定。
4. ABR, 恒定平均目标码率。想要选择这种码率控制方法,必须先设置bitrate。
X264中bitrate的单位是Kbps(K bit per second). --bitrate 128指的是设置目标码率为128Kbps, 这样一秒钟的数据量为 128/8比特 = 16K字节。
如果输入为352x288@15fps,相当于128Kbit/(352*288*15) = 0.086比特每像素。编码后每个像素平均分配不到0.1个比特。
与ABR相应的技术有CBR,VBR。这些码率控制技术首先都是在音频编码中采用,是解决音频编码采用什么样的比特率最优的问题。
CBR编码码比特率基本保持恒定在目标比特率,有利于流式播放。
CBR的缺点在于复杂场景码率不够用,简单场景码率浪费,因此编码内容的视觉质量不稳定。通常在较低比特率下,这种质量的变化会更加明显。
VBR编码为简单场景分配较大的QP,为复杂的场景分配较小的QP,得到基本稳定的输出视觉质量。
相对于CBR,在相同文件大小的条件下,VBR的输出结果要比CBR好的多,这有利于媒体下载和本地存储。
VBR的缺点在于输出码流大小不可控。同时对于复杂度恒定的内容(例如新闻播音)没什么优势。
ABR编码为简单场景分配较少的比特,从而留出足量的比特用于生成高质量的复杂部分。使得有限的比特数能够在不同的场景间合理分配,这类似于VBR。
同时ABR分配码率,使得在一定时间内,平均码率趋近于目标码率,这样可以控制输出文件大小,这点类似于CBR。
因此可以认为ABR是CBR和VBR的一种折中优化方案。
分析视频编码码率控制可以通过三个因素:
1. 视觉质量稳定性,利于视觉主观质量;
2. 即时输出码率,相当于每帧编码输出比特数;
3. 输出视频文件大小可控,利于传输,存储。
比较这三种码率控制方式如下:
# 视觉质量稳定性 即时输出码率 输出文件大小
CBR 不稳定 恒定 可控
VBR 稳定 变化 不可控
ABR 基本稳定 变化 可控 (即时码率变化,但一段时期内平均码率趋近目标码率)
在当前X264版本中(version 142),选用ABR需要注意两个设置,1.fps;2.输出帧pts计算。
1. fps。ABR会根据帧率来估算每帧的平均数据量,bitrate/fps为平均一帧数据量。
当输入视频源为YUV数据,需要显式的指定正确的帧率--fps,否则X264会用缺省的25fps来计算,有可能控制不到设定的目标码率。
2. pts计算。ABR算法中用到不同帧的pts作为帧间距离,如果没有设置输出帧的pts值,X264会报“non-strictly-monotonic PTS”警告。
编码出来的视频文件码率很小,根本达不到bitrate的设置,同时视频质量很差,几乎都为马赛克。两种方法解决这个问题:
a. 设置param.b_vfr_input = 0,这时用fps而不是timebase,timestamps来计算帧间距离
b. 在解码后主动更新pts, pic_out.i_pts++;
这两种方式都可以避免ABR码率控制失效的问题。