实现效果
上一章讲解了使用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画面作比较非常的不清晰,及没有声音。哈哈,这个内容我们放在下一章内容去写吧。