【java】使用opencv获取摄像头并推流
1、环境
OSX 12.5
Java8
vscode
2、脚本
JavaCvCameraTest.java
import javax.swing.JFrame; import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacpp.Loader; import org.bytedeco.javacv.*; import org.bytedeco.opencv.global.opencv_objdetect; import org.bytedeco.opencv.opencv_core.IplImage; public class JavaCvCameraTest { public static void recordCamera(String outputFile, double frameRate) throws Exception, InterruptedException { Loader.load(opencv_objdetect.class); FrameGrabber grabber = FrameGrabber.createDefault(0);//本机摄像头默认0,这里使用javacv的抓取器,至于使用的是ffmpeg还是opencv,请自行查看源码 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); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264,编码 recorder.setFormat("flv");//封装格式,如果是推送到rtmp就必须是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); Frame rotatedFrame=converter.convert(grabbedImage);//不知道为什么这里不做转换就不能推到rtmp 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(); recorder.stop(); recorder.release(); grabber.stop(); } public static void main(String[] args) throws Exception, InterruptedException { recordCamera("rtmp://192.168.10.225:1935/stream/example",25); //推流到rtmp服务器 } }
3、pom.xml相关依赖
<dependencies> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.7</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacpp</artifactId> <version>1.5.7</version> </dependency> </dependencies>
调用摄像头需要权限,mac需要配置允许vscode
参考链接:
https://answers.opencv.org/question/225281/videocapture-0-does-not-work-in-mac-catalina-the-program-crashed/