https://code.videolan.org/videolan/x264/FFmpeg的详细介绍可以查看官网wiki提供的一些信息,这里只是列举具体几种常用的命令
#普通封装格式的转换
ffmpeg -i input_video.avi output_video.mp4
# yuv之间不同格式互转,如果出现花屏现象,注意查看尺寸是否设置正确。
ffmpeg -s 1280*720 -pix_fmt yuv444p -i input.yuv -pix_fmt yuv420p output.yuv
# MP4转换成yuv
ffmpeg -i input.MP4 -pix_fmt yuv420p output.yuv
# yuv转MP4
ffmpeg -s 1280*720 -pix_fmt yuv444p -i input.yuv output_video.mp4
# 添加色域信息 bt709
ffmpeg -i input.MP4 -pix_fmt yuv420p -color_range tv -colorspace bt709 -color_trc bt709 -color_primaries bt709 -y out.mp4
#bt2020 pq HLG使用:arib-std-b67
ffmpeg -i input.MP4 -pix_fmt yuv420p10le -color_range tv -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020 -y out.mp4
# yuv420p 换成yuvj420p color range 由limit变成full
我们平时见到的大部分是yuv420p的格式,是8bits的,其实还有很多10bit的
PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
对于10bit数据转码,一般适用于HDR视频上。其相应的格式转换可以参考一下关键参数:
ffmpeg -r 30 -s 1920x1080 -pix_fmt yuv420p10le -i input_HDR1920X1080_10bit.yuv -b:v 100M -c:v libx265 -crf 22 -x265-params "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc" -an -y -r 30 output.mp4
ffmpeg -threads 16 -r 0.5 -s 3840x2160 -pix_fmt yuv444p10 -i input.yuv -b:v 100M -vf scale=out_h_chr_pos=0:out_v_chr_pos=0,format=yuv420p10 -c:v libx265 -preset ultrafast -x265-params "keyint=24:colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc:master-display=G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,50):max-cll=0,0" -an -y -r 24 output.mp4
X265支持的转换曲线如下:
// 音频提取
ffmpeg -i input_video.mp4 -acodec copy -vn output_music.aac
-vn 舍去视频
// 视频提取
ffmpeg -i input_video.mp4 -vcodec copy -an output_video.mp4
-an 舍去音频
音频拼接:
ffmpeg -i 1.mp3 -i 2.mp3 -filter_complex '[0:0] [1:0] concat=n=2:v=0:a=1 [a]' -map [a] new.mp3
其中 concat=n=2 中的 2是指输入的mp3数量
// -ss 表示从源视频的起始时间开始切割,-t 持续时间。下面命令表示从第十秒开始,截取五秒钟
ffmpeg -ss 00:00:10 -t 00:00:05 -i input_video.mp4 -vcodec copy -acodec copy output_video.mp4
-vcodec 采用的编码器
ffmpeg -i input_video.mp4 -vcodec h264 output_video.mp4
mpeg4 编码器
ffmpeg -i input_video.mp4 -vcodec mpeg4 output_video.mp4
-b:v:均值码率,-maxrate:最大码率参数,-minrate:最小码率控制
ffmpeg -i input_video.mp4 -b:v 1000k output_video.mp4
-bufsize:码控缓存器,能使视频码率整体更加平稳
ffmpeg -i input_video.mp4 -b:v 1000k -bufsize 1000k output_video.mp4
// 码率不要超过阈值
ffmpeg -i input_video.mp4 -b:v 1000k -bufsize 1000k -maxrate 1500k output_video.mp4
# 更多设置信息
ffmpeg -i input.mp4 -c:v libx264 -x264opts “bframes=3:b-adapt=0” -profile:v baseline -level 4 -b:v 8000k -maxrate 8000k -minrate 8000k -bufsize 250k -nal-hrd cbr -g 50 -sc_threshold 0 output.mp4
-profile:v baseline -level 4 对应H.264标准文档 ISO-14496-Part10中描述的profile、level的信息
-g 50 每50个帧一个GOP
-x264opts “bframes=3:b-adapt=0” 2个P帧之间放3个B帧
-x264opts “bframes=0” GOP中没有B帧
-b:v 8000k 视频码率
-maxrate 8000k 最大平均码率
-minrate 8000k 最小平均码率 # [平均码率] <= [vbv-maxrate]
-bufsize 250k 编码的buffer大小 # [峰值码率] <= [vbv-maxrate] + [vbv-bufsize]
-nal-hrd cbr 设置编码模式cbr,跟觉具体信息也可以是vbr
-sc_threshold 0 控制场景切换关键帧
最大比特率crf模式:
ffmpeg -i input -c:v libx264 -crf 20 -maxrate 400k -bufsize 1835k -y output.mp4
这将会有效的将crf值锁定在20,但是如果输出码率超过400kbps,在这种情况下编码器会将质量降低到低于crf 20
CBR,VBR,ABR 模式编码其实就是对码率限制的条件数量。
CBR编码码比特率基本保持恒定在目标比特率,有利于流式播放。因此,maxrate和minrate保持一致。
VBR编码为简单场景分配较大的QP,为复杂的场景分配较小的QP,得到基本稳定的输出视觉质量。
同时ABR分配码率,使得在一定时间内,平均码率趋近于目标码率,这样可以控制输出文件大小,这点类似于CBR。
# 视觉质量稳定性 即时输出码率 输出文件大小 CBR 不稳定 恒定 可控 VBR 稳定 变化 不可控 ABR 基本稳定 变化 可控
ffmpeg –i input_video.mp4 –vcodec copy –an –f m4v output_flow.h264
# 码流转MP4
ffmpeg -f h264 -i output_flow.h264 -vcodec copy output_video
ffmpeg -i input_video.mp4 -vf scale=960:540 output_video.mp4
//等比例缩放,可以写成scale=960:-1
ffmpeg -i input_video.mp4 -vf "scale=iw*.5:ih*.5" -vcodec libx264 -y output_video.mp4
//长宽尺寸分别resize相应倍数
默认的缩放方法是双三次插值,我们可以通过设置参数来选择不同的插值方法
scale=960:540:sws_flags=bilinear
其他的方法选择可以参考官方文档
保持画面比例缩放,填充黑边:
1280X528缩放到640X480,如果要保持画面比例实际上应该是640×264,所以需要上下添加黑边。
ffmpeg -i input_1280X528.mp4 -vf "scale=640:264,pad=640:480:0:108:black" -y output.mp4
进行crop裁剪:
crop的参数格式为w:h:x:y,其中w、h为输出视频的宽和高,x(宽坐标)、y(高坐标)标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。如果x y不写的话,默认居中剪切
ffmpeg -i input.mp4 -vf crop=4100:4100:0:0 -y output.mp4
ffmpeg -i input_video.mp4 -i iQIYI_logo.png -filter_complex overlay output_video.mp4
位置:
logo位置右上角
ffmpeg -i input_video.mp4 -i logo.png -filter_complex overlay=W-w output_video.mp4
logo位置左下角:
ffmpeg -i input_video.mp4 -i logo.png -filter_complex overlay=0:H-h output_video.mp4
logo位置右下角:
ffmpeg -i input_video.mp4 -i logo.png -filter_complex overlay=W-w:H-h output_video.mp4
#添加缩略图
ffmpeg -i input_video.mp4 -i input_img.png -map 1 -map 0 -c copy -disposition:0 attached_pic -y output.mp4
# 字幕相关,举例:mkv的字幕封装格式和mp4的封装格式不同,中间需要进行转化.源1个视频轨道,两个音频轨道,三个字幕轨道 -s:s 字幕尺寸,一般和视频尺寸相同,不设置会出现文字过大过小等问题。dvd_subtitle MP4支持的字幕格式。输入源带有chapter text信息,直接关闭,否则会引入创建一个新字幕轨道(只选第二个字幕轨道)。
ffmpeg -fix_sub_duration -i video.mkv -s:s 1920x800 -c:v libx264 -crf 24 -c:a copy -c:s dvd_subtitle -map v:0 -map a:0 -map s:1 -map_chapters -1 -y video.mp4
语法:-vf delogo=x:y:w:h:t:show]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0。
ffmpeg -i input_video.mp4 -vf delogo=0:0:220:90:50:0 output_video.mp4
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒几帧
-q:v表示存储jpeg的图像质量,一般2是高质量。
可以设置开始的时间,和你想要截取的时间。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示开始时间
-t 表示共要多少时间。
#整个视频完整截取每一帧
ffmpeg -i video.mp4 /media/index_%d.png
# 从第几秒开始 逐帧截图10张图片
ffmpeg -i input.mp4 -ss 10.500 -vframes 10 output%d.png
# hdr视频,第30秒,经过tonemapping转换成SDR图片,存储一张
ffmpeg -ss 00:00:30.000 -i hdr.mp4 -vf zscale=transfer=linear,tonemap=hable,zscale=transfer=bt709,format=yuv420p -vframes 1 out30.png
合成序列帧,001.mp3为声音
ffmpeg -i 001.mp3 -i example_image.%3d.jpg -s 1024x768 -vcodec mpeg4 example_video.avi
无声音:
ffmpeg -iindex_%d.png -s 224x224 -vcodec libx264 -crf 0 origin_video.mp4
导出序列帧:
ffmpeg -i bc-cinematic-en.avi example.%d.jpg
# 将图片合成视频,并使用264的crf参数设置画面质量。
ffmpeg -i /media/crf00_index_%d.png -s 224x224 -vcodec libx264 -crf 36 /media/video_crf36.mp4
ffplay 是用于播放媒体文件的工具
ffplay INPUT -loop 10 // 循环播放 10 次
ffplay INPUT -ast 1 // 播放视频中的第一路音频流
ffplay INPUT -vst 1 // 播放视频中的第一路视频流
ffplay INPUT -x WIDTH -y HEIGHT // 指定宽高播放
...
播放原始音频/视频数据:
ffplay INPUT.pcm -f s16le -channels 2 -ar 44100
ffplay -f rawvideo -pixel_format yuv420p -s 480*480 INPUT.yuv(或 rgb)
指定播放过程中音视频同步的方式:
// 以音频(或视频、或外部时钟)作为基准进行音视频同步
ffplay INPUT -sync audio(或 video、ext)
关于 ffplay 的更多命令可以查看官网文档:ffplay Documentation
ffprobe 是用于查看媒体文件头信息的工具,常用命令有:
ffprobe INPUT
ffprobe -show_format INPUT
ffprobe -show_streams INPUT
ffprobe -show_frames INPUT
ffprobe -show_packets INPUT
...
show_format 用于查看文件格式、时长、码率等信息,较为简略;
show_streams 用于查看视频流、音频流的信息,包括编码器、帧率、采样率、宽高、像素格式、采样格式、码率、时长、总帧率等等,较为详细,是最常用的一个功能;
show_frames、show_packets 用于查看每一帧(解码前/解码后)的信息,可以配合 select_streams 使用;
关于 ffprobe 的更多命令可以查看官网文档:ffprobe Documentation
链接:https://www.jianshu.com/p/aac3e2a209c3
ffmpeg -i xhs_v1.mp4 -i xhs_v1_cnnscalex2.mp4 -lavfi "ssim="stats_file=stats_ssim.log";[0:v][1:v]"psnr="stats_psnr.log" -f null -
ssim举例,也可以使用psnr、 vmaf等指标. stats_file是将结果存在指定的文件stats_ssim.log中。-f null - : -f 指定详细的输出格式。最后一个‘-’,表示的输出信息的管道,必须有。详细可参考这里
他是一个音视频滤波器的相关参数,是一个很好的扩展库。一些功能时常用的,不如提取并设置尺寸后的视频帧,边缘检测、。这里提供两篇文章:一,二。该参数具有很多有意思的滤镜。比如说添加film grain这种噪声,film grain有多种多样,这里的设置的噪点很类似于高斯噪声。
ffmpeg -i inputvideo.mp4 -vf noise=c0s=7:allf=t -y output.mp4
不使用编码,只是用vf或者较为复杂的-filter_complex 进行dct滤波
ffmpeg -vcodec rawvideo -video_size 1920x1080 -i 1920X1080_video.yuv -filter_complex dctdnoiz=sigma=10 -vcodec rawvideo -an -f rawvideo 1920X1080_denoise.yuv
两个视频左右拼接,滑动窗口,用于对比两个视频的不同
ffmpeg -hide_banner -i input0.mp4 -i input1.mp4 -filter_complex [0:v]scale=2848X2160[s0];[s0]pad=iw*2:ih:iw:0[in0];[in0]crop=iw/2-iw/12:in_h:trunc((sin(t)-1)*iw/12+iw/4)*2:0[left];[left]pad=iw+2:ih:0:0:white[sl]; [1:v][sl]overlay=x=trunc((sin(t)-1)*W/6)*2[pic];[pic]drawtext=fontfile=arial.ttf:fontsize=80:fontcolor=white:text=' test_txt1 ':x=th:y=th*2,drawtext=fontfile=arial.ttf:fontsize=80:fontcolor=white:text=' test_txt2 ':x=(w-tw-th):y=th*2" -y output.mp4
通过 ffmpeg -filters可以查看他具体有那些参数
并且在官网有各个参数对应的详细说明
调整对比度、亮度、饱和度
使用vf 的eq
ffmpeg -i input.mp4 -vf eq=contrast=1:brightness=-0.2:saturation=1.5 -vcodec libx264 output.mp4
取值范围:contrast:-2.0-2.0,默认为0. brightness:-1.0-1.0,默认为0。saturation:0-3.0,默认为1. 还可以调整gamma校正值,gamma:0.1-10.0,默认为1.
锐化和模糊
cas和unsharp锐化
ffmpeg -i in.mp4 -vf cas=0.8:1 out.mp4
0.8 是强度,范围 [0, 1),数值越大锐化越强
ffmpeg -i in.mp4 -vf unsharp=5:5:0.8 out.mp4
范围 [0, +无穷),数值越大锐化越强
详细的模糊,去噪,锐化滤镜可以参考这里
更多的滤镜可以参考这里
具体可通过这里可查264的相关参数意义:
Encode/H.264 – FFmpeg
H.264有四种画质级别,分别是baseline, extended, main, high:
1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),
也支持CAVLC 和CABAC 的支持;
4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;
H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。
根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。
ffmpeg如何控制profile&level
举3个例子吧
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4
如果ffmpeg编译时加了external的libx264,那就这么写:
ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4
从压缩比例来说,baseline< main < high,对于带宽比较局限的在线视频,可能会选择high,但有些时候,做个小视频,希望所有的设备基本都能解码(有些低端设备或早期的设备只能解码 baseline),那就牺牲文件大小吧,用baseline。自己取舍吧
x264的详细基本知识点可查看:ffmpeg编码x264 - 简书, x264参数介绍_wmnmtm的专栏-CSDN博客
x264源码
编码效率和视频质量的取舍(preset, crf)
除了上面提到的,强行配置biterate,或者强行配置profile/level,还有2个参数可以控制编码效率。
一个是preset,一个是crf。
preset也挺粗暴,基本原则就是,如果你觉得编码太快或太慢了,想改改,可以用profile。
preset有如下参数可用:
ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.
编码加快,意味着信息丢失越严重,输出图像质量越差。
举个例子吧。 -x264opts:设置264专有参数
ffmpeg -i input -c:v libx264 -profile:v main -preset:v fast -level 3.1 -x264opts crf=18
//码控的三个参数,除了前面说的b:v参数 还有-crf和-qp。
tune
可根据输入情况(不同的视频类型等)调整设置(比如对画面作出一些优化),可选值有:
film – use for high quality movie content; lowers deblocking
animation – good for cartoons; uses higher deblocking and more reference frames
grain – preserves the grain structure in old, grainy film material(纹理调整)
stillimage – good for slideshow-like content(适用于 ppt 等内容)
fastdecode – allows faster decoding by disabling certain filters
zerolatency – good for fast encoding and low-latency streaming(适用于快速编码及低延迟流)
相应参数可以参考这里:preset medium -tune film -crf 24
对于x264转码中,提到了-x264opts 特有的参数,有些参数也可以像其他参数一样,直接设置
ffmpeg -i input -c:v libx264 -profile:v main -preset:v fast -level 3.1 -x264opts crf=18
等价于
ffmpeg -i input -c:v libx264 -profile:v main -preset:v fast -level 3.1 -crf 18
有些不能识别必须跟在x264opts参数后面,多个参数可以通过“:”来隔离,比如bframes参数代表着B帧数量为0的设置。
ffmpeg -i inputs.mp4 -c:v libx264 -x264opts qp=18:bframes=0
同个这是这三个参数,其实是详细预设编码器内部更加底层的参数,以下引用在这里, 详细的参数解释可以参考这篇
通过下面的命令安装x264编码器
sudo apt install x264
x264 --fullhelp
执行了x264的 fullhelp命令可以看到其所有参数,抽取这三个:
--profile Force the limits of an H.264 profile
Overrides all settings.
- baseline:
--no-8x8dct --bframes 0 --no-cabac
--cqm flat --weightp 0
No interlaced.
No lossless.
- main:
--no-8x8dct --cqm flat
No lossless.
- high:
No lossless.
- high10:
No lossless.
Support for bit depth 8-10.
- high422:
No lossless.
Support for bit depth 8-10.
Support for 4:2:0/4:2:2 chroma subsampling.
- high444:
Support for bit depth 8-10.
Support for 4:2:0/4:2:2/4:4:4 chroma subsampling.
--preset Use a preset to select encoding settings [medium]
Overridden by user settings.
- ultrafast:
--no-8x8dct --aq-mode 0 --b-adapt 0
--bframes 0 --no-cabac --no-deblock
--no-mbtree --me dia --no-mixed-refs
--partitions none --rc-lookahead 0 --ref 1
--scenecut 0 --subme 0 --trellis 0
--no-weightb --weightp 0
- superfast:
--no-mbtree --me dia --no-mixed-refs
--partitions i8x8,i4x4 --rc-lookahead 0
--ref 1 --subme 1 --trellis 0 --weightp 1
- veryfast:
--no-mixed-refs --rc-lookahead 10
--ref 1 --subme 2 --trellis 0 --weightp 1
- faster:
--no-mixed-refs --rc-lookahead 20
--ref 2 --subme 4 --weightp 1
- fast:
--rc-lookahead 30 --ref 2 --subme 6
--weightp 1
- medium:
Default settings apply.
- slow:
--direct auto --rc-lookahead 50 --ref 5
--subme 8 --trellis 2
- slower:
--b-adapt 2 --direct auto --me umh
--partitions all --rc-lookahead 60
--ref 8 --subme 9 --trellis 2
- veryslow:
--b-adapt 2 --bframes 8 --direct auto
--me umh --merange 24 --partitions all
--ref 16 --subme 10 --trellis 2
--rc-lookahead 60
- placebo:
--bframes 16 --b-adapt 2 --direct auto
--slow-firstpass --no-fast-pskip
--me tesa --merange 24 --partitions all
--rc-lookahead 60 --ref 16 --subme 11
--trellis 2
--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.
- film (psy tuning):
--deblock -1:-1 --psy-rd :0.15
- animation (psy tuning):
--bframes {+2} --deblock 1:1
--psy-rd 0.4: --aq-strength 0.6
--ref {Double if >1 else 1}
- grain (psy tuning):
--aq-strength 0.5 --no-dct-decimate
--deadzone-inter 6 --deadzone-intra 6
--deblock -2:-2 --ipratio 1.1
--pbratio 1.1 --psy-rd :0.25
--qcomp 0.8
- stillimage (psy tuning):
--aq-strength 1.2 --deblock -3:-3
--psy-rd 2.0:0.7
- psnr (psy tuning):
--aq-mode 0 --no-psy
- ssim (psy tuning):
--aq-mode 2 --no-psy
- fastdecode:
--no-cabac --no-deblock --no-weightb
--weightp 0
- zerolatency:
--bframes 0 --force-cfr --no-mbtree
--sync-lookahead 0 --sliced-threads
--rc-lookahead 0
整理成表格:
1 profile(档次)
序 | name | 名称 | 8x8dct | cqm | bframes | cabac | weightp | interlaced |
1 | baseline | 基线 | no | flat | 0 | no | 0 | no |
2 | main | 主要 | no | flat | 不限 | 不限 | 不限 | 不限 |
3 | high | 高 | 不限 | 不限 | 不限 | 不限 | 不限 | 不限 |
4 | high10 | 高10位 | 不限 | 不限 | 不限 | 不限 | 不限 | 不限 |
bframes:在I帧与P帧之间可插入B帧数量(Number of B-frames)的最大值,范围0-16。没有B帧时,一个典型的x264资料流有着像这样的帧类型:IPPPPP...PI。当设了--bframes 2
时,最多两个连续的P帧可以被B帧取代,就像:IBPBBPBPPPB...PI
cqm:自订量化矩阵(custom quantization matrices)。默认有flat和JVT。
weightp:使x264能够使用明确加权预测(explicit weighted prediction)来改善P帧的压缩。亦改善淡入/淡出的品质。模式越高越慢。
8x8dct:弹性8x8离散余弦转换(Adaptive 8x8 DCT)。
cabac:弹性内容的二进制算数编码(CABAC:Context Adaptive Binary Arithmetic Coder)。
interlaced:隔行扫描。
2 preset(预设)
序 | name | 名称 | b-adapt | bframes | direct | me | merange | partitions | rc-lookahead | ref | subme | trellis | weightp | other |
1 | ultrafast | 极快 | 0 | 0 | dia | none | 0 | 1 | 0 | 0 | 0 | 见单列一 | ||
2 | superfast | 超快 | dia | i8x8,i4x4 | 0 | 1 | 1 | 0 | 1 | 见单列二 | ||||
3 | veryfast | 很快 | 10 | 1 | 2 | 0 | 1 | no-mixed-refs | ||||||
4 | faster | 较快 | 20 | 2 | 4 | 1 | no-mixed-refs | |||||||
5 | fast | 快 | 30 | 2 | 6 | 1 | ||||||||
6 | medium | 中 | ||||||||||||
7 | slow | 慢 | 2 | auto | umh | 50 | 5 | 8 | ||||||
8 | slower | 较慢 | 2 | auto | umh | all | 60 | 8 | 9 | 2 | ||||
9 | veryslow | 很慢 | 2 | 8 | auto | umh | 24 | all | 60 | 16 | 10 | 2 | ||
10 | placebo | 2 | 16 | auto | tesa | 24 | all | 60 | 16 | 11 | 2 | slow-firstpass no-fast-pskip |
其中单列一:no-8x8dct, aq-mode 0, no-cabac, no-deblock, no-mbtree, no-mixed-refs ,scenecut0 , no-weightb
单列二:no-mixed-refs,no-mbtree
b-adapt:设定弹性B帧位置决策算法。此设定控制x264如何决定要放置P帧或B帧。
0:停用,总是挑选B帧。这与旧的 no-b-adapt设定相同作用。
1:“快速”算法,较快,越大的 --bframes值会稍微提高速度。当使用此模式时,基本上建议搭配 --bframes 16使用。
2:“最佳”算法,较慢,越大的 --bframes值会大幅降低速度。
注意:对于多重阶段(multi-pass)编码,仅在第一阶段(first pass)才需要此选项,因为帧类型在此时已经决定完了。
direct:"direct"动态向量(motion vectors)的预测模式。有两种模式可用:spatial和temporal。可以指定none来停用direct动态向量,和指定auto来允许x264在两者之间切换为适合的模式。
me:全像素(full-pixel)运动估计(motion estimation)的算法。
merange:控制运动估计的最大范围(单位是像素)。对于hex和dia,范围限制在4~16。对于umh和esa,它可以增加到超过默认值16来允许范围更广的动态搜寻,对于HD视讯和高动态镜头很有用。注意,对于umh、esa和tesa,增加merange会大幅减慢编码速度。
partitions:H.264视讯在压缩过程中划分为16x16的宏区块。这些区块可以进一步划分为更小的分割,这就是此选项要控制的部分。
rc-lookahead:设定mb-tree位元率控制和vbv-lookahead使用的帧数。最大允许值是250。对于mb-tree部分,增加帧数带来更好的效果但也会更慢。mb-tree使用的最大缓冲值是MIN(rc-lookahead, --keyint)。
ref:控制解码图片缓冲(DPB:Decoded Picture Buffer)的大小。范围是从0到16。总之,此值是每个P帧可以使用先前多少帧作为参照帧的数目(B帧可以使用的数目要少一或两个,取决于它们是否作为参照帧)。可以被参照的最小ref数是1。要注意的是,H.264规格限制了每个level的DPB大小。如果遵守Level 4.1规格,720p和1080p视频的最大ref数分别是9和4。
subme:设定子像素(subpixel)估算复杂度。值越高越好。层级1~5只是控制子像素细分(refinement)强度。层级6为模式决策启用RDO,而层级8为动态向量和内部预测模式启用RDO。RDO层级明显慢于先前的层级。
trellis:执行Trellis quantization来提高效率。
weightp:使x264能够使用明确加权预测(explicit weighted prediction)来改善P帧的压缩。亦改善淡入/淡出的品质。模式越高越慢。
no-8x8dct:停用弹性8x8离散余弦转换(Adaptive 8x8 DCT)。
aq-mode:弹性量化模式。没有AQ时,x264很容易分配不足的位元数到细节较少的部分。AQ是用来更好地分配视讯里所有宏区块之间的可用位元数。当aq-mode大于0并且subpel_refine<10. 为了减少qp_delta比特数,如果当前宏块QP与前一个宏块QP差值不大于1,那么当前宏块采用前一个宏块QP。
默认: 1
若关闭AQ,x264倾向于对低细节度的平滑区域使用过低码率,AQ可以更好把码率分配到各个宏块中. 该选项改变AQ重新安排码率的幅度:
参见:--aq-strength
no-cabac:停用弹性内容的二进制算数编码(CABAC:Context Adaptive Binary Arithmetic Coder)资料流压缩,切换回效率较低的弹性内容的可变长度编码(CAVLC:Context Adaptive Variable Length Coder)系统。大幅降低压缩效率(通常10~20%)和解码的硬件需求。
no-deblock:停用循环筛选(loop filter。亦称为持续循环去区块(inloop deblocker))。
no-mbtree:停用宏区块树(macroblock tree)位元率控制。使用宏区块树位元率控制会改善整体压缩率,借由追踪跨帧的时间传播(temporal propagation)并相应地加权。
no-mixed-refs:混合参照会以每个8x8分割为基础来选取参照,而不是以每个宏区块为基础。当使用多个参照帧时这会改善品质,虽然要损失一些速度。设定此选项会停用该功能。
scenecut:设定I/IDR帧位置的阈值(场景变更侦测)。
no-weightb:停用“加权”B帧的参照。
slow-firstpass:慢速pass。
no-fast-pskip:停用P帧的早期略过侦测(early skip detection)。非常轻微地提高品质,但要损失很多速度
3 tune(调校)
序 | name | 名称 | ref | bframes | deblock | psy-rd | aq-strength | other |
1 | film | 电影 | -1:-1 | |||||
2 | animation | 动画 | {Double if >1 else 1} | {+2} | 1:1 | 0.4: |
0.6 | |
3 | grain | 颗粒 | -2:-2 | 0.5 | no-dct-decimate、 deadzone-inter 6 、deadzone-intra 6、 ipratio 1.1、 pbratio 1.1、 qcomp 0.8 | |||
4 | stillimage | 静态图像 | -3:-3 | 2.0:0.7 | 1.2 | |||
5 | psnr | PSNR测试 | no | aq-mode 0 | ||||
6 | ssim | SSIM测试 | no | aq-mode 2 | ||||
7 | fastdecode | 快速解码 | no | no-cabac、 no-weightb、 weightp 0 | ||||
8 | zerolatency | 零延迟 | 0 | force-cfr、 no-mbtree 、sync-lookahead 0 sliced-threads 、rc-lookahead 0 |
ref:控制解码图片缓冲(DPB:Decoded Picture Buffer)的大小。范围是从0到16。总之,此值是每个P帧可以使用先前多少帧作为参照帧的数目(B帧可以使用的数目要少一或两个,取决于它们是否作为参照帧)。可以被参照的最小ref数是1。
bframes:在I帧与P帧之间可插入B帧数量(Number of B-frames)的最大值,范围0-16。
deblock:控制循环筛选(亦称为持续循环去区块(inloop deblocker))。
psy-rd:第一个数是Psy-RDO的强度(需要subme>=6)。第二个数是Psy-Trellis的强度(需要trellis>=1)。
aq-strength:弹性量化强度。设定AQ偏向低细节(平面)的宏区块之强度。。减少平坦区域块效应和纹理区域模糊效应的强度。强度越高,高频信息消减越多,应对平坦区域的块效益就越好,但是对于纹理区域的模糊就越大。一般来说画面动态较高就选低点的aq-strength(0.6-0.8),以免在平坦区域浪费太多码率,而损伤了动态区域;在静态画面较多的场景就选高点aq-strength(>=1.0),防止暗部因比特不够而产生色带。不允许为负数。0.0~2.0以外的值不建议。大小可以参考 tune的介绍。
no-dct-decimate:停用DCT Decimation。DCT Decimation会舍弃它认为“不必要的”DCT区块。这会改善编码效率,而降低的品质通常微不足道。
deadzone-inter/intra:设定inter/intra亮度量化反应区(deadzone)的大小。反应区的范围应该在0~32。此值设定x264会任意舍弃而不尝试保留细微细节的层级。非常细微的细节既难以看见又耗费位元数,舍弃这些细节可以不用浪费位元数在视讯的此类低收益画面上。反应区与--trellis不相容。
ipratio:修改I帧量化值相比P帧量化值的目标平均增量。越大的值会提高I帧的品质。
pbratio:修改B帧量化值相比P帧量化值的目标平均减量。越大的值会降低B帧的品质。当mbtree启用时(默认启用),此设定无作用,mbtree会自动计算最佳值。
qcomp:量化值曲线压缩系数。0.0是固定位元率,1.0则是固定量化值。当mbtree启用时,它会影响mbtree的强度(qcomp越大,mbtree越弱)。
qcomp在“高成本”的高运动帧与“低成本”的低运动帧之间权衡分配码率。极端设置qcomp=0.0趋于真正的恒定比特率,通常会造成高运动场景十分难看,而将宝贵的码率用于让低运动场景看着很完美。另一极端设置qcomp=1.0则能达到近似恒定量化参数(QP),并完全关闭x264的aq-mode和时间方向的RDO(mb-tree),于是码率被浪费在高复杂度的场景上,而高复杂度的场景无法用作未来远处的帧的参考,因为帧与帧之间的变化太大。
与mbtree一起使用时,也会影响mbtree与aq-strength的强度,而这两项倾向于将更多码率用于低复杂度的场景和宏块(macroblock)。(qcomp越大,则aq与mbtree越弱)。qcomp默认值为0.6,不要改动。
Macroblock Tree是一个基于macroblock的qp控制方法。MB Tree的工作原理类似于古典的qp compression,只不过qcomp处理的对象是整张frame而MB Tree针对的是每个MB进行处理。工作过程简单来说,是对于每个MB,向前预测一定数量的帧(该数量由rc-lookahead和keyint的较小值决定)中该MB被参考的情况,根据引用次数的多寡,决定对该MB使用何种大小的qp进行quantization。而qp的大小与被参考次数成反比,也就是说,对于被参考次数多的MB,264的解码器认为此对应于缓慢变化的场景,因此给与比较高的质量(比较低的qp数值)。至于视频的变化率与人眼感知能力的关系,这是一个基于主观测试的经验结果:视频变化率越大 人眼的敏感度越低,也就是说,人眼可以容忍快速变化场景的某些缺陷,但相对而言某些平滑场景的缺陷,人眼则相当敏感。注意此处说的平滑,指的是沿时间维度上场景的变化频率,而非普通意义上的像素域中的场景
总结:
x264码率控制主要是通过宏块树和qcompress两种方法控制的,qcompress码率控制作用强的时候,宏块树弱。(qcomp参数默认0.6,qcomp越大,qcomp控制码率越强,是比较老的码率控制方式),意思就是qcomp降低高复杂度场景的质量,节约出来的码率用来提升低复杂度场景的质量,主要是因为高复杂场景就算损失一点质量也是难以视觉察觉的,除非要帧帧去截图比较差不多。而且高复杂高动态场景分码率太多就太浪费了,而且从PSNR的好看角度来看也应该分配更少的码率给那些相对于静态场景的区域。看来qcomp=0.60(mbtree=0)保持不变就好了,除非对那些复杂帧使用了高斯模糊(大概是降噪降细节降码率)防止局部码率波动过大的情况下可以改变下qcomp的取值。
当设置了bitrate的时候,x264选取的ABR码率控制方式,当设置了固定qp的时候,x264选择的是CQP码率控制方式。当仅仅设置了maxbitrate-minbitrate的时候,x264选择的是CRF码率控制方式
double q;
if( h->param.rc.b_mb_tree )
{
double timescale = (double)h->sps->vui.i_num_units_in_tick / h->sps->vui.i_time_scale;
q = pow( BASE_FRAME_DURATION / CLIP_DURATION(rce->i_duration * timescale), 1 - h->param.rc.f_qcompress );
}
else
q = pow( rce->blurred_complexity, 1 - rcc->qcompress );
//分别是mb_tree 宏块树和qcompress两种方法码率控制,计算出来q。
qcompress根据模糊复杂度计算出q。
测试发现其实在复杂运动场景,qcomp调大一些画面会看得感觉更清晰一些,但是运动得时候块效应更严重
推荐值: 默认
参见:--cplxblur, --qblur
aq-mode:弹性量化模式。没有AQ时,x264很容易分配不足的位元数到细节较少的部分。AQ是用来更好地分配视讯里所有宏区块之间的可用位元数。
no-cabac:停用弹性内容的二进制算数编码(CABAC:Context Adaptive Binary Arithmetic Coder)资料流压缩,切换回效率较低的弹性内容的可变长度编码(CAVLC:Context Adaptive Variable Length Coder)系统。大幅降低压缩效率(通常10~20%)和解码的硬件需求。
weightp:使x264能够使用明确加权预测(explicit weighted prediction)来改善P帧的压缩。亦改善淡入/淡出的品质。模式越高越慢。
force-cfr:如果使用 ffms2 或 lavf 分离器,且输出文件不是 raw 格式,则从输入文件复制时间码。此选项关闭这个功能,并强制 x264 自己产生。当使用此选项时估计你也会设置 --fps。
no-mbtree:停用宏区块树(macroblock tree)位元率控制。使用宏区块树位元率控制会改善整体压缩率,借由追踪跨帧的时间传播(temporal propagation)并相应地加权。使用macroblock tree码率控制会记录时间方向上的各帧变化并相应权衡,因此在总体上改进了压缩。其概念与AQ同出一辙(AQ降低高复杂度区域的质量,将码率用于低复杂度的区域),但却是从时间方向上施行控制,因此与qcomp十分相似,而qcomp本身也影响mb-tree的强度。
对于多次编码模式,需要在现有stats文件基础上,增加一个大体积stats文件。
推荐值: 默认
参见:--rc-lookahead
MBtree的基本原理是分配更多的比特给时间轴上平滑的区域。这是基于人眼视觉系统的一个特性:视频变化率越大,人眼的敏感度就越低。也就是人眼可以容忍快速变化场景的一些缺陷,但对于平滑场景的少量误差,人眼也能敏感的察觉到。这里的平滑是时间轴上场景的变化频率,并不是指空间上的平坦区域。而衡量一个区域是否平滑的标准,在MBtree里面是用宏块被参考数来表达。当一个宏块被它后续很多帧中的宏块参考,那么这个宏块在时间轴上被认为是保持平滑的,应该足够重视,多分配些比特。而且如果一个宏块被后续很多帧的宏块参考,那么提升这一个宏块的质量,有助于提升后续很多宏块的质量,同时因为前向参考块的细节度足够,后续这些宏块都可以省出来一些比特,这充分发挥了码率控制比特分配的精髓。
为了计算各帧宏块之间的参考性,需要做运动估计,为了减少此处计算量,x264采用了在半分辨率(lowres)上做运动估计。
由于MBtree会统计各帧宏块之间的参考关系,因此在编码之前需要存储满很多帧(MIN(rc-lookahead, keyint)),这会引起很大的编码麇延时,不利于实时交互的媒体应用,因此在这种场景下,选择关闭MBtree。
MBtree打开的时候pbratio=1
sync-lookahead:设置用于线程预测的帧缓存大小。最大值是250。在第二遍及更多遍编码或基于分片线程时自动关闭。设为0将关闭线程预测,将减小延迟,但是以降低性能为代价。
sliced-threads:开启基于分片的线程。比默认方式质量低、效率低,但是没有编码延迟。
各种音频的转换方式可以参考官网
将音频添加到视频:流式复制
ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
省略该-map
选项将使用默认流选择。如果您的视频输入没有音频,这将工作。
此示例使用-codec copy
到流拷贝(再编码没有;质量被保留,这是快)。
该-shortest
选项将使output.avi
最短输入的持续时间相同。
将音频添加到视频:重新编码
如果您的输出不像原始格式,或者您想更改格式,则可以指定编码器:
ffmpeg -i video.avi -i audio.mp3 -c:v libx264 -c:a libvorbis -shortest output.mkv
手动选择特定的流
有时默认流选择不会给你你想要的结果。在这个例子中video.mp4
有视频和音频,audio.m4a
只有音频。用于-map
从以下位置选择视频video.mp4
和音频audio.m4a
:
ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
-map 0:v
- 从输入0
(第一个输入,即video.mp4
)选择v
视频流。
-map 1:a
- 从输入1
(第二个输入,即audio.m4a
)选择a
音频流(s)。
将两个音频输入混合/组合成一个
从中获取视频video.webm
,并使用amerge过滤器合并来自video.webm
和的音频audio.oga
:
ffmpeg -i video.webm -i audio.oga -filter_complex \ "[0:a][1:a]amerge=inputs=2[a]" \ -map 0:v -map "[a]" -c:v copy -c:a libvorbis -ac 2 -shortest out.webm
生成无声音频
您可以使用anullsrc过滤器创建一个无声音频流。该滤镜允许您选择所需的声道布局(单声道,立体声,5.1等)和采样率。
ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \ -c:v copy -shortest output.mp4
引用自:
如何使用ffmpeg将新音频(不混音)添加到视频中? - 问答 - 云+社区 - 腾讯云
音频:
-ab bitrate 设置音频码率 (128000)
-ar freq 设置音频采样率(16000)
-ac channels 设置通道 缺省为1(1)
-an 不使能音频纪录
-acodec codec 使用codec编解码(pcm_s16le)
音频拼接:
ffmpeg -i "concat:test1.mp3|test2.mp3" -acodec copy output.mp3
音频格式转换:
ffmpeg -i input_sound.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 output_sound.mp3
从视频中提取音频,并保存为MP3格式
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 sound.mp3
在ffmpeg中已经介绍了相关的码控方式,比如说crf,abr。这里引用一些文章,一,二,从x264内部的一些技术来解释不同码控使用的方法。这些方法是翻译该工程下的的x264工程的英文解释。
由于该文章解释已经有十几年的历史了,可能部分技术已经过时。
X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。这三种方式的优先级是ABR > CQP > CRF。
if ( bitrate ) rc_method = ABR;
else if ( qp || qp_constant ) rc_method = CQP;
else rc_method = CRF;
1. 默认情况下,MB-tree代替了qcomp用以计算各帧的复杂度,MB-tree是qcomp在宏块级的有效推广。MB-tree还替代了B帧QP固定偏移。
2. 现在自适应量化(Adaptive quantization)被用来在各帧之间分配质量(distribute quality);即使关闭MB-tree,帧内各MB也不再是恒定QP。
3. 为了提高码率控制精度,VBV(Video Buffer Verifier)运行在每行而不是每帧
x264码率控制的框架主要是三步,不同的码率控制方法,这三步的内容不同,但步骤一样:
1、根据复杂度在可控的范围内分配qp:二次编码是在第一遍编码的结果上在全局分配,ABR是基于mbtree分配
2、根据模式特性缩放qp:考虑输出码率,VBV等因素,
3、码率溢出控制
基于第一次编码得到的各帧数据,为每一帧生成一些统计信息,以助在第2趟编码中时为每一帧找到最好的量化参数,我们可以在保证文件总字节数的情况下,选择QP来尽可能的提升视觉质量,这可分为3步:
1. 在开始第二次编码前,选择帧间比特分配相关数,即:拿出一些空间用于在帧间灵活分配,空间大小的计算与目标码率无关,只是一个使用恒定QP编码的码率的比值,一般是0.6;或者这样解释:缺省的公式是“复杂性^0.6”,其中的复杂性是指在一个恒定QP下帧编码输出比特数(基于第一次的编码结果预测而来)。
2.在视频序列全局缩放步骤(1)中的结果,以满足总的编码输出文件大小要求。即:用(1)得出来的值和目标码率计算每一帧要使用的QP。使用VBV是方法之一,VBV是一个迭代的过程,因为使用VBV和QP会互相影响
3.现在开始编码。编码一帧后,按照还剩下的空间重新计算后面将要使用的QP(更新QP与帧输出比特数的预测误差)。如果第二次编码输出比特数总是偏离第一次编码的预测(通常是因为第二次使用了较慢,但性能较好的编码设置),在其后所有帧的qscales上都乘以这个误差的倒数,用来纠正这种偏离。此外还有一个短时补偿算法去防止视频开始阶段(此时没有多少数据做全局补偿)和结尾阶段(此时没有足够的帧数做反应)的结果偏离初始设置太远。
ABR
一次编码的和二次编码的区别在于一次编码在编码当前帧的时候没有任何有关当前帧的可借鉴信息,只有前面已编码帧的信息,只能一边编码一边控制码率。因此一次编码的复杂度是前向预测得到的。
(1)和二次编码类似,选择帧间比特分配相关数。但由于没有第一遍编码的结果做预测,x264运行一个1/2分辨率(lowres)的快速运算估计算法,使用SATD的结果来预测输出比特数。同时,I帧的相关数继承前面已编码I帧的结果。
(2)由于不知道后面帧的复杂度,所以只能根据前向帧做缩放来预测QP。缩放因子(Scaling factor)的选择标准是,如果使用此因子到后续所有帧,总的输出比特数满足预先要求,即测算的因数将定为如果应用于目前所有帧则可以满足目标比特率的数
(3)溢出补偿和2次编码相同。通过调节补偿力度,可以满足合理的文件大小,但质量会低于二次编码
CBR(VBV兼容)
(1)同ABR。
(2)缩放因子是基于局部平均(VBV buffer大小决定)而不是之前所有的帧。
(3)严格的溢出补偿,并在VBV快要满的时候有强制条件限制QP。注意:a.CBR的输出可能比所要求的比特数少一点;b.如果在所有机制过后,一个帧还是超出了VBV的限制,那它是不会被重新编码的
CRF
1、同ABR;
2、换算因子恒定为 –crf参数的值,即缩放因子是一个常量,--crf
3、没有溢出补偿
CQP
每帧QP只是简单的和帧类型相关。