ffmpeg 滤镜

概念

所谓的滤镜其实就是在原始的视频或者图像上增加filter

按照处理数据的类型,通常多媒体的 filter 分为:

⚫ 音频 filter

⚫ 视频 filter

⚫ 字幕 filter

另一种按照处于编解码器的位置划分:

⚫ prefilters: used before encoding

⚫ intrafilters: used while encoding (and are thus an integral part of a video codec)

⚫ postfilters: used after decoding

FFmpeg 中 filter 分为:

⚫ source filter (只有输出)

⚫ audio filter

⚫ video filter

⚫ Multimedia filter

⚫ sink filter (只有输入)

除了 source 和 sink filter,其他 filter 都至少有一个输入、至少一个输出。

视频裁剪

将输入视频帧的宽度和高度从 x 和 y 值表示的位置裁剪到指定的宽度和高度;

x 和 y 是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。

如果使用了可选的 keep_aspect 参数,将会改变输出 SAR(样本宽比)以补偿新的 DAR(显示长宽比)

语法:crop=ow[:oh[:x[:y[:keep_aspect]]]]

常见操作

(1)裁剪 100x100 的区域,起点为(12,34).

crop=100:100:12:34

相同效果:

crop=w=100:h=100:x=12:y=34

(2)裁剪中心区域,大小为 100x100

crop=100:100

(3)裁剪中心区域,大小为输入视频的 2/3

crop=2/3*in_w:2/3*in_h

(4)裁剪中心区域的正方形,高度为输入视频的高

crop=out_w=in_h

crop=in_h

(5)裁剪偏移左上角 100 像素

crop=in_w-100:in_h-100:100:100

(6)裁剪掉左右 10 像素,上下 20 像素

crop=in_w-2*10:in_h-2*20

(7)裁剪右下角区域

crop=in_w/2:in_h/2:in_w/2:in_h/2

添加水印

文字水印

(1)将文字的水印加在视频的左上角:

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"

将字体的颜色设置为绿色:

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"

如果想调整文字水印显示的位置,调整 x 与 y 参数的数值即可。

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello

world':fontcolor=green:x=400:y=200"

修改透明度

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello

world':fontcolor=green:x=400:y=200:alpha=0.5"

(2)文字水印还可以增加一个框,然后给框加上背景颜色:

ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello

world':fontcolor=green:box=1:boxcolor=yellow"

Version:0.9 StartHTML:0000000105 EndHTML:0000002877 StartFragment:0000000141 EndFragment:0000002837

(3)文字水印以本地时间作为水印内容:

可以在 drawtext 滤镜中配合一些特殊用法来 完成,在 text 中显示本地当前时间,格式为年月日时分秒的方式,

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,否则时间不对。

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

Version:0.9 StartHTML:0000000105 EndHTML:0000003366 StartFragment:0000000141 EndFragment:0000003326

(4)在个别场景中,需要定时显示水印,定时不显示水印,这种方式同样可以配合 drawtext 滤镜进

行处理,使用 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)"

在使用 ffmpeg 转码存储到文件时需要加上-re,否则时间不对。
Version:0.9 StartHTML:0000000105 EndHTML:0000002917 StartFragment:0000000141 EndFragment:0000002877

(5)跑马灯效果

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"

修改字体透明度,修改字体颜色

ffplay -i input.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='liaoqingfu':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha= 0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"

图片水印

FFmpeg 除了可以向视频添加文字水印之外,还可以向视频添加图片水印、视频跑马灯等

样例:

ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]"

output.mp4

➢ 原始视频文件路径:input.mp4

➢ 水印图片路径:logo.png

➢ 水印位置:(x,y)=(10,10)<=(left,top)距离左侧、顶部各 10 像素;

➢ 输出文件路径:output.mp4

(1)图片 logo.png 将会打入到 input.mp4 视频中,显示在 x 坐标 50、y 坐标 20 的位置

ffplay -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"

由于 logo.png 图片的背景色是白色,所以显示起来比较生硬,如果水印图片是透明背景的,效果会更好,

下面找一张透明背景色的图片试一下:

ffplay -i input.mp4 -vf "movie=logo2.png[watermark];[in][watermark]overlay=50:10[out]"

(2)显示位置

ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:10[out]"

ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"

ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:main_h-overlay_h 10[out]"

ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_hoverlay_h-10[out]"

(3)跑马灯效果

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]"

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