JAVACV实现视频帧添加中文水印

@[TOC] JAVACV实现视频帧添加中文水印

JAVACV实现视频帧添加中文水印

最近有个项目需要用到监控视频和采集数据融合显示的问题。通过各种尝试,最终确定可以使用javacv+nginx-temp来实现(类似与直播平台模式)。其中主要的一块内容是给视频叠加采集数据的问题。开始享用opencv来实现文字叠加,后来发现opencv不支持中文字符叠加~~汗汗汗。无奈支下经过各翻折腾,最终发现可以使用Graphics2D来实现给帧图片叠加中文。闲话不多说,直接进入主题。

Graphics2D是个什么东东,不用细说。就是java的一个画布工具类。细节可以问度娘。

主要实现逻辑是通过javacv调用ffmpeg获取到视频帧图片,将图片转为bufferedImage格式。然后以此bufferedImage为源做画布,将需要添加的水印文字图片添加到想要添加的位置(可以设置字体,颜色,底色,大小。图形,显示位置等等一系列操作)。然后在将此bufferedImage转为视频帧。继续生成视频流。

相关代码

Graphics2D相关
/**
* 视频帧图片加文字水印
* @param bufImg 源图片
* @param count 帧计数
* @return BufferedImage 添加水印后图片
*/
public static BufferedImage mark(BufferedImage bufImg,int count) {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

	Font font = new Font("微软雅黑", Font.BOLD, 64);
	String content = sdf.format(new Date());
	String content1 = "字符滚动效果";
	FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
	int width = bufImg.getWidth();//计算图片的宽
	int height = bufImg.getHeight();//计算高
	Graphics2D graphics = bufImg.createGraphics();
	graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
	graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
	//设置图片背景
	graphics.drawImage(bufImg, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
	//设置左上方时间显示
	graphics.setColor(Color.orange);
	graphics.setFont(new Font("微软雅黑", Font.BOLD, 64));
	graphics.drawString(content,  0, metrics.getAscent());
	//设置下方蓝色背景条
	graphics.setColor(Color.BLUE);
	graphics.fillRect(0, height-110, width, 110);
	//设置下方滚动字幕
	graphics.setColor(Color.white);
	graphics.setFont(new Font("微软雅黑", Font.BOLD, 52));
	graphics.drawString(content1,  width-(count*5), height-40);
	graphics.dispose();
	return bufImg;
}

bufferedImage相关

		IplImage grabbedImage = conveter.convert(grabber.grab());
		Java2DFrameConverter converter = new Java2DFrameConverter();
		BufferedImage bufferedImage =converter.getBufferedImage(grabber.grabImage());
		bufferedImage = mark(bufferedImage,count);
		Frame frame = 	converter.getFrame(bufferedImage);

展示效果如下:

JAVACV实现视频帧添加中文水印

OK~完成!!!!