音视频ffmpeg——ffmpeg 滤镜(添加水印)
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]"
更多推荐
所有评论(0)