技术研究之JavaCV

标签: 无 分类: 未分类 创建时间:2024-07-31 11:08:26 更新时间:2024-11-23 02:04:26

前沿

这里我使用的是 javacv + ffmpeg 进行操作

1.截图

传入一个 rtmp 流地址,然后借助于 FFmpeg 进行截图,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 截取 rtmp 图片
* @param rtmpUrl
* @return
*/
public static String snapshot(String rtmpUrl,String path){
String result=null;
try(FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtmpUrl)){
grabber.start();
while (true) {
Frame frame = grabber.grabImage();
if (frame != null) {
BufferedImage bufferedImage = null;
Java2DFrameConverter imgConverter = new Java2DFrameConverter();
bufferedImage = imgConverter.convert(frame);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMddHHmmss");
String imageName ="sanpshot_"+simpleDateFormat.format(new Date())+".jpg";
File out = Paths.get(path, imageName).toFile();
ImageIO.write(bufferedImage, "jpg", out);
return out.getAbsolutePath();
}
}
}catch (Exception e){
log.error("snapshot",e);
}
return result;
}
参考文章:
【1】.java拉rtmp视频流录制视频
【2】.javacv实现实时视频截图和录像服务easyCV Video recorder and snapshot(video image capture) library,based on javaCPP & javaCV & FFmpeg. 基于javaCV的跨平台视频录像和快照(视频截图)库,开箱即用。
【3】.实时视频流 javacv截图实现流程
【4】.javacv ffmpeg直播流拉取空帧 这里有直接连接读取 rtmp 流的方法。
【5】.使用JavaCV实现读取视频信息及自动截取封面图 这里用到了 OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
【6】.Java,图像处理,OpenCV,JavaCV,BufferedImage与Mat格式转换 org.opencv.core.Mat与
org.bytedeco.javacpp.opencv_core.Mat,两种Mat格式,两者不互通,导入的依赖包也不同,Mat格式转换先将org.opencv.core.Mat转化为java.awt.image.BufferedImage,再将BufferImage转化为org.bytedeco.javacpp.opencv_core.Mat格式。
【7】. javaCV实现视频帧转码保存为图片 Java2DFrameConverter converter = new Java2DFrameConverter(); log.info(“开始转换图片”); bufferedImage = converter.convert(frame);
【8】.Java opencv把mat还原成图片

2.录屏

录屏的代码也是挺简单的,就是使用一个空的 recorder 进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* 截取 rtmp 图片
* @param rtmpUrl
* @return
*/
public static String startRecording(String rtmpUrl,String path){
String result=null;
try(FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtmpUrl)){
grabber.start();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMddHHmmss");
String videoName =path+File.separator+"sanpshot_"+simpleDateFormat.format(new Date())+".mp4";
// 用于存储视频 , 先调用stop,在释放,就会在指定位置输出文件
try(FrameRecorder recorder = FrameRecorder.createDefault(videoName, grabber.getImageWidth(), grabber.getImageHeight())){
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 编码,使用编码能让视频占用内存更小,根据实际自行选择
recorder.start();
Frame captured_frame = null;
/**
* 最多录制十分钟
*/
Long now=System.currentTimeMillis();
Long tNow=now+60*1000;
while (now < tNow) {
now=System.currentTimeMillis();
try {
captured_frame = grabber.grabFrame();
if (captured_frame != null) {
recorder.record(captured_frame);
}
} catch (Exception e) {
log.error("captured_frame",e);
}
}
// 释放资源
recorder.stop();
recorder.release();
grabber.stop();
}
}catch (Exception e){
log.error("snapshot",e);
}
return result;
}
参考文章:
【1】.javacv利用ffmpeg实现录屏和录音,输出为mp4文件
【2】.javacv实现屏幕录制(一) 用FFmpegFrameGrabber创建屏幕录制采集,将采集到的帧数据追加到FrameGrabber,用FrameGrabber做视频输出。。。按照这个思路,你也能把数据采集改成摄像头采集。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。