java rtmp ffmpeg_javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp或rtmp视频文件(基于javaCV-FFMPEG)...

本文介绍了如何使用JavaCV和FFmpeg库在Java中实现一个收流器,记录流媒体服务器的RTSP或RTMP视频文件。通过设置帧率、比特率等参数,将视频流保存到本地。代码示例展示了如何启动和停止录制过程。
摘要由CSDN通过智能技术生成

引入依赖

org.bytedeco

javacv

1.5.3

org.bytedeco

javacv-platform

1.5.3

代码实现

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

-----------------------------

如未加特殊说明,此网站文章均为原创。

网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。

公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓

%E5%BE%AE%E4%BF%A1%E6%90%9C%E4%B8%80%E6%90%9CJava%E5%AD%A6%E4%B9%A0%E4%B9%8B%E9%81%93-5905a190.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值