1、对图片进行裁剪
ffmpeg -i input.jpg -vf crop=iw/3:ih:20:0 caijian.jpg
PS:
crop=100:100:12:34
相同效果:
crop=w=100:h=100:x=12:y=34
2、视频增加文字水印
使用drawtext滤镜进行增加水印
参数 | 类型 | 说明 |
text | 字符串 | 文字 |
textfile | 字符串 | 文字文件 |
box | 布尔 | 文字区域背景框(缺省false) |
boxcolor | 色彩 | 展示字体区域块的颜色 |
font | 字符串 | 字体名称(默认为Sans字体) |
fontsize | 整数 | 显示字体的大小 |
x | 字符串 | 缺省为0 |
y | 字符串 | 缺省为0 |
alpha | 浮点数 | 透明度(默认为1),值从0~1 |
为视频增加一个水印
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
增加一个时间做为水印,在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow"
转成视频
ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" out.mp4
增加一个闪烁的水印,使用drawtext与enable配合即可,例如每3秒钟显示一次文字水印
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"
跑马灯效果
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"
3、视频增加图片水印
为视频添加图片水印可以使用movie滤镜
参数 | 类型 | 说明 |
filename | 字符串 | 输入的文件名,可以是文件,协议,设备 |
format_name, f | 字符串 | 输入的封装格式 |
stream_index, si | 整数 | 输入的流索引编号 |
seek_point, sp | 浮点数 | Seek输入流的时间位置 |
streams, s | 字符串 | 输入的多个流的流信息 |
loop | 整数 | 循环次数 |
discontinuity | 时间差值 | 支持跳动的时间戳差值 |
为视频增加图片水印
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" -x 500
其中一些参数说明
参数 | 说明 |
main_w | 视频单帧图像宽度 |
main_h | 视频单帧图像高度 |
overlay_w | 水印图片的宽度 |
overlay_h | 水印图片的高度 |
对应地可以将overlay参数设置成如下值来改变水印图片的位置:
水印图片位置 | overlay值 |
左上角 | 10:10 |
右上角 | main_w-overlay_w-10:10 |
左下角 | 10:main_h-overlay_h-10 |
右下角 | main_w-overlay_w-10:main_h-overlay_h-10 |
跑马灯效果
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"
4、生成画中画
在FFmpeg中,可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果
参数 | 类型 | 说明 |
x | 字符串 | X坐标 |
y | 字符串 | Y坐标 |
eof_action | 整数 | 遇到eof表示时的处理方式,默认为重复
|
shortest | 布尔 | 终止最短的视频时全部终止(默认false) |
format | 整数 | 设置output的像素格式,默认为yuv420
|
从参数列表中可以看到,主要参数并不多,但实际上在overlay滤镜使用中,还有很多组合的参数可以使用,可以使用一些内部变量,例如overlay图层的宽、高、坐标等。
显示画中画
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]"
缩放画面尺寸
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"
跑马灯
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay= x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"
5、视频多宫格
从前文中可以看出进行视频图像处理时,overlay滤镜为关键画布,可以通过FFmpeg建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布,下面就来看一下多宫格展示的例子:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4
1.2.3.4.mp4为文件路径,out.MP4为输出文件路径,通过nullsrc创建overlay画布,画布大小640:480,
使用[0:v][1:v][2:v][3:v]将输入的4个视频流去除,分别进行缩放处理,然后基于nullsrc生成的画布进行视频平铺,命令中自定义upperleft,upperright,lowerleft,lowerright进行不同位置平铺。
只叠加左上右上的命令:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4