云计算百科
云计算领域专业知识百科平台

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器。使用ffmpeg 命令推流到SRS 服务器,使用ffplay 命令 从 SRS 服务器拉流播放。OBS推流,拉流

零,在前面一章的学习,我们知道了 发送端是要将音视频数据 推流流媒体服务器,然后 客户端 从流媒体服务器拉流 播放。

因此第一个要掌握的就是如何 搭建一个 流媒体服务器

我们不可能在学习阶段就开发一个流媒体服务器,在学习的初步阶段 需要会使用成熟的流媒体服务器

1.本章节是学习 RTMP 流媒体协议,需要使用SRS 流媒体服务器

SRS(Simple Realtime Server)是一款开源流媒体服务器,专注于实时音视频传输,采用C++开发,具有高性能、低延迟、多协议支持等特点,适用于直播、在线教育、视频会议等场景

‌SRS 流媒体支持的协议:‌

  • 支持RTMP(实时消息传输协议)、HLS(HTTP Live Streaming)、HTTP-FLV(低延迟直播)、WebRTC(实时通信)、SRT(安全可靠传输)等主流流媒体协议。
  • 支持协议间互转(如RTMP转WebRTC),适配多种终端播放需求

一 安装和测试srs流媒体服务器

服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS)

推流端:ffmpeg 命令  或者  OBS

拉流端:ffplay 命令  或者 VLC 或者 srs播放器

1.1 安装srs流媒体服务器

官网

SRS (Simple Realtime Server) | SRS

码云的源速度快:
https://gitee.com/winlinvip/srs.oschina.git

github的源速度慢:
https://github.com/ossrs/srs
.git

第⼀步,获取SRS。

官网说明如下:

Git | SRS

将官网上废话删除,直接写关键点

0.我们在linux 上先创建一个文件夹放置SRS的源码,mkdir srs_source3.0

这个名字是随便取的,之所以取3.0,是因为学习的教程中就是用3.0教授的,实际版本已经有5.x了。

1:进入到 srs_source3.0文件夹,然后执行下面的命令。命令的意思下载SRS,

cd  srs_source3.0

git clone -b develop https://gitee.com/ossrs/srs.git &&
cd srs && git remote set-url origin https://github.com/ossrs/srs.git

由于上述命令有个 cd srs,因此执行完毕后,会直接进入到srs 目录

2:下载后需要checkout 到你要的branch,可以这样理解,你工作的时候,有可能公司的代码是基于SRS3.0开发的,那么你最好下载一个SRS3.0的版本,那么checkout就是帮你做这件事情的。

我们可以通过 git branch -a 看到SRS对应的版本有哪些。

cd trunk
git branch -a

我们可以看到目前SRS支持您切换的版本有好多,看官网的说明,3.0,  4.0,  5.0 都是稳定的版本。

3.我们切换到remotes/origin/3.0release 这个版本

官网的说明如下:如果是3.0的功能,更新代码后要改变到3.0分支:

注意的是git pull 可能会链接不上网络,因为你不会翻墙,当git pull 链接不上网络的时候,可以直接git checkout 3.0release

git pull && git checkout 3.0release

也可以直接命名您的当前branch 为3.0,实际上也是从remotes/origin/3.0release上获得的

git checkout -b 3.0 remotes/origin/3.0release

我们再次看一下  git branch 

注意的是:我们是需要下载到linux 下,而不是windows 下。

DASH 部署 | SRS

 

第⼆步,编译SRS。

cd  trunk

./configure && make

3.0在build 的时候,可能遇到的问题,可以参考如下两个博客

win11下,RTMP流媒体服务器保姆级教程-CSDN博客

https://www.cnblogs.com/6min/p/13960072.html

可以按照上述的方法fix,也可以checkout 到5.0,再 ./configure && make

如果正确make完成,编译的命令完成如下。

如果正确make 完成,则会在trunk 下 生成 objs文件夹下是否有srs 文件,这个srs是linux下的可执行文件

使用ls -la 可以看到 srs 是一个可执行文件。

第三步,编写SRS配置⽂件。详细参考RTMP分发

将以下内容保存为⽂件,譬如
conf/rtmp.conf
,服务器启动时指定该配置⽂件(srs的conf⽂件夹有该 ⽂件)。

listen 1935; //这个是rtmp 的端口
max_connections 1000; // 这个是支持的同时连接的最大连接数量
#daemon off; // 是否是 守护进程,但是老师说要注释掉,不注释 运行时会有error
#srs_log_tank console; // 这里行也有注释掉,老师说,不注释 运行时会有 error
vhost __defaultVhost__ {
}

