ffmpeg第4篇:为视频添加动态水印
动态分为三种:
- 水印本身变化
- 水印显示时间变化
- 水印位置变化
水印本身变化
看过上一篇的小伙伴可能觉得第一种很简单,把jpg格式的图片换成gif格式的不就可以了吗,然而亲自试一下就会发现,把gif图片当水印加上去后,图片播放一遍就不会动了。
之所以会这样是因为在ffmpeg中,水印的eof_action选项默认为repeat(参考这里),而repeat的作用是重复最后一帧,这就是为什么gif图片播放一遍就不动了的原因。
要解决这个问题,有两种方式,第一种是设置gif的-ignore_loop为0,让gif保持循环播放即可,命令如下:
ffmpeg -hide_banner -i big_buck_bunny.mp4 -ignore_loop 0 -i doggie3.gif -filter_complex overlay -shortest out.mp4 -y
但是这种方式,只适用于gif格式的图像,如果滤镜是一小段视频就无能为力了。
第二种解决方案是使用movie滤镜,同样是让gif循环播放,虽然这种方式复杂点,不过这种解决方案支持视频水印,命令如下:
ffmpeg -hide_banner -i big_buck_bunny.mp4 -vf "movie=doggie3.gif:loop=0,setpts=N/FRAME_RATE/TB[out];[0:v][out]overlay=x=main_w-overlay_w:y=0" -shortest out.mp4 -y
上面的命令有两个地方比较关键:
loop=0,setpts=N/FRAME_RATE/TB:设置水印gif无限循环-shortest:将输出文件的时长设置为第一个视频文件的时长,如果不设置,你会发现命令会一直执行根本不会停下来,因为gif图的循环是无限的
这样gif图/短视频就会一直不停的播放了。
当然,如果希望水印播放一次就不播放了,那就设置上面的eof_action为pass就可以了,如下:
ffmpeg -hide_banner -i big_buck_bunny.mp4 -i doggie3.gif -filter_complex "overlay=x=0:y=0:eof_action=pass" out.mp4 -y
当然,如果视频一开始就播放且只播放一次,假如水印比较短可能根本就没被注意就过去了,这时可以设置水印出现的延迟时间,使用-itsoffset选项,如下:
ffmpeg -hide_banner -i big_buck_bunny.mp4 -itsoffset 3 -i doggie3.gif -filter_complex "overlay=x=0:y=0:eof_action=pass" out.mp4 -y
这样,视频播放3秒后,水印才会出现。
水印显示时间变化
设置水印显示时长
ffmpeg -hide_banner -i big_buck_bunny.mp4 -i doggie2.png -filter_complex "overlay=enable='lte(t,5)'" out.mp4 -y
上面命令作用是:让水印只显示5秒,5秒后消失。
设置水印显示时间段
ffmpeg -hide_banner -i big_buck_bunny.mp4 -i doggie2.png -filter_complex "overlay=enable='between(t,5,10)'" out.mp4 -y
上面的命令作用是:让水印在视频的5~10秒时间段内显示
设置两个水印轮番出现
ffmpeg -i big_buck_bunny.mp4 -i doggie1.png -i doggie2.png -filter_complex "overlay=enable='lte(mod(t,10),4)',overlay=enable='gt(mod(t,10),6)'" out.mp4 -y
上面的命令作用是:第一个水印显示4秒后消失,2秒后第二个水印显示4秒后消失。
这里布置个作业?
请让两个水印一个在左上角,一个在右上角
水印位置变化
设置水印随时间向右移动
ffmpeg -i big_buck_bunny.mp4 -ignore_loop 0 -i doggie3.gif -lavfi "overlay=x=t*20" -shortest out.mp4 -y
上面命令的作用是:让水印每秒向右移动20像素,直到消失。
设置水印每隔10秒钟从左移动右直至消失
ffmpeg -i big_buck_bunny.mp4 -ignore_loop 0 -i doggie3.gif -lavfi "overlay=enable='mod(t,10)':x='100*mod(t,10)-w'" -shortest out.mp4 -y
很实用很常见的水印展现方式有没有?
可以有效的防止别人盗视频并把水印去掉
这篇讲了三种水印活动的方式,下篇让水印转起来~
有问题请留言沟通,欢迎转载,转载请注明出处
博客地址:暖宝宝官方认证铲屎官
ffmpeg第4篇:为视频添加动态水印的更多相关文章
- ffmpeg番外篇:听说这款水印曾经在某音很火?办它!
今天在瞎逛时,偶然看到一个CSDN上的哥们说,他们曾经被一个水印难住了,仔细看了下,感觉可以用一行命令实现. 需求如下:视频加gif水印,gif循环,同时n秒后水印切换位置继续循环 这哥们遇到了两个问 ...
- ffmpeg:为视频添加静态水印
在ffmpeg中,添加水印需要用overlay滤镜,这是一个复杂滤镜,因为它需要两个输入,默认第一个输入是主画面,第二输入为水印,先执行一个简单的看看. 下面有两个文件,一个是可爱的大雄兔,一个是可爱 ...
- ffmpeg第6篇:滤镜语法
前言 哈哈,回来继续填坑了,前段时间较忙没时间写,现在继续~ 简介 滤镜是ffmpeg的一个很强大的功能,它支持许多有用的视频处理功能,常见的滤镜如:缩放.旋转.水印.裁剪等 一个比较经典的滤镜使用方 ...
- ffmpeg第7篇:数据流选择神器-map指令
自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ...
- ffmpe转码添加时间水印
ffmpeg出直播流的时候 添加时间水印的话可以观察延迟 录制也方便查问题下面的命令 需要用到的字体自己百度下载一下或者到C:\Windows\Fonts复制一下 ffmpeg -stream_loo ...
- ffmpeg为视频添加时间戳 - 手动编译ffmpeg
FFMPEG给视频加时间戳水印 项目中需要给视频添加时间戳,理所当然最好用的办法是ffmpeg.在找到正确的做法前,还被网上的答案timecode给水了一下(水的不轻,在这里转了2天),大概是这样写的 ...
- (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究
使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究 Author:lihaiping1603@aliyun.com Create:2019-09-04 最近对ffmpeg给视频文件添加字幕效果 ...
- ffmpeg 踩坑实录 添加实时水印(二)
一.背景介绍 最近领导要求做一个视频录制的相关项目.其中,需要对视频文件进行添加 实时时间水印.于是,我想到了使用之前的ffmpeg来做. 二.ffmpeg实际操作 首先把需要添加水印的视频文件,上传 ...
- 视频特效制作:如何给视频添加边框、水印、动画以及3D效果
2014-12-08 09:47 编辑: suiling 分类:iOS开发 来源:叶孤城的blog 招聘信息: iOS手机软件开发工程师 iOS工程师 Web后端高级开发工程师 iOS软件工程师 ja ...
随机推荐
- 正则表达式获取字符串的input标签的属性值
直接上正则表达式: (?<=\<input.*value=\").*?(?=\") 字符串如下: <form action="https://www.b ...
- python--基础2 (数据类型及应用)
资源池 链接:https://pan.baidu.com/s/1OGq0GaVcAuYEk4F71v0RWw 提取码:h2sd python数据类型 字符串 列表 字典 数字(整数) 数字(浮点数) ...
- IP路由__静态路由
1.静态路由的优缺点: 优点:对于路由器的CPU没有管理性开销,它意味着如果你不使用动态路由选择的话,你可能应该购买更为便宜的路由器.在路由器之间没有带宽占用,它意味着在WAN链接中你可以节省更多的钱 ...
- Flink-v1.12官方网站翻译-P005-Learn Flink: Hands-on Training
学习Flink:实践培训 本次培训的目标和范围 本培训介绍了Apache Flink,包括足够的内容让你开始编写可扩展的流式ETL,分析和事件驱动的应用程序,同时省略了很多(最终重要的)细节.本书的重 ...
- 零基础如何使用python处理字符串?
摘要:Python的普遍使用场景是自动化测试.爬取网页数据.科学分析之类,这其中都涉及到了对数据的处理,而数据的表现形式很多,今天我们来讲讲字符串的操作. 字符串是作为任意一门编程语言的基础,在P ...
- hdu1541 Stars
Problem Description Astronomers often examine star maps where stars are represented by points on a p ...
- Codeforces Round #643 (Div. 2) B. Young Explorers (思维,贪心)
题意:给你一组人\(a\),现在要将这些人进行分组,对于\(i\),只有某一组的人数\(\ge a_{i}\)时,\(i\)才可以加入这个组,问最多能够有多少组,(不必将所有人都选用). 题解:我们将 ...
- PowerShell随笔8 --- function
为了脚本逻辑的重复使用,我们更多时候会封装成方法.PowerShell的function和C#.JavaScript的定义有些区别. 我们直接看例子: 可以看到,定义方法并不是这样的: functio ...
- springboot源码解析-管中窥豹系列之BeanDefinition(八)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- MHA 高可用介绍
目录 MHA 介绍 MHA 简介(Master High Availability) MHA 工作原理(转载) MHA 架构 MHA 工具 Manager 节点 Node 节点 MHA 优点 MHA ...