文章目录
如何用Java给图片添加文字水印
最近做的项目需要实现为视频添加图片水印,在网上查找和实践后,实现了功能,特此记录一下,方便日后用到。本文用的是从海康摄像头拿到的视频流,添加图片后编译成rtmp视频流,在IE浏览器中可以看到(在谷歌浏览其中打开没画面,不知道为什么),技术使用springboot+vue+ffmpeg+nginx+nginx的rtmp模块
1.首先下载nginx
然后下载nginx rtsp 模块
下载压缩包解压到nginx的根目录下
然后打开nginx目录下的conf,如果里面没有nginx.conf就重下一个其他包把下面的配置文件拿过来放在conf下面
然后双击nginx目录下的nginx.exe就可以启动nginx啦,打开浏览器输入127.0.0.1就可以看到成功页面
然后再nginx.conf中添加如下配置
rtmp{
server{
listen 1935;
#转发的地址
application live{
live on;
record off;
}
application hls{
live on;
hls on;
hls_path nginx-rtmp-module/hls;
hls_cleanup off;
}
}
}
cmd 切换到nginx目录下面 nginx.exe -s reload
重新加载nginx配置文件 nginx配置结束
2.下载ffmpeg
链接:https://pan.baidu.com/s/1LUWeVnM8Ig-2b2ubAw3t1A
提取码:1234
解压后在环境变量path中添加目录地址即可
打开cmd,输入ffmpeg -version,可以查看是否安装成功
使用ffmpeg命令
ffmpeg -i “rtsp流路径” -vcodec copy -acodec copy -f flv "rtmp://127.0.0.1:1935/live/"即可对视频进行操作
具体操作如下
3.用Java操作视频
首先controller层
public class Video {
/**海康摄像头rtsp格式说明:
* ffmpegPath:ffmpeg的安装地址(xx\\xx\\ffmpeg.exe)
* rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
* username: 用户名。例如admin。
* password: 密码。例如12345。
* ip: 为设备IP。例如 192.0.0.64。
* port: 端口号默认为554,若为默认可不填写。
* codec:有H.264、MPEG-4、mpeg4这几种。
* channel: 通道号,起始为1。例如通道1,则为ch1。
* subtype: 码流类型,主码流为main,辅码流为sub
* logo:添加图片水印的图片(注意windows下面的logo地址前面要写4个反斜杠如:D\\\\:/html/3.png;linux下logo水印路径:/tmp/TVLOG.png)
* xaxis:水印的x轴距离(左上角为原点)
* yaxis:水印的y轴距离(左上角为原点)
*/
@RequestMapping(value = "/waterMark",method = RequestMethod.POST)
@ResponseBody
public CommonResult waterMark(@RequestBody Map<String,String> map){
log.info("进入视频添加水印的方法");
String ffmpegPath =map.get("ffmpegPath");
String username = map.get("username");
String password = map.get("password");
String ip = map.get("ip");
String port = map.get("port");
String codec = map.get("codec");
String channel = map.get("channel");
String subtype = map.get("subtype");
String logo = map.get("logo");
String xaxis = map.get("xaxis");
String yaxis = map.get("yaxis");
if (StrUtil.isEmpty(ffmpegPath)){
return ResultUtils.error(-1,"ffmpeg.exe地址不能为空");
}else if (StrUtil.isEmpty(username)){
return ResultUtils.error(-1,"摄像头用户名不能为空");
}else if (StrUtil.isEmpty(password)){
return ResultUtils.error(-1,"摄像头密码不能为空");
}else if