天天看点

【流媒体开发】11、ffmpeg命令过滤器(裁剪、水印)一、裁剪二、 FFmpeg 滤镜 Filter 内置变量三、水印四、生成画中画

一、裁剪

  • 裁剪: 是指从原图中抠出一个区域,那么需要裁剪一个区域需要哪些参数呢?
    • 左上角起始点的坐标
    • 需要裁剪的宽高
      【流媒体开发】11、ffmpeg命令过滤器(裁剪、水印)一、裁剪二、 FFmpeg 滤镜 Filter 内置变量三、水印四、生成画中画
  • ffmpeg命令语法:crop=ow[:oh[:x[:y[:keep_aspect]]]]
  • 举例说明:
  • 裁剪左边1/3
ffmpeg -i input -vf crop=iw/3:ih:0:0 output
ffplay -i input -vf crop=iw/3:ih:0:0
           
  • 裁剪中间1/3
ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output
ffplay -i input -vf crop=iw/3:ih:iw/3:0
           
  • 裁剪右边1/3
ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output
ffplay -i input -vf crop=iw/3:ih:iw/3*2:0
           
  • 输入文件不管是图片还是视频都可以使用该命令进行裁剪

二、 FFmpeg 滤镜 Filter 内置变量

在使用 Filter 时,经常会用到根据时间轴进行操作的需求,在使用 FFmpeg 的 Filter 时可以使用 Filter 的时间相关的内置变量,下面先来了解一下这些相关的变量,见下表。

变量 说明
t 以秒表示的时间戳,如果输入的时间是未知的则是 NAN
n 输入帧的顺序编号,从 0 开始
pos 输入帧的位置(字节在文件中偏移的位置),如果未知的则是 NAN,无效值
w 输入视频帧的宽度
h 输入视频帧的高度

三、水印

3.1文字水印

在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译 FFmpeg 时需要支持 FreeType、FontConfig、iconv,系统中需要有相关的字库,在FFmpeg 中增加纯字母水印可以使用 drawtext滤镜进行支持,下面就来看一下 drawtext 的滤镜参数

参数 类型 说明
text 字符串 文字
textfile 字符串 文字文件(字符串太长可以写到文件中)
box 布尔 文字区域背景框(缺省 false)
boxcolor 色彩 展示字体区域块的颜色
font 字符串 字体名称(默认为 Sans 字体)
fontsize 整数 显示字体的大小
x 字符串 缺省为 0 y 字符串 缺省为 0
alpha 浮点数 透明度(默认为 1),值从 0~1
  • 1、将文字的水印加在视频的左上角:
    • 引号中间是整个Filter的,每个参数用冒号隔开
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、文字水印还可以增加一个框,然后给框加上背景颜色:

至此,文字水印的基础功能已经添加完成。

  • 3、有些时候文字水印希望以本地时间作为水印内容,可以在 drawtext 滤镜中配合一些特殊用法来完成,在 text 中显示本地当前时间,格式为年月日时分秒的方式:

在使用 ffmpeg 转码存储到文件时需要加上-re(表示按照时间戳来打水印,因为是在转码,1s会有多帧,按照当前时间显示会有异常),否则时间不对

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
           
  • 4、在个别场景中,需要定时显示水印,定时不显示水印,这种方式同样可以配合 drawtext 滤镜进行处理,使用 drawtext 与 enable 配合即可,例如每 3 秒钟显示一次文字水印:

在使用 ffmpeg 转码存储到文件时需要加上-re,否则时间不对。

表达式参考:http://www.ffmpeg.org/ffmpeg-utils.html 3 Expression Evaluation

lt(x, y) Return 1 if x is lesser than y, 0 otherwise。x小于y返回1,否则返回0

mod(x, y) Compute the remainder of division of x by y,x对y取余

  • 5、跑马灯效果
    • 跑马灯是指文字水印在视频界面上波动,也是根据mod公式动态的修改水平的x,y坐标达到跑马灯的效果

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

3.2图片水印

FFmpeg 除了可以向视频添加文字水印之外,还可以向视频添加图片水印、视频跑马灯等,本节将重点介绍如何为视频添加图片水印;为视频添加图片水印可以使用 movie 滤镜,下面就来熟悉一下 movie 滤镜的参数

参数 类型 说明
filename 字符串 输入的文件名,可以是文件,协议,设备
format_name, f 字符串 输入的封装格式
stream_index, si 整数 输入的流索引编号
seek_point, sp 浮点数 Seek 输入流的时间位置
streams, s 字符串 输入的多个流的流信息
loop 整数 循环次数
discontinuity 时间差值 支持跳动的时间戳差值
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

➢ in:表示的是input.mp4,名字可以随便定

➢ watermark:表示待叠加的logo.png,名字可以随便定

参数 说明
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
【流媒体开发】11、ffmpeg命令过滤器(裁剪、水印)一、裁剪二、 FFmpeg 滤镜 Filter 内置变量三、水印四、生成画中画

在 FFmpeg 中加入图片水印有两种方式,一种是通过 movie 指定水印文件路径,另外一种方式是通过filter 读取输入文件的流并指定为水印,这里重点介绍如何读取 movie 图片文件作为水印。

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

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

  • 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、跑马灯效果

四、生成画中画