JavaCV多媒体入门 - 采集本地摄像头推流到流媒体服务器或存储视频

实现效果

上一章讲解了使用JavaCV采集桌面播放并且推到到流媒体服务器或存储视频。本章我们来讲下利用JavaCV采集本地摄像头推流到流媒体服务器或者存储视频。当然这个的前提是你的电脑需要有“摄像头”,一般笔记本都是有摄像头的,哈哈。

运行依赖

        老样子,需将JavaCV库及要使用到的依赖添加到项目中。可以从官方网站或Maven中央仓库中下载JavaCV库。确保项目中包含所需要的JavaCV Jar文件。我这里引入的是比较新的依赖包1.5.9版本的。我是用windows环境开发的,所以相关的依赖添加的是支持windows的jar包,其他linux、mac需要引入系统相对应的包。也可以一次性引入全平台的包。

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.5.9</version>
</dependency>

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>opencv</artifactId>
    <version>4.7.0-1.5.9</version>
    <classifier>windows-x86_64</classifier>
</dependency>

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>openblas</artifactId>
    <version>0.3.23-1.5.9</version>
    <classifier>windows-x86_64</classifier>
</dependency>

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>ffmpeg</artifactId>
    <version>6.0-1.5.9</version>
    <classifier>windows-x86_64</classifier>
</dependency>

全平台包示例

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.9</version>
</dependency>

实现步骤

1. 创建OpenCVFrameGrabber采集器。设置采集参数,包括帧率、比特率、尺寸等等,然后启用采集器。

// 创建采集器
FrameGrabber grabber = new OpenCVFrameGrabber(0);
// 设置帧率
grabber.setFrameRate(30);
// 启动采集器
grabber.start();

2. 创建FFmpegFrameRecorder录制器,设置录制参数,包括帧率、分辨率等等(非必须),然后启动录制器。

// 创建录制器
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getImageWidth(), grabber.getImageHeight(), 2);
recorder.setFrameRate(grabber.getFrameRate());
recorder.start();

3. 循环采集帧播放并推流/录制

CanvasFrame canvasFrame = new CanvasFrame("Camera Example");
canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame frame;
// 获取视频帧。
while ((frame = grabber.grab()) != null) {
    // 显示视频帧。
    canvasFrame.showImage(frame);
    recorder.record(frame);
}

4. 清理释放资源

// 停止抓取
grabber.stop();
// 关闭录制器
recorder.stop();
// 释放资源
canvasFrame.dispose();

5. 功能测试

//        start("camera.mp4");
start("rtsp://127.0.0.1:554/camera");

完整示例

/**
 * 采集本地摄像头
 *
 * @author Brant Liu
 */
public class GrabberRecorderCameraExample {

    //录制时间(秒)
    private final static int recordTime = 60;

    public static void start(String output) throws Exception {
        // 创建采集器
        FrameGrabber grabber = new OpenCVFrameGrabber(0);
        // 设置帧率
        grabber.setFrameRate(30);
        // 启动采集器
        grabber.start();

        // 创建录制器
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getImageWidth(), grabber.getImageHeight(), 2);
        recorder.setFrameRate(grabber.getFrameRate());
        recorder.start();

        CanvasFrame canvasFrame = new CanvasFrame("Camera Example");
        canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取当前系统时间
        long startTime = System.currentTimeMillis();
        long videoTS;

        Frame frame;
        // 获取视频帧。
        while ((frame = grabber.grab()) != null) {
            // 窗口是否关闭
            if (!canvasFrame.isDisplayable()) {
                break;
            }
            // 显示视频帧。
            canvasFrame.showImage(frame);
            recorder.record(frame);

            long endTime = System.currentTimeMillis();
            long useTime = (endTime - startTime) / 1000;
            videoTS = (endTime - startTime) * 1000;
            recorder.setTimestamp(videoTS);

            // 录制10秒钟。
            if (useTime > recordTime) {
                break;
            }
            // 休眠 50 毫秒。
            Thread.sleep(50);
        }
        // 停止抓取
        grabber.stop();
        // 关闭录制器
        recorder.stop();
        // 释放资源
        canvasFrame.dispose();
    }

    public static void main(String[] args) throws Exception {
//        start("camera.mp4");
        start("rtsp://127.0.0.1:554/camera");
    }
}

示例代码运行以后,就能看到弹出一个窗口播放摄像头的画面了,并且会推流到流媒体服务器/录制摄像头视频camera.mp4到项目根目录。录制的视频播放你会发现画面和弹出的Camera Example画面作比较非常的不清晰,及没有声音。哈哈,这个内容我们放在下一章内容去写吧。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖个求

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值