龙空技术网

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

Pangg球 157

前言:

当前咱们对“java获取视频流”大概比较着重,各位老铁们都需要学习一些“java获取视频流”的相关内容。那么小编也在网上网罗了一些对于“java获取视频流””的相关文章,希望姐妹们能喜欢,咱们快快来了解一下吧!

上一章讲解了使用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>
实现步骤

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

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

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

// 创建录制器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);Frame frame;// 获取视频帧。while ((frame = grabber.grab()) != null) {    // 显示视频帧。    canvasFrame.showImage(frame);    recorder.record(frame);}

清理释放资源

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

功能测试

//        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画面作比较非常的不清晰,及没有声音。哈哈,这个内容我们放在下一章内容去写吧。

End.

标签: #java获取视频流