目录是在/home/hunandede/srs_source/srs/trunk/conf/rtmp.conf

实际上,对于SRS,所有的配置都在 conf下面,各式各样的都能配置,功能还是很强大

第四步,启动SRS。

./objs/srs -c conf/rtmp.conf

  • ./objs/srs:运行SRS编译生成的可执行文件srs,位于trunk/objs目录下。
  • -c conf/rtmp.conf:通过-c参数指定配置文件路径,此处为conf/rtmp.conf,该文件定义了RTMP服务的监听端口、虚拟主机等核心参数

如果我们没有注释这两行,会有如下红色部分的error

#daemon              off;  // 是否是 守护进程,但是老师说要注释掉,不注释 运行时会有error #srs_log_tank        console;  //  这里行也有注释掉,老师说,不注释  运行时会有 error

如果我们将这两行注释了,则会正常运行

我们可以通过 sudo lsof -i:1935 查看1935  端口谁再使用

我们可以看到 使用 端口号 为   1935  的进程是那个,可以看到 PID 是 51636

然后,我们可以使用 sudo kill -9 51636 将这个进程杀死

然后再查看谁在占用 1935 端口号,就发现没有人在用了

这时候我们再使用  ./objs/srs -c conf/rtmp.conf 运行srs

运行起来后,提示  you can check SRS by : tail -n 30 -f ./objs/srs.log

如何查看srs 运行起来的log 

tail -n 30 -f ./objs/srs.log 看后最后30行

tail是linux下的命令,用于查看文件。实际上我们知道了 log 文件的路径,使用

我们直接使用 tail  -f ./objs/srs.log,看全部

到这里 SRS 中

1.2 测试srs流媒体服务器

首先要将 ubutun 的网络模式设置为桥接模式

这里再从 NAT 模式改动成 桥接模式的时候,还出现了一个问题。改成桥接模式后,linux没有ip地址了。原因是 不知道什么时候 将 虚拟网络编辑器 中的值改动了

要选择这个 自动 选项

这个是在测试中发现的,测试的时候linux是在NAT模式下,

linux ip为:192.168.245.130

windows IP为 : 192.168.0.125d

我在windows上 ping linux IP ,是成功的

在linux上 ping windows IP,也是成功的

但是在windows上去推流 数据到 linux服务器,会报I/O error。

改动为桥接模式后测试:

linux IP变化为:

inet 192.168.0.110

window ip还是

192.168.0.110

第五步,使用ffmpeg 推流 视频文件到 服务器。

使⽤FFMPEG命令推流:在windows端推流,可以调用ffmpeg 的命令

 
ffmpeg -re -i rtmp_test_hd.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.1.11/live/livestream

ffmpeg -re -i input.mp4 \\
    -c:v libx264 -preset ultrafast -tune zerolatency \\
    -c:a aac -ar 44100 -b:a 128k \\
    -f flv "rtmp://your_srs_server_ip:1935/live/stream_key"

