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);//不知道为什么这里不做转换就不能推到rtmpwhile (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/