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);
展示效果如下:
OK~完成!!!!