java-使用ffemg插件截取rtsp视频流实现视频录制(海康相机)

兼容windows和linux

核心代码如下:

import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Component
public class RtspToMP4 {

    public class In implements Runnable{
        private InputStream inputStream;

        public In(InputStream inputStream) {
            this.inputStream = inputStream;
        }
        @Override
        public void run() {
            try {
                //转成字符输入流
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
                int len = -1;
                char[] c = new char[1024];
                //读取进程输入流中的内容
                while ((len = inputStreamReader.read(c)) != -1) {
                    String s = new String(c, 0, len);
                    System.out.print(s);
                }
            }catch (Exception e) {
                log.error("run:"+e);
            }
        }
    }

    /**
     * 开始录制
     * @param ffmpegPath ffmpeg路径
     * @param streamUrl 视频流
     * @param FilePath 保存的视频文件路径
     * @return
     */
    public Process StartRecord(String ffmpegPath,String streamUrl, String FilePath){
        ProcessBuilder processBuilder = new ProcessBuilder();
        //定义命令内容
        List<String> command = new ArrayList<>();
        command.add(ffmpegPath);
        command.add("-rtsp_transport");
        command.add("tcp");
        command.add("-y");
        command.add("-i");
        command.add(streamUrl);
        command.add("-c");
        command.add("copy");
        command.add("-f");
        command.add("mp4");
        command.add(FilePath);
        processBuilder.command(command);
        System.out.println("脚本:" + command.toString());
        //将标准输入流和错误输入流合并,通过标准输入流读取信息
        processBuilder.redirectErrorStream(true);
        try {
            //启动进程
            Process process = processBuilder.start();
            System.out.println("开始时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())));
            //获取输入流
            InputStream inputStream = process.getInputStream();
            Thread inThread = new Thread(new In(inputStream));
            inThread.start();
            return process;

        } catch (Exception e) {
            log.error("run:"+e);
        }
        return null;
    }

    /**
     * 停止录制
     * @param process
     * @return
     */
    public boolean stopRecord(Process process) {
        try {
            OutputStream os = process.getOutputStream();
            os.write("q".getBytes());
            // 一定要刷新
            os.flush();
            os.close();
        } catch (Exception err) {
            log.error("stopRecord:"+err);
            return false;
        }
        return true;
    }
}

方法调用如下:

@RestController
@RequestMapping("/RtspApi")
public class RtspToMP4Controller {
    @Autowired
    private RtspToMP4 rtspToMP4;

    private Map<Integer,Process> map=new HashMap<>();

    @ApiOperation(value = "开始录制")
    @GetMapping(value = "/videoRecordStart")
    public ResponseData Start(Integer id, String FileName) {
        /*String ffmpegPath="D:\\work\\Test\\ffmpeg.exe";*/
        String ffmpegPath="ffmpeg";
        String streamUrl="rtsp://admin:abcd1234@192.168.8.64:554/h264/ch1/main/av_stream";
        /*String FilePath="D:\\work\\Test\\2022-01-06\\"+FileName;*/
        String FilePath="/opt/videomp4/"+FileName;
        Process process = rtspToMP4.StartRecord(ffmpegPath, streamUrl, FilePath);
        if(null!=process){
            map.put(id,process);
            return new SuccessResponseData();
        }
        return new ErrorResponseData(1,"开始录制错误");
    }

    @ApiOperation(value = "结束录制")
    @GetMapping(value = "/videoRecordStop")
    public ResponseData stop(Integer id) {
        if(map.containsKey(id)){
            Process process = map.get(id);
            if(null!=process){
                rtspToMP4.stopRecord(process);
                return new SuccessResponseData();
            }
        }
        return new ErrorResponseData(1,"结束录制错误");
    }
}

如果在windows系统下,只需更换注释的内容即可
在这里插入图片描述

其中streamUrl为海康的rtsp视频流地址,需改成自己的流地址

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Nginx-RTMP是一个基于Nginx的开源项目,它提供了一个功能强大的云服务器转发RTSP视频流的解决方案。通过使用Nginx-RTMP,您可以将RTSP视频流转发到云服务器上,并通过HTTP或其他协议进行访问和播放。 以下是使用Nginx-RTMP进行RTSP视频流转发的步骤: 1. 安装Nginx-RTMP:首先,您需要在云服务器上安装Nginx-RTMP模块。您可以从Nginx-RTMP的官方网站或GitHub页面下载最新版本的源代码,并按照官方文档中的指引进行编译和安装。 2. 配置Nginx-RTMP:安装完成后,您需要编辑Nginx的配置文件,添加RTMP模块相关的配置项。您可以指定要监听的端口、转发规则、推流地址等。具体的配置方式可以参考Nginx-RTMP的官方文档。 3. 启动Nginx-RTMP:配置完成后,您可以启动Nginx-RTMP服务,并确保服务正常运行。您可以使用命令行或者系统服务管理工具来启动和停止Nginx-RTMP。 4. 转发RTSP视频流:一旦Nginx-RTMP服务正常运行,您可以使用RTSP协议将视频流推送到云服务器上。您可以使用常见的RTSP推流工具,如FFmpeg或OBS Studio,将本地的RTSP视频流推送到Nginx-RTMP服务器。 5. 访问和播放视频流:一旦视频流被成功推送到Nginx-RTMP服务器,您可以通过HTTP或其他协议访问和播放视频流。您可以使用常见的视频播放器,如VLC媒体播放器或HTML5视频播放器,通过指定Nginx-RTMP服务器的地址和端口来播放视频流。 希望以上介绍对您有帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值