javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp或rtmp视频文件(基于javaCV-FFMPEG)
引入依赖
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.3</version>
</dependency>
代码实现
package com.java.mmzsblog;
import org.bytedeco.javacv.*;
/**
* @author :created by mmzsblog.cn
* @description:javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)
* @date :created at 2020/07/07 10:57
*/
public class FrameRecord {
public static void main(String[] args)
throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException {
// String inputFile = "rtsp://admin:admin@192.168.0.236:1935/cam/realmonitor?channel=1&subtype=0";
// String inputFile = "rtmp://192.168.0.236:1935/live/1256";
String inputFile = "rtmp://192.168.0.14:1935/live/888";
// Decodes-encodes
String outputFile = "d:/recorde.mp4";
try {
FrameRecord frame = new FrameRecord();
frame.frameRecord(inputFile, outputFile, 1);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 按帧录制视频
*
* description: 如果获取到的视频流有卡顿? 则要分析视频源,如果视频源本身没有卡顿的话,可以结合视频源的刷新率,考虑提高grabber的帧率,同时提高recorder的帧率。如果视频源本身就有卡顿话,那就需要另外想办法解决视频源卡顿的问题。
* @param inputFile -该地址可以是网络直播/录播地址,也可以是远程/本地文件路径
* @param outputFile -该地址只能是文件地址,如果使用该方法推送流媒体服务器会报错,原因是没有设置编码格式
* @throws FrameGrabber.Exception
* @throws FrameRecorder.Exception
* @throws org.bytedeco.javacv.FrameRecorder.Exception
*/
public void frameRecord(String inputFile, String outputFile, int audioChannel)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
boolean isStart = true;//该变量建议设置为全局控制变量,用于控制录制结束
// 获取视频源
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
// 获取流设置帧率参数
grabber.setOption("rtsp_transport", "tcp");
grabber.setFrameRate(30);
grabber.setVideoBitrate(3000000);
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
// 输出流设置帧率参数
recorder.setFrameRate(30);
recorder.setVideoBitrate(3000000);
// 停止取视频源
// stopRecordByFrame(isStart);
// 开始取视频源
recordByFrame(grabber, recorder, isStart);
}
/**
* 保存视频源到本地
* @param grabber
* @param recorder
* @param status
* @throws Exception
* @throws org.bytedeco.javacv.FrameRecorder.Exception
*/
private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
try {
// 用来标记控制
int i = -2999;
//建议在线程中使用该方法
grabber.start();
recorder.start();
Frame frame = null;
while (status && (frame = grabber.grabFrame()) != null) {
recorder.record(frame);
// 停止录制,此处方式过于简陋;读者可自行修改,比如线程控制之类的
if (i++ > 2999) {
status = false;
}
}
recorder.stop();
grabber.stop();
} finally {
if (grabber != null) {
grabber.stop();
}
}
}
}
标题:javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp或rtmp视频文件(基于javaCV-FFMPEG)
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2020/09/08/1599546092381.html
如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!
