JavaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)
引入依赖
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.3</version>
</dependency>
代码实现
package com.java.mmzsblog;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.*;
import org.bytedeco.opencv.opencv_core.IplImage;
import javax.swing.*;
/**
* @author :created by mmzsblog.cn
* @description: javaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)
* @date :created at 2020/07/07 10:54
*/
public class RecordCamera {
public static void main(String[] args) {
}
/**
* 按帧录制本机摄像头视频(边预览边录制,停止预览即停止录制)
*
* @param outputFile -录制的文件路径,也可以是rtsp或者rtmp等流媒体服务器发布地址
* @param frameRate - 视频帧率
* @throws Exception
* @throws InterruptedException
* @throws org.bytedeco.javacv.FrameRecorder.Exception
*/
public static void recordCamera(String outputFile, double frameRate)
throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
//另一种方式获取摄像头,opencv抓取器方式获取摄像头请参考上一讲,FrameGrabber会自己去找可以打开的摄像头的抓取器。
//本机摄像头默认0
FrameGrabber grabber = FrameGrabber.createDefault(0);
//开启抓取器
grabber.start();
//转换器
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加
IplImage grabbedImage = converter.convert(grabber.grab());
int width = grabbedImage.width();
int height = grabbedImage.height();
FrameRecorder recorder = FrameRecorder.createDefault(outputFile, width, height);
// avcodec.AV_CODEC_ID_H264,编码
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
//封装格式,如果是推送到rtmp就必须是flv封装格式
recorder.setFormat("flv");
recorder.setFrameRate(frameRate);
recorder.start();//开启录制器
long startTime=0;
long videoTS=0;
CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setAlwaysOnTop(true);
//不知道为什么这里不做转换就不能推到rtmp
Frame rotatedFrame=converter.convert(grabbedImage);
while (frame.isVisible() && (grabbedImage = converter.convert(grabber.grab())) != null) {
rotatedFrame = converter.convert(grabbedImage);
frame.showImage(rotatedFrame);
if (startTime == 0) {
startTime = System.currentTimeMillis();
}
videoTS = 1000 * (System.currentTimeMillis() - startTime);
recorder.setTimestamp(videoTS);
recorder.record(rotatedFrame);
Thread.sleep(40);
}
//关闭窗口
frame.dispose();
//关闭推流录制器,close包含release和stop操作
recorder.close();
//关闭抓取器
grabber.close();
}
}
标题:JavaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2020/09/07/1599489215275.html
如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!