2022-1-19 更新
加入修改视频的 SAR和DAR的说明
2021-9-27 更新
加入对ffmpeg转换视频或动图到webp格式的说明
2021-5-11 更新
加入对俩个视频进行ssim和psnr评分的方法说明
2020-8-28 更新
加入 音视频变速滤镜 的说明
对滤镜图部分加入一些细节
2020-7-28 更新
加入 -f concat 的补充说明,file ‘1.mkv’ 的 file 要小写,不能大写
2020-6-28 更新
加入 filter_complex 用法详解
2020-6-11 更新
加入无损合并多个视频的方式
加入 ffmpeg concat 相关引用
2020-5-26 更新
大部分命令已测试。
有空可能写个窗口来包装这些命令
2022-1-19 更新
转码视频
ffmpeg
-y 设定不需要询问直接覆盖现有文件
-i input.mkv 输入文件是 input.mkv
-fs 10MB 输出文件最大为 10MB
-b 1.5M 输出视频+音频总共的码率为 1.5M,不建议使用这个
-r 30 设定输出帧率是 30,
-r 不能放在 -i 之前,不然会改变 input.avi 的帧率,并且改变视频时长
-vf fps=30 设定输出帧率是 30,效果与-r一样,区别在于这里使用了过滤器
-profile:v high 设定视频编码profile为high,压缩比例 baseline < main < high
-preset:v slow 设定视频编码preset为slow,由快到慢,可选 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow,placebo
-ss 10 设定从第10s开始转换,格式也可以为 HH:MM:SS
-t 20 设定转换时长为20s,格式也可以为 HH:MM:SS
-to 20 设定到第20s结束,格式也可以为 HH:MM:SS
-s 368x208 设定输出分辨率为 368x208
-vf scale=960:540 设定输出分辨率为 960x540,如果是 960:-1,则是按原始宽高比变化,效果与-s一样,区别在于这里使用了过滤器
-aspect 16:9 设定输出比例为 16:9
-pix_fmt yuv420p 设定输出视频帧色彩格式为yuv420p,需要视频编码器支持
-b:v 1500K 输出视频码率是 1500K
-c:v hevc_nvenc 设定视频编码器为 nvidia硬件h265编码器,与-vcodec选项相同,或者设定为 copy 代表复制原始视频流
-b:a 98K 输出音频码率是 98K
-c:a aac 设定音频编码器为 aac,与-acodec选项相同,或者设定为 copy 代表复制原始音频流,
-maxrate 4000K 设置视频最大码率为4000K
-minrate 500K 设置视频最小码率为500K
-bufsize 4000K 设置码率控制缓冲区大小为4000K
-c copy 设定视频编码器和音频编码器为复制
-ar 44100 设定音频采样率为 44100
-ac 1 设定输出声道为1
-vn 关闭视频输出
-an 关闭音频输出
-vol 200 输出音频音量为原来的200%
-crf 21 以crf方式控制码率
-qp 21 以qp的方式控制码率
-g 300 gop_size,设定一组帧是多少帧,这里设定为300,可以认为是每个299帧才会遇到一帧关键帧,据说可以提高压缩率
-qcomp 0.8 设定码率变化幅度,默认为0.6,最小为0,最大为1,值越大码率变化越快,反之变化越慢,建议设定为0.8
-croptop 16 设置顶部切除像素数量
-cropbottom size –cropleft size –cropright size 跟上面选项相似
-padtop 16 设置顶部像素数量
-padbottom size –padleft size –padright size 跟上面选项相似
–padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如000000代表黑色)
-title abc 设置标题为abc
-author abc 设置作者为abc
-copyright abc 设置版权为abc
-comment abc 设置评论为abc
output.mkv 输出文件是 output.mkv
去除源视频中音频
ffmpeg -i 1.mkv -vcodec copy -an 2.mkv
去除源视频中的视频
ffmpeg -i 1.mkv -acodec copy -vn 2.aac
合并音视频
ffmpeg -i 2.mkv -i 2.aac -vcodec copy -acodec copy 3.mkv
20s开始,持续10s,每隔1s抽取1帧转换为图片,
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 pic-%03d.jpg
序列帧与视频的相互转换
把darkdoor.[001-100].jpg序列帧和001.mp3音频文件利用mpeg4编码方式合成视频文件darkdoor.avi:
ffmpeg -i 001.mp3 -i darkdoor.%3d.jpg -s 1024x768 -vcodec mpeg4 darkdoor.avi
还可以把视频文件导出成jpg序列帧:
ffmpeg -i input.avi im.%d.jpg
将一张图像转换为一段视频
ffmpeg.exe -r 60 -loop 1 -i .\a.png -c:v libx264 -t 5 a.mp4
-r 60 指定源帧率为60
-loop 1 不断循环第一幅图
-t 5 输出的视频持续5s
二次编码,需要执行两次命令,第一遍生成统计信息,第二遍压缩
ffmpeg -i a.mkv -c libx264 -pass 1 b.mkv
ffmpeg -i a.mkv -c libx264 -pass 2 b.mkv
合并俩个视频文件(不带声音的)
ffmpeg -i .\a.mp4 -i .\b.mkv -filter_complex '[0:0] [1:0] concat=n=2:v=1 [v]' -map '[v]' -c:v libx264 o.mkv
合并三个视频文件(带声音的)
ffmpeg -i .\a.mp4 -i .\b.mkv -i .\c.mkv -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' -c:v libx264 o.mkv
[X:0] X代表第几个视频,0代表视频通道
[X:0] X代表第几个视频,1代表音频通道
concat=n=A:v=B:a=C 代表要合并A个视频,输出B条视频流,C条音频流
[v] [a] 分别是新的视频流,新的音频流的名字
-map '[v]' -map '[a]' 要求输出文件包含名字为 v 和 a 的流
无损合并俩个视频,但要求这俩个视频有同样的分辨率,同样的编码器,同样的编码等级,同样的色彩标准,同样的像素格式,等等东西
要求不同的只有时长
新建一个文件 c.txt,填入
file '1.mkv'
file '2.mkv'
注意文件名要用单引号包围,而不是双引号,file要小写,不能大写,然后执行
ffmpeg -f concat -i c.txt -c copy o.mkv
如果不符合要求,命令不会提前失败报错,但o.mkv的一部分将会看不到,即合并失败。
音频拼接,上面那个拼接时需要视频,这里是单纯的音频拼接
ffmpeg -i "concat:a.flac|b.flac" c.flac
在音频前面填充静音数据(延迟音频)
ffmpeg.exe -i a.aac -c aac -filter_complex "adelay=5000|5000" b.aac
adelay=5000|5000 代表左右声道都延迟5000毫秒,就是5秒
在音频后面填充静音数据
ffmpeg -i a.aac -ar 44100 -filter_complex "apad=pad_len=4410000" b.aac
pad_len 是按采样帧来计算的,要注意
在音频后面填充10s
4410000 由采样率 44100 * 时间 10 秒而来
第二种是自动填充到视频长度
ffmpeg -i a.mkv -i b.aac -filter_complex "[1:0]apad" -shortest c.mkv
-filter_complex 复杂用法,拼接不同分辨率,不同sar的视频
有如下几个视频,输出目标分辨率是 640x480,sar是 1
1.mkv size=720x480 sar=1.33
2.mkv size=640x480 sar=1
3.mkv size=720x480 sar=1.33
4.mkv size=640x480 sar=1
ffmpeg -i 1.mkv -i 2.mkv -i 3.mkv -i 4.mkv -filter_complex "[0:v]scale=640x480,setsar=1[v0];[2:v]scale=640x480,setsar=1[v2];[v0][1:v][v2][2:v]concat=n=3:v=1[v]" -map "[v]" -c:v libx264 o.mkv
在一个filter_complex表达式里面:";"分隔着每一个滤镜链,","分隔着每一个滤镜。
[0:v]scale=640x480,setsar=1[v0] 这是一个滤镜链,里面包含俩个滤镜,一个是scale滤镜(用于调整分辨率),一个是setsar滤镜(用于调整sar),使用","分隔后,前一个滤镜的输出会变成后一个滤镜的输入
"[0:v]scale=640x480,setsar=1[v0];[2:v]scale=640x480,setsar=1[v2];[v0][1:v][v2][2:v]concat=n=3:v=1[v]" 这是一个滤镜图,里面包含3条滤镜链,分别是
[0:v]scale=640x480,setsar=1[v0]
[2:v]scale=640x480,setsar=1[v2]
[v0][1:v][v2][2:v]concat=n=3:v=1[v]
每条滤镜链的前面是该滤镜链的输入,输入是一个已存在的流的名字,后面则是滤镜链的输出,输出是滤镜处理后得到的流的名字(自定义的)。
[0:v] 代表选取第一个文件的视频流,也可以使用[0:0];[0:a] 代表选取第一个文件的音频流,也可以使用[0:1]
一条滤镜链内,使用逗号","对每个滤镜进行分隔。
后面的滤镜链可以使用前面滤镜链的输出。多个滤镜链使用分号";"分隔。
-map "[v]" 代表输出里面要包含一条名字为 v 的流。
补充1:如果某个滤镜有多个参数需要用逗号","分隔,可以使用反斜杠"\"对逗号进行转义,避免被识别为滤镜分隔符,
对视频进行变速,通过调整pts实现
对视频加速2倍
ffmpeg -i input.mkv -an -filter_complex "setpts=0.5*PTS" output.mkv
对视频减速2倍
ffmpeg -i input.mkv -an -filter_complex "setpts=2*PTS" output.mkv
对音频进行变速,缺点是会改变音色
减慢2倍
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
单个过滤器调节域只有[0.5, 2.0],要更高速度倍率,可以使用堆叠方法。
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
同时对视频和音频进行变速
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
注意要求原视频和输出的视频分辨率要一样,如果不一样需要使用 -s WxH 参数修改原视频的分辨率
对源视频和目标视频逐帧计算ssim分数并输出到日志文件ssim.log中
ffmpeg -i input.mkv -i output.mkv -lavfi ssim="stats_file=ssim.log" -f null -
注意要求原视频和输出的视频分辨率要一样,如果不一样需要使用 -s WxH 参数修改原视频的分辨率
对源视频和目标视频逐帧计算psnr分数并输出到日志文件psnr.log中
ffmpeg -i input.mkv -i output.mkv -lavfi psnr="stats_file=psnr.log" -f null -
修改视频的SAR和DAR
ffmpeg -i input.mp4 -vf setsar=sar=1/1,setdar=dar=16/9 out.mp4
DAR - display aspect ratio,显示宽高比。最终播放画面的宽高比,如果原视频看起来压扁了,一般改这个就行了。
SAR - Sample aspect ratio,采样纵横比。一般使用1:1或不修改
webp转换相关
直接转换视频或动图到webp,默认是有损的
ffmpeg -i 1.apng 2.webp
转换视频或动图到webp,无损方式
ffmpeg -i 1.apng -lossless 1 2.webp
转换视频或动图到webp,有损方式,同时指定压缩级别为3(范围是0-6,默认为4),质量为70(范围是0-100,默认75)
ffmpeg -i 1.apng -compression_level 3 -q:v 70 2.webp
下面是网上找到的,尚未测试
// 音频混合,调整第1个音频的音量和第2个音频的音量
ffmpeg -i ../../video/output.mp3 -i ../../video/new1.mp3 -filter_complex "[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5[a0]; [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.9[a1]; [a0][a1]amerge=inputs=2[aout]" -map "[aout]" -ac 2 ../../video/mix_v0.5.mp3
// 音频混合,调整第1个音频的音量和第2个音频的音量
ffmpeg -i ../../video/output.mp3 -i ../../video/new2.mp3 -filter_complex "[0:a]aformat=sample_fmts=fltp:channel_layouts=stereo,volume=0.5[a0]; [1:a]aformat=sample_fmts=fltp:channel_layouts=stereo,volume=0.9,adelay=5000|5000|5000,apad[a1]; [a0][a1]amerge=inputs=2[aout]" -shortest -map "[aout]" -ac 2 ../../video/mix_new1.mp3
// apad -shortest 是使音频长度为最长
// adelay 延时播放时间
// 音视频混合,调整第1个音频的音量和第2个音频的音量
ffmpeg -i a.mp4 -i b.mp3 -filter_complex "[0:a]aformat=sample_fmts=fltp:channel_layouts=stereo,volume=0.4[a0]; [1:a]aformat=sample_fmts=fltp:channel_layouts=stereo,volume=0.9,adelay=5000|5000|5000[a1]; [a0][a1]amix=inputs=2:duration=first[aout]" -map [aout] -ac 2 -c:v copy -map 0:v:0 c.mp4
或者
ffmpeg -i a.mp4 -i b.mp3 -filter_complex [0:a]aformat=sample_fmts=fltp:channel_layouts=stereo,volume=0.4[a0];[1:a]aformat=sample_fmts=fltp:channel_layouts=stereo,volume=0.9,adelay="5000|5000|5000"[a1];[a0][a1]amix=inputs=2:duration=first[aout] -map [aout] -ac 2 -c:v copy -map 0:v:0 c.mp4 d.mp4
更多ffmpeg filter 请看 https://ffmpeg.org/ffmpeg-filters.html
更多视频concat 请看 http://trac.ffmpeg.org/wiki/Concatenate
更多滤镜图、滤镜链、滤镜细节请看
音视频变速相关:
psnr和ssim:
ffmpeg转换mp4到webp:https://zhuanlan.zhihu.com/p/149353021
SAR和DAR参数相关: