SRS流媒体服务器搭建+ffmpeg推流VLC取流观看

本文详细介绍如何从源码编译安装SRS直播服务器,并配置RTMP服务。包括安装依赖、下载源码、编译安装步骤及配置示例。同时介绍了如何通过ffmpeg进行推流并用VLC播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编译SRS
https://github.com/winlinvip/simple-rtmp-server
目前有1.0-release、2.0、3.0等版本
2.0官方文档地址:https://github.com/winlinvip/simple-rtmp-server/wiki/v2_CN_Home

1.如果是新系统,先安装git

CentOS:yum -y install git

2.源码下载:

git clone https://code.csdn.net/winlinvip/srs-csdn.git

3.git操作

a.改变SRS分支

切换到1.0分支
git pull && git checkout 1.0release
切换到2.0分支
git pull && git checkout 2.0release

我把源码下载到了/mnt目录,然后我们cd /mnt

b.查看当前分支

cd /mnt/srs-csdn;git branch

c.改变到2.0分支

git pull && git checkout 2.0release

4.编译安装

cd /mnt/srs-csdn/trunk

./configure -h #查看编译时的帮助,里面有一些指定的参数是情况加减,官方文档

开始编译:

./configure --prefix=/usr/local/srs --with-ssl --with-hls --with-hds --with-dvr --with-nginx --with-http-callback --with-http-server --with-stream-caster --with-http-api --with-ffmpeg --with-transcode --with-ingest --with-stat --with-librtmp --with-research --with-utest --with-gperf --with-gprof

make;make install

第三方应用启动:

sudo ./objs/nginx/sbin/nginx   --- 启动nginx   for hls
./objs/ffmpeg/bin/ffmpeg       ---ffmpeg
python ./research/api-server/server.py 8085 ---to start the api-server

SRS启动

cd /mnt/srs-csdn/trunk
./objs/srs -c conf/srs.conf
ps -ef | grep srs
./srs -v

到此为止,SRS已编译安装完成!

二、配置RTMP
1.RTMP URL解释:

rtmp://HOST:PORT/app/stream_name
rtmp: 协议头
HOST:注意的IP地址或域名
app: 应用名称
stream_name:流名称

2.SRS中RTMP配置信息
文件目录:/mnt/srs-csdn/trunk/conf/rtmp.conf
配置内容:

listen              1935;
pid                 ./objs/srs.pid;
chunk_size          60000;
ff_log_dir          ./objs;
srs_log_tank        file;  
#配置日志答应到文件,需要和srs_log_level配合使用
srs_log_level       trace; 
#制定配置文件的级别,默认级别是trace
srs_log_file        ./objs/srs.log;  
#制定日志文件的位置。
max_connections     1000; 
#最大连接数
daemon              on; 
#以daemon的方式启动,如果要启动在console,那么需要配置daemon off;并且,需要配置srs_log_tank console;
utc_time            off; 
#是否使用utc时间。如果该值为off则使用本地时间,如果开始使用utc时间。
vhost __defaultVhost__ {   
#默认的vhost,在没有指明vhost的情况,默认使用这个vhost。
}

3.ffmpeg推流 VLC播放
ffmpeg可执行程序目录:/mnt/srs-csdn/trunk/objs/ffmpeg/bin/ffmpeg

推流:

cd /mnt/srs-csdn/trunk/objs/ffmpeg/bin
./ffmpeg -i "abc.avi" -vcodec libx264 -vprofile baseline -level 30 -g 60 -vb 800k -strict experimental -acodec aac -ab 96000 -ar 48000 -ac 2 -f flv rtmp://192.168.1.62:1935/live/zb

VLC取流:

rtmp://192.168.1.62:1935/live/zb

这里写图片描述

