FFmpeg
记录一些用到的ffmpeg命令,持续更新
# FFmpeg Filters
FFmpeg Filters (opens new window)
# 常用命令
命令 | 描述 |
---|---|
-i | 源文件 |
-y | 自动覆盖输出文件,无需用户确认 |
-loglevel debug | 输出调试日志 |
-r | 指定视频帧率 |
-re | 输入的速度以实时速率播放。可以模拟实时输入。 在某些情况下,如果不使用 -re 选项,ffmpeg 会尽快读取输入数据,而不考虑实际帧率,这可能导致处理速度过快。 |
-c:v , -vcodec | 视频编码 |
-c:a , -acodec | 音频编码 |
-f | 设置视频输出格式 |
-b | bitrate 设置比特率,缺省200kb/s |
-s | size 设置帧大小 格式为WXH 缺省160X128 |
-vf | 添加滤镜 |
-lavfi ,-filter_complex | 添加复杂滤镜 |
-stream_loop | -1 无线循环 |
-ignore_loop | 忽略重复 |
-loop | 重复 |
-ss | 当在 -i 前(表示跳过解码前),表示定位输入文件到position指定的位置。注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position(在之前)的可定位点。 position可以是以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值 |
-t | 当在 -i 前(表示跳过解码前),限制输入/输出的时间。 如果是用于限定输出文件,则表示写入多少时间数据后就停止。 以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值。 注意 -to 和 -t 是互斥的,-t 有更高优先级 |
-to | -to position (output) 只写入position时间后就停止,position可以是以秒为单位的数值或者 hh:mm:ss[.xxx]格式的时间值。 注意 -to 和 -t 是互斥的,-t 有更高优先级。 |
-itsoffset | 时间偏移 (手动延迟) |
-hide_banner | 隐藏 banner(横幅) |
-pix_fmt | 设置像素格式 |
-map | 媒体映射 例如 0✌️0 1🅰️0 ,将第一个源文件的视频和第二个源文件的音频合并 |
-qscale:v 1 | 设置视频质量,其中 1 是最高质量,表示无损压缩。 |
-qmin:v 1 | 设置最小视频质量,同样为最高质量。 |
-qmax:v 1 | 设置最大视频质量,同样为最高质量。 |
-vsync 0 | 禁用同步帧率。这意味着 ffmpeg 将按照源视频的帧率提取帧,而不会根据输出的帧速率进行同步 |
-v | quiet,减少输出 |
-an | 移除音频 |
-vn | 移除视频 |
# 滤镜
同一路的滤镜间用,进行分割,不同路的滤镜间用;进行分割
同一路的不同属性用:
# 变量
main_w(W):主画面的宽度 main_h(H):主画面的高度 overlay_w(w):水印宽度 overlay_h(h):水印高度
# 旋转 transpose
transpose=0:不进行旋转。
transpose=1:顺时针旋转 90 度。
transpose=2:逆时针旋转 90 度。
transpose=3:顺时针旋转 180 度。
# drawtext
drawtext是用来添加文字的滤镜名称;
fontfile:指定的字体文件;
textfile:需要添加的文字文件,也可以用text=‘Hello world’这种格式指定需要添加的文字,但是对于大量文字,显然文件更为方便;
x,y:文字左上角在画面上显示的位置;
fontsize:字体大小;
fontcolor:字体颜色,可以通过0xRRGGBB@0.X来指定文字的透明度,例如0xFF0000@0.5为红色半透明。
reload:为1时表示每帧重新load字体文件,可以实现实时更新显示文字的功能。
box=1: 合作边框
boxcolor=blue 盒子背景
# map选择
关于选择器
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "[0:v]transpose=1[main];[1:v]format=rgba,rotate='PI/2*t:c=0x00000000:ow=hypot(iw,ih):oh=ow'[watermark];[main][watermark]overlay=10:10" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
[0:v
] 表示选择第一个源的视频
[0:a]
表示选择第一个源的音频
[1:v]
表示选择第二个源的视频
[1:a]
表示选择第二个源的音频
[0:v]transpose=1[main]
表示选择第一个源的视频并生成新的流[main]
[1:v]format=rgba,rotate='PI/2*t:c=0x00000000:ow=hypot(iw,ih):oh=ow'[watermark]
表示选择第二个源的视频,处理后生成新的流[watermark]
[main][watermark]overlay
表示合并流[main]
和[watermark]
# 录制屏幕
ffmpeg -re -f gdigrab -i desktop -vcodec h264 -acodec aac -f flv "rtmp://192.168.1.100/live/livestream"
# 推流
-vcodec
等效 -c:v
-acodec
等效 -c:a
# 原视频复制 -vcodec copy
ffmpeg -re -i zz.mp4 -vcodec copy -acodec aac -f flv "rtmp://192.168.1.100/live/livestream"
# 原视频编码 -vcodec libx264
ffmpeg -re -i zz.mp4 -vcodec libx264 -acodec aac -f flv "rtmp://192.168.1.100/live/livestream"
# 指定位置播放 copy
ffmpeg -re -ss 00:12:35.100 -i zz.mp4 -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 指定位置播放 libx264
ffmpeg -re -ss 00:12:35.100 -i zz.mp4 -c:v copy -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 简单滤镜
-vf
# 添加滤镜必须编码 -c:v libx264
# 简单滤镜 - 文字居中
ffmpeg -re -i zz.mp4 -c:v libx264 -c:a aac -vf "drawtext=text='测试学习中...':x=(w-text_w)/2:y=(h-text_h)/2:fontsize=100:fontcolor=#F50909FF:fontfile=./simsun.ttc:text_shaping=1" -f flv "rtmp://192.168.1.100/live/livestream"
# 复杂滤镜
-filter_complex
等效 -lavfi
# 单个源
ffmpeg -re -i zz.mp4 -lavfi "drawtext=text='测试学习中...':x=(w-text_w)/2:y=(h-text_h)/2:fontsize=100:fontcolor=#F50909FF:fontfile=./simsun.ttc:text_shaping=1" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 多个源(-i)的情况下,使用复杂滤镜
ffmpeg -re -i zz.mp4 -i xy.png -lavfi "overlay=x=50:y=50" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 添加gif滤镜
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "overlay=x=20:y=20" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜随时间向右移动 让水印每秒向右移动20像素
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "overlay=x='t*20'" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜10秒循环,每秒移动100个像素
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "overlay=enable='mod(t,10)':x='100*mod(t,10)-w'" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜显示5秒
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "overlay=x=20:y=20:enable='lte(t,5)'" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜在5~10秒时间段内显示
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "overlay=x=20:y=20:enable='between(t,5,10)'" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 设置两个水印轮番出现 第一个水印显示4秒后消失,2秒后第二个水印显示4秒后消失。
# 第一个 overlay 滤镜:overlay=enable='lte(mod(t,10),4)',时长小于等于4时显示
# 第二个 overlay 滤镜:overlay=enable='gt(mod(t,10),6)', 时长大于6时显示
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -i xy.png -lavfi "overlay=enable='lte(mod(t,10),4)',overlay=enable='gt(mod(t,10),6)'" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 两个滤镜一个在左上角,一个在右上角
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -i xy.png -lavfi "overlay=x=0:y=0,overlay=W-w:y=0" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜旋转
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "[1:v]format=rgba,rotate='PI/2*t:c=0x00000000:ow=hypot(iw,ih):oh=ow'[out];[0:v][out]overlay=10:10" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 画面旋转,滤镜旋转
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "[0:v]transpose=1[main];[1:v]format=rgba,rotate='PI/2*t:c=0x00000000:ow=hypot(iw,ih):oh=ow'[out];[main][out]overlay=10:10" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜上下横跳
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "overlay=y='if(lte(mod(t,4),2),0,H-h)'" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
# 滤镜透明 在中央浮动
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "[1:v]colorchannelmixer=aa=0.5[valpha];[0:v][valpha]overlay=x=(W-w)/2+10*sin(2*PI*t/5):y=(H-h)/2+10*sin(2*PI*t/5)" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"
## 滤镜添加文字,缩放,底部移动
ffmpeg -re -i zz.mp4 -ignore_loop 0 -i g.gif -lavfi "drawtext=text='测试学习中...':x=(w-text_w)/2:y=(h-text_h)/2:fontsize=100:fontcolor=#F50909FF:fontfile=./simsun.ttc:text_shaping=1[txt];[1:v]scale=(iw/2):(ih/2),colorchannelmixer=aa=0.5[valpha];[txt][valpha]overlay=enable='mod(t,10)':x='(W/10)*mod(t,10)-w':y=H-h" -c:v libx264 -c:a aac -f flv "rtmp://192.168.1.100/live/livestream"