龙空技术网

JavaCV多媒体入门 - 录制桌面播放推流到流媒体服务器或存储视频

Pangg球 245

前言:

现时各位老铁们对“java图片转视频流”大致比较关切,同学们都需要知道一些“java图片转视频流”的相关内容。那么小编也在网络上汇集了一些关于“java图片转视频流””的相关知识,希望小伙伴们能喜欢,大家一起来学习一下吧!

废话不多说,直接开干。。。[酷拽][酷拽][酷拽]

运行依赖

首先,需要将JavaCV库添加到项目的依赖中。可以从官方网站或Maven中央仓库中下载JavaCV库。确保项目中包含所需要的JavaCV Jar文件。我这里引入的是比较新的依赖包1.5.9版本的。

<dependency>    <groupId>org.bytedeco</groupId>    <artifactId>javacv</artifactId>    <version>1.5.9</version></dependency><dependency>    <groupId>org.bytedeco</groupId>    <artifactId>ffmpeg</artifactId>    <version>6.0-1.5.9</version>    <classifier>windows-x86_64</classifier></dependency>
实现步骤创建FFmpegFrameGrabber采集器,设置采集参数,包括帧率、视频分辨率等等(非必须),然后启动采集器。
// 创建采集器FrameGrabber grabber = new FFmpegFrameGrabber("desktop");// 设置帧率grabber.setFrameRate(30);// 设置比特率grabber.setVideoBitrate(4000000);// Windows 的 GDIGrab 接口grabber.setFormat("gdigrab");// 视频尺寸grabber.setOption("video_size", "1920x1080");// 启动采集器grabber.start();
创建FFmpegFrameRecorder录制器,设置录制参数,包括帧率、分辨率等等(非必须),然后启动录制器。
// 创建录制器FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, 1920, 1080, 0);recorder.setVideoBitrate(grabber.getVideoBitrate());recorder.start();
循环采集帧播放并推流/录制
CanvasFrame canvasFrame = new CanvasFrame("Desktop 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("rtsp://127.0.0.1:554/test");start("desktop.mp4");
完整示例
/*** 桌面采集播放** @author Brant Liu*/public class GrabberRecorderDesktopExample {    //录制时间(秒)    private final static int recordTime = 10;    public static void start(String output) throws Exception {        FFmpegLogCallback.setLevel(avutil.AV_LOG_DEBUG);        // 创建采集器        FrameGrabber grabber = new FFmpegFrameGrabber("desktop");        // 设置帧率        grabber.setFrameRate(30);        // 设置比特率        grabber.setVideoBitrate(4000000);        // Windows 的 GDIGrab 接口        grabber.setFormat("gdigrab");        // 视频尺寸        grabber.setOption("video_size", "1920x1080");        // 启动采集器        grabber.start();              // 创建录制器        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, 1920, 1080, 0);        recorder.setVideoBitrate(grabber.getVideoBitrate());        recorder.start();              CanvasFrame canvasFrame = new CanvasFrame("Desktop 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("rtsp://127.0.0.1:554/test");        start("desktop.mp4");    }}

示例代码将采集桌面视频播放,推流到流媒体服务器/录制桌面视频保存为mp4格式文件。运行后看到窗口播放桌面就说明开始正常运行了。播放10秒后会自动关闭并且在项目根目录生成一个desktop.mp4视频文件。当然,你也可以试试把桌面推流到流媒体服务器哈哈。

这里只是一个简单的小例子,你也可以根据需要添加更多的功能,如设置帧率、压缩质量、视频分辨率等参数,以及错误的处理等等。。。

End.

小知识

常用的采集参数:

帧率 (frameRate):表示每秒采集的帧数。

视频分辨率 (videoSize):表示视频的宽度和高度。

编码器 (codec):表示使用的编码器。

音频采样率 (audioSampleRate):表示音频的采样率。

音频通道数 (audioChannels):表示音频的通道数。

常用的编码器:

H.264:一种广泛使用的视频编码器。

VP9:一种新的视频编码器,具有较高的压缩率。

AV1:一种新的视频编码器,具有更高的压缩率和更低的延迟。

常用的音频编码器:

AAC:一种广泛使用的音频编码器。

MP3:一种经典的音频编码器。

FLAC:一种无损音频编码器。

标签: #java图片转视频流 #java实现视频在线播放