<think>好的,我现在要解决用户的问题,关于如何使用Spring Boot、FFmpegSRS服务器实现多条RTMP送。首先,我需要理解用户的具体需求。他们可能希望构建一个系统,能够同时处理多个视频,并通过FFmpeg送到SRS服务器,而Spring Boot作为后端框架来处理业务逻辑。 首先,我得回忆一下这些技术的基本概念。Spring Boot是用来简化Spring应用的初始搭建和开发的,适合做后端服务。FFmpeg是处理视频和音频的强大工具,支持编码、转码、等。SRS(Simple RTMP Server)是一个开源的媒体服务器,支持RTMP、HLS、HTTP-FLV等协议,适合作为媒体的接收和分发服务器。 接下来,用户提到的是多条RTMP,这意味着可能需要同时处理多个输入源,比如多个摄像头或者视频文件,然后分别送到SRS的不同应用或名称下。我需要考虑如何用FFmpeg命令来指定不同的输出URL,每个URL对应不同的。 然后,结合Spring Boot,可能需要编写一个服务,能够动态生成FFmpeg命令,并执行这些命令来启动任务。这里需要注意的是,在Java中执行外部命令可能会涉及到进程管理,比如使用Runtime.getRuntime().exec()或者更高级的ProcessBuilder。同时,需要处理可能出现的异常,比如命令执行失败、中断等。 另外,需要考虑如何管理多个FFmpeg进程。每个任务可能对应一个独立的FFmpeg进程,Spring Boot需要跟踪这些进程,以便在需要时停止或重启它们。可能需要设计一个任务管理机制,比如使用一个Map来保存进程的引用和相关信息。 还有配置SRS服务器的部分,需要确保SRS已经正确安装和配置,监听的端口(如1935)是开放的,并且应用和名称的路径是正确的。例如,地址应该是rtmp://srs_server_ip:1935/live/stream_key,其中stream_key是每个的唯一标识。 接下来,验证步骤也很重要。用户可能需要检查SRS服务器是否成功接收到,可以使用VLC等播放器来测试拉。同时,需要监控FFmpeg的日志输出,确保没有编码错误或网络问题。 可能的挑战包括处理并发时的资源管理,比如CPU和内存的使用,因为多个FFmpeg实例可能消耗较多资源。另外,网络带宽也是一个考虑因素,特别是当数量增加时,需要确保服务器带宽足够。 最后,扩展性方面,可以考虑将任务分布式部署,或者使用线程池来管理FFmpeg进程,以提高系统的处理能力。此外,添加身份验证或安全措施,比如在URL中使用token,可能也是必要的,以防止未授权的。 总结来说,步骤大致分为:配置SRS服务器,准备视频源,编写FFmpeg命令,集成到Spring Boot服务中,执行和管理进程,以及验证和监控。需要确保每个环节都正确无误,才能实现稳定的多路RTMP送。</think>以下是一个分步骤的解决方案,介绍如何使用 SpringBoot + FFmpeg + SRS 实现多条 RTMP 送: --- ### 一、系统架构理解 $$系统架构 = \text{SpringBoot(控制层)} \rightarrow \text{FFmpeg工具)} \rightarrow \text{SRS媒体服务器)}$$ 1. **SpringBoot** 作为控制中心,管理任务 2. **FFmpeg** 负责视频转码和 RTMP 协议 3. **SRS** 接收并分发 RTMP/HLS/HTTP-FLV --- ### 二、环境准备 #### 1. SRS 服务器部署 ```bash # 下载并编译 SRS git clone https://github.com/ossrs/srs cd srs/trunk && ./configure && make # 启动 SRS(默认使用 RTMP 端口 1935) ./objs/srs -c conf/srs.conf ``` #### 2. FFmpeg 安装 ```bash # Ubuntu 示例 sudo apt install ffmpeg ``` #### 3. SpringBoot 项目 ```xml <!-- pom.xml 添加进程调用依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version> </dependency> ``` --- ### 三、核心实现步骤 #### 1. 定义命令模板 $$cmd = \text{ffmpeg} \ -re \ -i \ {input\_url} \ -c:v \ libx264 \ -f \ flv \ {rtmp\_url}$$ - `{input_url}`: 输入地址(如:`/dev/video0`, `rtsp://ip:port/stream`) - `{rtmp_url}`: 输出地址 `rtmp://srs_ip:1935/live/{stream_key}` #### 2. SpringBoot 服务实现 ```java public class StreamService { // 存储进程 private static Map<String, Process> processMap = new ConcurrentHashMap<>(); // 启动 public static void startStream(String streamKey, String inputUrl) { String rtmpUrl = "rtmp://your_srs_ip:1935/live/" + streamKey; String cmd = String.format("ffmpeg -re -i %s -c:v libx264 -f flv %s", inputUrl, rtmpUrl); try { Process process = Runtime.getRuntime().exec(cmd); processMap.put(streamKey, process); } catch (IOException e) { e.printStackTrace(); } } // 停止 public static void stopStream(String streamKey) { Process process = processMap.get(streamKey); if (process != null) { process.destroy(); processMap.remove(streamKey); } } } ``` #### 3. 控制层示例 ```java @RestController @RequestMapping("/stream") public class StreamController { @PostMapping("/start") public ResponseEntity<String> start(@RequestParam String streamKey, @RequestParam String sourceUrl) { StreamService.startStream(streamKey, sourceUrl); return ResponseEntity.ok("启动: " + streamKey); } @PostMapping("/stop") public ResponseEntity<String> stop(@RequestParam String streamKey) { StreamService.stopStream(streamKey); return ResponseEntity.ok("停止: " + streamKey); } } ``` --- ### 四、多管理关键点 1. **标识唯一性**:每个 `stream_key` 对应唯一(如:`stream1`, `stream2`) 2. **资源隔离**:为每个任务创建独立进程 3. **错误处理**: - 监控 FFmpeg 进程退出码 - 添加日志重定向:`ProcessBuilder.redirectErrorStream(true)` --- ### 五、验证 1. **测试命令**: ```bash ffmpeg -re -i input.mp4 -c:v libx264 -f flv rtmp://srs_ip:1935/live/test ``` 2. **播放验证**: - VLC 打开:`rtmp://srs_ip:1935/live/{stream_key}` - HTTP-FLV:`http://srs_ip:8080/live/{stream_key}.flv` --- ### 六、扩展优化建议 1. **动态参数配置**: ```yaml # application.yml srs: rtmp-url: rtmp://${srs.host}:1935/live/ ``` 2. **资源监控**: - 限制单个 FFmpeg 进程的 CPU/内存使用 - 使用 `-threads 2` 控制编码线程数 3. **集群部署**:多 SRS 节点 + NGINX 负载均衡 --- ### 七、常见问题排查 1. **失败**: - 检查 SRS 防火墙设置(开放 1935/TCP) - 验证 FFmpeg 路径是否在系统 PATH 中 2. **延迟过高**: - 添加低延迟参数:`-preset ultrafast -tune zerolatency` - 调整 GOP 长度:`-g 30` 通过以上步骤,可实现基于 SpringBoot 的多路 RTMP 送系统,适用于直播、监控等场景。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值