前言
根据添加水印的方式,可以将Android视频中的文本水印分为实时添加和后期添加两种方式。
-
实时添加水印:使用
MediaCodec
进行视频解码和编码,在解码出视频帧后,使用Canvas
绘制水印,然后将处理后的视频帧编码输出。- 优点:实时性高,处理过程中不会对原始视频文件进行修改。
- 缺点:需要对视频编解码有一定了解,实现复杂,且可能会更耗性能。
-
后期添加水印:使用
ffmpeg
库处理视频文件,在处理过程中添加水印。- 优点:实现简单,通过命令行工具即可完成。
- 缺点:不是实时处理,会产生新的文件,且对性能要求相对较低。
本次需求添加的时间水印没有精确到秒,所以采用的是后期添加水印使用ffmpeg实现的方式
ffmpeg的GitHub地址:
https://github.com/arthenica/ffmpeg-kit
实现过程中遇到的问题
1.添加水印之后的视频变得模糊
使用的命令:
val arrString = arrayListOf("drawtext=fontfile='MyFontName': text='${tvTime.text.toString().replace(":", "\\:")}': x=10: y=(h-th-80): fontcolor=white: fontsize=24")
if (tvLocation.text.length > 18) {
arrString.add("drawtext=fontfile='MyFontName': text='${tvLocation.text.substring(0, 18)}': x=10: y=(h-th-50): fontcolor=white: fontsize=24")
arrString.add("drawtext=fontfile='MyFontName': text='${tvLocation.text.substring(18, tvLocation.text.length)}': x=10: y=(h-th-30): fontcolor=white: fontsize=24")
} else {
arrString.add("drawtext=fontfile='MyFontName': text='${tvLocation.text}': x=10: y=(h-th-50): fontcolor=white: fontsize=24")
}
// 构建FFmpeg命令
val command = "-y -i $path -vf \"${arrString.joinToString(", ")}\" -c:v mpeg4 -c:a copy $newPath"
在这个命令中: