文章目录
博客总结 : 执行
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=40
和y=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
执行上述命令 , 得到的输出文件播放效果如下 :
最终得到的输出文件中 , 图片水印的位置 不停地移动 ;