【FFmpeg】Filter 过滤器 ④ ( 图片水印 - movie 过滤器 / overlay 过滤器 | movie 过滤器内置参数值简介 | 图片水印示例 )

在这里插入图片描述

博客总结 : 执行

ffmpeg -i input.mp4 -vf "movie=icon.png[icon_watermark];[in][icon_watermark]overlay=x=40:y=40[out]" output.mp4

命令 , 向视频中添加图片水印 , 效果如下 :

在这里插入图片描述

执行

ffmpeg -i input.mp4 -vf "movie=icon.png[icon_watermark];[in][icon_watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]" output.mp4

命令 , 实现跑马灯效果 ;
在这里插入图片描述





一、图片水印 - movie 过滤器 / overlay 过滤器




1、movie 过滤器简介


FFmpeg 中 的 movie 过滤器 可用于 向 视频中添加 图片水印 ;


movie 过滤器的语法如下 :

movie=file_path[:option1=value1:option2=value2...]
  • file_path 参数 : 上述 movie 过滤器语法中 , file_path 是必须指定的参数 , 设置输入文件路径 , 可以是 文件 / 协议 / 设备 ;

下面的参数都是可选参数 , 不是必须得 , 可选参数 与 file_path 参数 之间都使用冒号 : 隔开 ;

  • format_name 参数 : 设置 输入文件的封装格式 ; FFmpeg 可以自动识别出文件的格式 , 因此该选项一般情况下不需要显示指定 , 除非设置的文件没有后缀 ;
  • stream_index 参数 : 可以简写成 si 参数 , 设置输入流的索引编号 , 如果有多个输入流则使用该索引编号选择为哪个输入流添加滤镜 ;
  • seek_point 参数 : 可以简写成 s 参数 , 设置输入流视频的起始时间点 , 从该起始点开始加载视频内容 , 不是从视频开头开始加载 ;
  • loop 参数 : 设置 视频文件 的 循环播放次数 , 默认情况下只播放一次 , 设置负数则无限循环 ;
  • discontinuity 参数 : 设置支持跳动的时间戳差值 , 即在加载视频文件时是否允许发生不连续性 ; FFmpeg 默认会保持加载的视频流的连续性 , 但是如果文件损坏 , 就需要设置该参数 , 设置加载视频流的连续性 ;

2、movie 过滤器内置参数值简介


movie 过滤器内置参数 : 在 movie 过滤器中 , 可以使用如下内置参数 , 进行一些特别的定制设置 ;

  • main_w : 输入视频的画面宽度 ;
  • main_h : 输入视频的画面高度 ;
  • overlay_w : 水印图片的宽度 ;
  • overlay_h : 水印图片的高度 ;

上述宽度和高度的单位都是 像素 ;


下图是将 图片 作为水印 添加到输入视频中 ,

  • 图片的宽高是 63x58 像素 , 则 overlay_w 的值就是 63 , overlay_h 的值就是 58 ;
  • 视频的画面大小是 848x480 像素 , 则 main_w 的值是 848 , main_h 的值是 480 ;

在这里插入图片描述

使用上述四个内置参数值 , 可以计算出 图片水印 在不同位置时的 (x , y) 坐标位置 ;

  • 图片水印 打在 视频 " 左上角 " , 设置 (x , y) 值为 (0 , 0) ;
  • 图片水印 打在 视频 " 右上角 " , 设置 (x , y) 值为 (main_w-overlay_w , 0) ;
  • 图片水印 打在 视频 " 左下角 " , 设置 (x , y) 值为 (0 , main_h-overlay_h) ;
  • 图片水印 打在 视频 " 右下角 " , 设置 (x , y) 值为 (main_w-overlay_w , main_h-overlay_h) ;

3、overlay 过滤器简介


FFmpeg 中的 overlay 过滤器 用于 将一个视频流叠加在另一个视频流上 , 可以用于 实现 水印 / 字幕 / 画中画 效果 ;


overlay 过滤器 基本语法如下 :

overlay=x=position_x:y=position_y
  • position_x 参数 :叠加内容 的 水平位置 ;
  • position_y 参数 :叠加内容 的 垂直位置 ;




二、图片水印示例




1、添加图片水印 - 基础设置


下面的命令 , 就是 向视频中 添加一个图片水印 的命令 ;

ffmpeg -i input.mp4 -vf "movie=icon.png[icon_watermark];[in][icon_watermark]overlay=x=40:y=40[out]" output.mp4
  • -i input.mp4 参数 指定 input.mp4 为输入文件 , 该视频文件是要添加图片水印的视频 ;

  • -vf "movie=icon.png[icon_watermark];[in][icon_watermark]overlay=x=40:y=40[out]" 参数 用于 设置 视频过滤器 , 也就是添加图片水印的主体设置 ;

    • movie=icon.png[icon_watermark] 参数 设置 movie 过滤器 参数 ,

      • 将 icon.png 文件 加载成为视频流 ,
      • 将 加载的 视频流 命名为 icon_watermark , 名字可以任意设置 , 是个自定义字符串 , 该 视频流 就是图片水印 ;
    • [in][icon_watermark]overlay=x=40:y=40[out] 参数 设置的是 overlay 过滤器 参数 , 将 输入视频流 [in] 和 水印视频流 [icon_watermark] 叠加在一起 ;

      • [in] 表示 输入视频流 , 这里指的是 input.mp4 文件 ;
      • [icon_watermark] 表示之前 使用 movie 过滤器 加载的 icon.png 图片对应的 图片水印 视频流 ;
      • [in][icon_watermark]overlay 表示 将 两个 视频流 进行叠加 ;
      • x=40y=40 分别 指定水印在视频中的水平和垂直位置 , 这里是将水印放置在视频的左上角 ;
      • [out] 指的是输出视频流 , 也就是 output.mp4 输出文件 , 在该 overlay 过滤器 中的作用是 将 叠加后的视频流输出到 [out] 输出文件中 ;
  • output.mp4 参数 : 指定输出文件为 output.mp4 , 这是添加水印后生成的新视频文件 ;


