前言:
当前咱们对“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获取视频流