欢迎来到淼淼之森的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

JavaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)

  |   0 评论   |   0 浏览

引入依赖

<!-- 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 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜 Java 学习之道