ffmpeg 推流命令解释:
一、基础参数
  • ‌-re‌ 强制按输入文件的原始帧率读取数据,避免因高速处理导致音画不同步或服务器过载。

  • ‌-i input.mp4‌ 指定输入文件为input.mp4,支持绝大多数视频容器格式。


  • 二、视频编码配置
  • ‌-c:v libx264‌ 使用H.264编码器(libx264),兼容性最佳且支持硬件加速1。

  • ‌-preset ultrafast‌ 选择编码速度最快的预设,降低CPU占用但会增大输出体积1。

  • ‌-tune zerolatency‌ 启用零延迟优化,减少编码缓冲时间,适用于实时流传输1。


  • 三、音频编码配置
  • ‌-c:a aac‌ 采用AAC音频编码,主流直播协议(如RTMP)的通用选择。

  • ‌-ar 44100‌ 设置音频采样率为44.1kHz,平衡音质与带宽消耗1。

  • ‌-b:a 128k‌ 指定音频比特率为128kbps,属于高清音频的常见配置1。


  • 四、输出设置
  • ‌-f flv‌ 强制输出为FLV格式容器,RTMP协议的标准传输格式1。

  • ‌rtmp://…‌ SRS服务器的RTMP推流地址,需替换为实际IP和流密钥1。

    • 1935为RTMP默认端口
    • live/stream_key为SRS的流应用名和密钥
  • 推流测试问题一 fix

    测试中,推流使用的命令为

    ffmpeg -re -i D:/resource/SRSliumeiti.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -ar 44100 -b:a 128k -f flv -y rtmp://192.168.0.110/rtmpstudy001  

    ffmpeg -re -i D:/resource/SRSliumeiti.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -ar 44100 -b:a 128k -f flv -y rtmp://192.168.0.110/rtmpstudy001

    192.168.0.110 是当前 服务器所在的linux的ip。

    注意
    红色的部分,也就是说:在linux IP之后,只有一个,不再有分隔符了,这个是不符合 rtmp的规则的,rtmp 的推流要求,后面有两个,一个代表流应用名,一个代表密匙

    然后改动成

    ffmpeg -re -i D:/resource/SRSliumeiti.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -ar 44100 -b:a 128k -f flv -y rtmp://192.168.0.110/
    rtmpstudy/
    001

    就可以正确的推流了

    扩展1:

    那么如果后面有多个行不行呢?

    ffmpeg -re -i D:/resource/SRSliumeiti.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -ar 44100 -b:a 128k -f flv -y rtmp://192.168.0.110/
    rtmpstudy/
    movie/
    001

    使用拉流播放 也是可以的

        ffplay rtmp://192.168.0.110/rtmpstudy/movie/001
     

    扩展2:关于 nginx上配置 rtmp

    后面再学习nginx上配置 rtmp的时候,如下的可以参考 rtmp://39.105.129.233/myapp/ 参数 , rtmp 是 流媒体协议 , 39.105.129.233 是流媒体服务器 , myapp 是在 流媒体服务器 的 nginx.conf 中配置的 rtmp / server / application 配置中配置的应用名称 ;

    拉流 ffplay rtmp://192.168.31.251/study/acha

    注: 上述命令中的flv完整路径,以及srs server ip,⼤家根据情况⾃⾏替换为实际值。 另外:默认情况下

    srs的rtmp采⽤1935端⼝,如果该端⼝被占⽤或修改了srs.conf中的端⼝,注意根据情况调整;防⽕墙如 果开了,也要检测下1935是否允许访问。

    第六步,在windows上使用ffplay命令从linux SRS 服务器上 拉流 。

    1. 使用ffplay 测试拉流。RTMP流地址为:    ffplay rtmp://192.168.0.110/rtmpstudy/001

    2.或者可以使⽤VLC观看。

    3. 或者使⽤在线SRS播放器播放:srs-player

    SRS

    这个是需要部署到网络上的,我们的当前是在 linux上,因此无法测试

    1.3  使⽤OBS推流测试流媒体服务器SRS。 后面这个不是很重要。实际工作中用到的时候再去看。

    原生的OBS 推流支持 RTMP,但是不支持RTSP

    第七步:使用OBS推流

    ffmpeg的命令⾏⽅式不太友好,推荐使⽤主流的OBS开源推流软件,可从官⽹
    https://obsproject.com/

    下载最新版本,⽬前很多⽹络主播都是⽤它做直播。该软件⽀持本地视频⽂件以及摄像头推流。

    或者使⽤:
    https://pc.qq.com/detail/4/detail_23604.html
    去下载。

    我们这里的目的是选择一个文件通过OBS发送到 SRS服务器。

    然后再通过vlc 通过拉流的形式播放

    1.打开OBS,添加一个媒体文件,并且这里将 桌面的声音和 麦克风的声音关闭

    这个名字 "电影=制胜奇兵" 是随便取的一个名字

    由于选择的视频比较短,因此勾选了 循环,这个其实可以勾选,也可以不勾选

    这里会提示你选择 大小,我们默认就好。

    然后重要的来了,选择设置,

    在直播 选项中, 服务选择 为"自定义"

    服务器填写 linux 中的地址 movie 是随便填写的,

    推流码 也是随便填写的。

    使用身份认证应该是你 linux的账号和密码

    2.使用 vlc 播放

    地址为:

    rtmp://192.168.31.251/movie/zhishengqibing

    成功

    8.

    第八步:使用OBS 摄像头推流

    跟上⾯的其实差不多,区别只是添加“视频捕捉设备”

    1.4 更多设置

    参⻅:
    OBS 推流 https://cloud.tencent.com/document/product/267/32726

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器。使用ffmpeg 命令推流到SRS 服务器,使用ffplay 命令 从 SRS 服务器拉流播放。OBS推流,拉流
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!