执行结果如下 : 执行后 , 将 icon.png 图片作为 水印 , 添加到了 input.mp4 视频文件中 , 得到的输出文件 output.mp4 播放效果如下 , 在视频文件的左上角 ( 40 , 40 ) 位置处 , 出现了 icon.png 图片水印 ;

在这里插入图片描述

在这里插入图片描述


2、添加图片水印 - 将水印设置到视频右下角


将 图片水印 位置 , 设置在右下角 , 设置 设置 (x , y) 值为 (main_w-overlay_w , main_h-overlay_h) , 对应的命令如下 :

ffmpeg -i input.mp4 -vf "movie=icon.png[icon_watermark];[in][icon_watermark]overlay=x=main_w-overlay_w:y=main_h-overlay_h[out]" output.mp4

执行上述命令 , 得到的输出文件播放效果如下 :

在这里插入图片描述

执行上述命令 , 图片水印被打到了视频的右下角 ;

在这里插入图片描述


3、添加图片水印 - 水印跑马灯不停移动


将 图片水印 位置 , 设置为跑马灯效果 , 需要通过 不停地改变 x 和 y 的位置进行实现 , 这里需要通过表达式实现 ;


设置 x 的值为 mod(50*t\,main_w) , 这是计算 每当 50 * t 的结果达到视频的宽度时 , 取其余数 , 实现效果是每秒向右移动 50 像素 ;

  • mod() 是 FFmpeg 中的 数学函数 , 进行取模运算 , 计算 50 * t 模 main_w 的结果 ,
  • t 是 时间 , 单位是 秒 ;
  • main_w 是视频的宽度 , 单位像素 ;

设置 y 的值为 abs(sin(t))*main_h*0.7 , 这是计算时间 t 的正弦值的绝对值 , 乘以视频的高度 , 并乘以一个常数 0.7 , 以调整振幅 ;

  • abs() 是 FFmpeg 中的 绝对值函数 ;
  • sin() 是 FFmpeg 中的 正弦函数 ;
  • t 代表时间 , 单位是 秒 ;

最终的 图片水印 跑马灯效果 的命令如下 :

ffmpeg -i input.mp4 -vf "movie=icon.png[icon_watermark];[in][icon_watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]" output.mp4

执行上述命令 , 得到的输出文件播放效果如下 :

在这里插入图片描述

最终得到的输出文件中 , 图片水印的位置 不停地移动 ;

在这里插入图片描述

  • 57
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
### 回答1: 您可以使用scale过滤器来设置水印的宽高,例如:[:v]scale=w=100:h=50[watermark]。然后使用overlay过滤器水印叠加到视频上,例如:[1:v][watermark]overlay=x=10:y=10[out]。最后将out作为输出。具体的C代码实现可以参考FFmpeg的文档和示例。 ### 回答2: 在使用FFmpeg过滤器生成水印的C代码中,设置水印的宽高可以通过修改AVFilterContext结构体中的相关字段来实现。 首先,需要创建一个AVFilterContext实例,可以通过调用avfilter_graph_alloc_filter函数来创建,并指定所需的过滤器类型。 然后,可以通过查找并设置AVFilter的参数来实现设置水印的宽高。通过使用avfilter_graph_get_filter函数获取到对应的AVFilter实例,并通过调用av_opt_set_int函数来设置宽高值。 具体的步骤如下: 1. 创建AVFilterContext实例,并设置过滤器类型。 AVFilterContext *filter_ctx = avfilter_graph_alloc_filter(graph, avfilter_get_by_name("..."), "..."); 2. 获取AVFilter实例,并设置宽高值。 AVFilter *filter = avfilter_get_by_name("宽高过滤器名称"); av_opt_set_int(filter_ctx, "宽度参数名称", 水印宽度, AV_OPT_SEARCH_CHILDREN); av_opt_set_int(filter_ctx, "高度参数名称", 水印高度, AV_OPT_SEARCH_CHILDREN); 需要根据实际使用的过滤器类型和参数名称来进行设置。 3. 将设置的AVFilterContext实例添加到过滤器图中。 avfilter_graph_create_filter(&filter_ctx, filter, "实例名称", "参数值", NULL, graph); 在设置完宽高后,可以继续添加其他的过滤器参数或者直接连接输入/输出,最后进行处理操作,将生成的视频保存到文件或者进行其他处理。 需要注意的是,具体的过滤器类型和参数名称需要根据所使用的过滤器来确定,可以参考FFmpeg官方文档或者相关示例代码进行具体设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值