Java 搭建srs流媒体服务器,并使用ffmpeg推流

前言:

最近项目需要把监控摄像机的RTSP流在放在浏览器上播放,但由于目前浏览器并不支持RTSP,需要转码才行。之前试过nginx作为流媒体服务器,这次尝试使用ffmpeg将码流推送srs流媒体服务器,实现浏览器端播放,特此记录一下。

SRS 是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT

源码地址:

githup: https://github.com/ossrs/srs

gitee:  https://gitee.com/ossrs/srs

1.在Liunx上编译安装SRS流媒体服务器

注意: 由于第一次安装的时候是先下载到window上,然后拖进liunx里的,

编译执行./configure 会出现这个 ”build.sh /bin/bash^M: 坏的解释器:没有那个文件或目录“ 错误,

这个是windows和linux换行符不同导致的,然后重新在liunx直接下载了一遍就可以了。

 

//先把分支4.0release clone下来
git clone -b 4.0release https://gitee.com/ossrs/srs.git
//然后编译
cd srs/trunk
./configure && make

使用配置文件启动(这样启动需要在目录trunk中才行)

#使用配置文件srs.conf启动
./objs/srs -c conf/srs.conf

# 查看SRS的状态
./etc/init.d/srs status

#停止SRS
./etc/init.d/srs stop

#重启SRS
./etc/init.d/srs restart

# 或者看SRS的日志
tail -n 30 -f ./objs/srs.log

打开浏览器可以访问(我这个服务器的ip是192.168.13.170),有个控制台页面

http://192.168.13.170:8080/

 2.Java使用ffmpeg推流

首先需要一个ffmpeg程序才行,没有的可以去ffmpeg官网下载

package com.ffmpeg.service;

import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.IdUtil;
import lombok.SneakyThrows;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class FFmpegUtil {

    {
        /** ffmpeg 命令详解
         *  ffmpeg [[options][`-i’ input_file]] {[options] output_file}
         *  options:
         *   -i: url 输入文件网址
         *   -vcodec: 设置视频编解码器 -codec:v  -c:v
         *   (强制使用codec编解码方式,如-vcodec xvid 使用xvid压缩 如果用copy表示原始编解码数据必须被拷贝)
         *   -acodec: 设置音频编解码器 -codec:a  -c:a
         *   -f: fmt 强制输入或输出文件格式
         */
    }


    @SneakyThrows
    public static void srs(){
        String osName = System.getProperties().getProperty("os.name");
        System.out.println(osName);
        ClassPathResource classPathResource = new ClassPathResource("ffmpeg"+ File.separator+"win64"+ File.separator);
        String basePath = classPathResource.getAbsolutePath();
        String myStream = IdUtil.simpleUUID();
        String command = basePath + "ffmpeg -re " +
                "-rtsp_transport tcp " +
                "-i rtsp://admin:123456@192.168.13.199:554 " +
                "-c:v copy -c:a copy " +
                "-f flv rtmp://192.168.13.170/live/"+myStream;
        System.out.println("rtmp://192.168.13.170/live/"+myStream);
        Process process = Runtime.getRuntime().exec(command);
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        String line = null;
        while((line = br.readLine()) != null) {
            System.out.println("视频推流信息[" + line + "]");
        }
    }

    public static void main(String[] args) {
        srs();
    }

}

 启动

可以进入浏览器控制台查看对应的视频了

 

 要在web浏览器上播放,可以进入预览页面查看保存对应的js代码

附上SRS的Wiki

Java结合FFmpeg推流,可以使用JavaCV库来实现。JavaCV是一个基于FFmpeg和OpenCV的Java接口,提供了访问视频、音频和图像处理的功能。下面是基于JavaCV实现的推流步骤: 1. 安装JavaCV库,并在代码中导入相关包。 2. 使用FFmpegFrameRecorder类创建一个推流器对象。 3. 设置推流器的参数,如推流地址、视频宽高、视频码率等。 4. 调用start()方法开始推流。 5. 使用Frame类读取视频数据,并将其通过推流器对象写入网络流中。 6. 调用stop()方法结束推流。 下面是Java结合FFmpeg推流的示例代码: ``` import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter; import org.bytedeco.opencv.opencv_core.IplImage; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; public class PushStreamDemo { public static void main(String[] args) throws Exception { //创建推流器对象 FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("rtmp://localhost:1935/live/test", 640, 480); //设置推流参数 recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); recorder.setFormat("flv"); recorder.setFrameRate(25); recorder.setVideoBitrate(2000000); recorder.setVideoQuality(0); //开始推流 recorder.start(); //读取视频数据并写入网络流中 for (int i = 0; i < 100; i++) { BufferedImage image = ImageIO.read(new File("test.jpg")); Java2DFrameConverter converter = new Java2DFrameConverter(); Frame frame = converter.convert(image); recorder.record(frame); Thread.sleep(40); } //停止推流 recorder.stop(); } } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值