Android录制视频并添加水印

Android录制视频并添加水印,第1张

最近有需求,录制视频的时候要添加水印,怎么搞?最后决定,opengles作为相机预览并在上面绘制水印,使用mediacodec进行编码,使用mediamuxer输出mp4文件,有需要的拿走。

本想写篇博客,发现这些无论拿出哪个点都得写半天,我最近也对opengles十分感兴趣,以后有时间详细分析一下.

用法比较简单

waterX和waterY是水印左下角坐标的位置,范围为[-1,1]

效果如下:

最后附上github地址

github

Android NDK开发之旅 目录

Android也是利用FFmpeg命令行的形式(混编),进行视频转码压缩。

水印位置参数的第一个数值是水印图片的左上角的x轴像素值,第二个数值是水印图片的左上角的y轴像素值。

水印位置参数除了使用数值外,还可以使用以下几个参数:

对应地可以将overlay参数设置成如下值来改变水印图片的位置:

所以质量会下降,在参数中添加设置 如:-b 1024k 会提高视频质量

废话少说,先举个例子

这个例子其实在 android端使用ffmpeg给视频添加图片水印 里已经说过了。

这是一个给视频打上图片水印的命令。

然而,他打的不是一个普通的水印,而是两个。

命令看上去很简洁。然而(又是然而),正因为他这么简洁,所以一开始上来未免搞不清他实际是什么意思。

来,我们把他拆开,其实他由以下部分组成:

1、2、4部分的含义一目了然。3里头的scale和overlay也是字面的意思,不难理解。然而,-filter_complex滤镜的参数结构就不是那么好理解了,比如说那一坨[]里头的东西是什么鬼?

来,一个个解释。

[1:v]这个里头两个参数,1表示的是 *** 作对象的编号。在本例中0就是原始视频文件input.mp4,1就是image1.png,2就是image2.png,3就是output.mp4。而另一个参数v表示 *** 作对象里的视频信息。

[img1]是这个 *** 作过滤器的名字。(当然名字可以随便起)

所以这头一句 [1:v]scale=100:100[img1] 的意思就是对图片imagei.png进行调节尺寸的 *** 作,并将这个 *** 作的结果命名为img1。后面的[2:v]和[img2]也是一个意思。

我们继续,overlay前面 [0:v][img1] 凑一起是什么意思呢。0自然就是指的原始视频,这句的意思就是将[img1]叠加到0对象的视频上。本例中就是把image1.png叠加到input.mp4上。这里需要注意的就是顺序:后一个对象叠加到前一个上,后一个对象在上层。如果写成 [img1][0:v] ,那相对本例其实就是把视频叠加到图片imge1.png上。这样的话一般来说由于视频通常是全屏,等于用视频覆盖了图片,水印完全看不到了。

好,我们又把这个 *** 作的结果命名为[bkg],那么接下来 [bkg][img2] 的意思就很明了了。就是把image2.png再叠加上去,image2.png是在最上层的,如果位置重合的话,他会遮盖 image1.png的水印。

于是,事就这样成了。

1.水印的移动:

这里需要用到时间参数。

比如: overlay=0+t*20:0

这里在x坐标上加上了 +t*10 ,于是水印就会慢慢向右边移动。

2.特定时间显示水印:

这次不仅要用到时间参数,还要用上条件语句。

if条件语句的基本结构就是

再来看看计算表达式。

这里用到了表达式 gte(x,y) 。如果x大于等于y则表达式的值为1,反之为0。

所以 if(gte(t,2),10,NAN) 的意思就是,当时间大于等于2秒时,水印x位置为10,反之不显示水印。(或者你也可以用 lte 来判断“小于或等于”)

要了解所有表达式的话,可以去啃一下ffmpeg官方文档的 Expression Evaluation 部分。

参考:

ffmpeg 基本用法大全

ffmpeg Documentation


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11906739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存