0.引言

关注我的朋友,应该都知道,前面我们讲解了如何搭建srs流媒体服务器,链接如下。由于srs流媒体服务器是不支持多码率测试环境,所以不能在上次的环境上继续演示。那本篇文章就要给出一个新方案,就是使用Nginx+Rtmp模块+Hls来演示,在流媒体服务器上,如何使用多码率(实际项目中,也很多这样使用)。那就跟我一起好好学吧。也有很多人写关于流媒体文章,但干货的文章太少,我希望把尽量多的干货,分享给大家,这样想学习的朋友,才会进步更快。

环境准备提醒

如果你还没有搭建ubuntu系统,那请参考第(4)步。如果ubuntu系统搭建好了,还没有搭建ffmpeg在win和ubuntu的环境,请参考第(5)步和第(3)步。如果前面几步都做好了,一般就可以本文的环境搭建了。至于第(1)和第(2)步,是针对srs流媒体服务器环境搭建,如果要学习hls和srs流媒体服务器,第(1)和第(2)步是必须要学习。

在搭建环境的过程中,也遇到过不少坑,我把这些坑也在文章中整理出来了,希望能够帮到大家,如果大家觉得有用,可以关注,后面还会有更多实用的流媒体文章,供大家学习。遇到问题一定不要慌,需要思考问题出现在哪里,一个个排查。

(1) 手把手搭建流媒体服务器详细步骤

(2) 手把手配置HLS流媒体服务器

(3) 超详细手把手搭建在ubuntu系统的FFmpeg环境

(4) 最快系统搭建:Vmware、ubuntu18.0及常用软件安装

(5) 手把手搭建FFmpeg的Windows环境

1.搭建多码率流程

要实现多码率测试,主要经过以下一些流程。

(1)推流端,推流上去,可以使用obs,ffmpeg或其它推流工具都可以。

(2)流媒体服务器端,对推上去的流,转码,实现超高清,高清,标清的码流。如暂定300kB码流是超高清,200kB是高清,100Kb是标清。同时,带宽也是需要配置,也就是说,根据不同的带宽来拉取不同码率的流。

(3)使用ffplay或其它播放工具去拉取码流,在播放端可以自由选择或单独拉取超高清,高清,标清。实现了市面上很多播放器的自适应方案。如果使用ffplay播放,ffplay里的快捷键使用如下,如按键盘的“C”键可以切换码流。ffplay快捷键,如下图所示:

master列表,代表有不同码率。

根据master列表,找到真正的playlist,如下图:

2 搭建nginx-rtmp开源项⽬

(1) 关于项目搭建,一定要知道这个地址,可以在原生的基础上,支持flv-module。相当于(1)是在(2)的基础上做的二次开发。如下:

nginx-http-flv-module(增加新功能)地址:https://github.com/winshining/nginx-http-flv-module

其github界面如下:

(2)关于nginx-rtmp-module(功能要少),原来的官网地址如下。

nginx-rtmp-module(功能要少)地址:https://github.com/arut/nginx-rtmp-module。

其github界面如下:

(3) nginx-http-flv-module的其他功能与nginx-rtmp-module的对⽐,对比看看,在原生的基础上,增加了哪些新功能。图中" 根号"表示新增加功能,"X"表示原生不支持,对比下,就知道这个新增加的功能还是很实用的。如果你有更好的方案,可以告诉我,我们一起交流。如下图:

3. 安装依赖库

安装系统相关的依赖库。如果你的系统都已经具备了这些库,可以不用理会。也可以先安装后面的步骤,如果发现缺少库,再回来安装这些库。命令如下:

sudo apt-get update#安装依赖:gcc、g++依赖库sudo apt-get install build-essential libtool #安装 pcre依赖库(http://www.pcre.org/) sudo apt-get install libpcre3 libpcre3-dev#安装 zlib依赖库(http://www.zlib.net)sudo apt-get install zlib1g-dev#安装ssl依赖库sudo apt-get install openssl

4. 安装nginx-http-flv-module

安装nginx-http-flv-module,也就是前面所说的,增加了很多新功能的版本。

(1)打开ubuntu系统,在相应的目录下,创建相应的文件,如我创建的如下:

执行命令:

mkdir rtmp-nginx

执行界面如下:

(2)进入上面创建的文件夹,下载nginx-http-flv-module

执行命令:

cd rtmp-nginx

执行界面如下:

(3)下载nginx-http-flv-module,执行命令:

git clone https://github.com/winshining/nginx-http-flv-module.git

执行界面如下:

下载完后,界面如下:

注意:如果下载过程中,网络较慢,耐心等待。

(4) 查看当前目录是否有,执行命令:

ls

界面如下:

(5)在当前目录,下载nginx

在下载nginx之前,一定要安装ssl,否则会出错。这里先给出本小节所有的命令,后面再逐一演示。

#下载nginx 1.19.2版本wget http://nginx.org/download/nginx-1.19.2.tar.gz tar xvzf nginx-1.19.2.tar.gz cd nginx-1.19.2/    # 配置,⼀定要⽀持https,安装目录可以实时修改 ./configure --prefix=/usr/local/rtmp-nginx --with-http_ssl_module--add-module=/home/qaa/share/rtmp-nginx/nginx-http-flv-module # 编译 make#安装 sudo make install 最终安装到⽬录:/usr/local/rtmp-nginx/nginx 目的:主要是避免和原有的nginx有冲突(如果你系统还有其它版本)

(6)下载nginx 1.19.2版本

执行命令:

wget http://nginx.org/download/nginx-1.19.2.tar.gz

界面如下:

(7) 在当前目录下,查看是否有下载到当前目录。

执行命令:

ls

界面如下:

(8) 在当前目录下,解压下载好的nginx,执行解压命令:

tar xvzf nginx-1.19.2.tar.gz

界面如下:

(9) 解压完成后,执行命令:

ls

如下界面:

(10) 进入nginx-1.19.2目录下,执行命令:

cd nginx-1.19.2/

如下界面:

(11) 创建nginx安装目录,目的是为了与以前默认安装在系统目录的nginx或其它版本的nginx,做区分,在如下路径,执行命令:

mkdir rtmp-nginx

如下界面:

(12)回到目录/home/qaa/share/rtmp-nginx/nginx-1.19.2,并执行如下命令:

./configure --prefix=/usr/local/rtmp-nginx --with-http_ssl_module --add-module=/home/qaa/share/rtmp-nginx/nginx-http-flv-module

如下界面:

注意:添加module的目录,一定要配置正确,否则就有可能出错。

如下界面,就是应为目录指定错误而出了如下错误。

(13)继续在当前目录,编译,执行命令:

make

执行界面如下:

编译过程,耐心等待。

编译完成后,如下提示:

(14)继续在当前目录,执行命令:

sudo make install

执行界面:

注意这个安装目录就是之前创建的目录(/usr/local/rtmp-nginx),如下:

如果出现如下界面,就代表安装成功了,并且与以前的nginx版本不冲突。具体的执行的路径就在sbin目录下。

(15) 在当前目录下,修改配置文件。

执行如下命令

vim conf/nginx.conf

修改为如下:

目前是测试环境,可以配置为前台运行,查看相关log信息。如果需要后台运行可以不修改。

新增 daemon off,就可以配置为前台运行。

(16) 在当前目录,启动nginx

执行如下命令:

sudo sbin/nginx -c conf/nginx.conf

如下界面:

(17) 启动成功后,我们测试nginx是否安装成功,在浏览器这里测试下。

输入地址:

http://172.16.204.133:80/

成功安装nginx后的界面如下:

如果出现如下错误,表示端口号被占用,需要修改配置文件的端口号。

错误提示如下:

修改配置文件的端口为8081。

(18)Nginx命令相关

如果需要停止nginx,可以执行如下命令:

sudo /usr/local/nginx/rtmp-nginx/sbin/nginx -s stop

如果要重新加载配置文件,可以执行如下命令:

sudo /usr/local/rtmp-nginx/nginx/sbin/nginx -s reload

5.配置⽂件

(1)配置文件,这一步很关键,我先把配置文件(实测可行)给出来,如下,后面再做详细解释。在ubuntu下一定要注意nginx.conf文件书写格式,否则可能没办法拉流。我就碰到过一个坑,就是能够拉取rtmp流,不能拉取hls流,后来发现就是格式问题

daemon off;# 如果开启off对应的ts文件不并删除# master_process off; user root;error_log /tmp/error.log debug;events{    worker_connections 1024;}rtmp{    server {        listen 1935;        chunk_size 4000;        #live        application live {   live on; exec /root/bin/ffmpeg -i rtmp://localhost/live/$name -c:a copy  -c:v libx264 -b:v 300K -g 30 -f flv rtmp://localhost/hls/$name_hi-c:a copy  -c:v libx264 -b:v 200K -g 30 -s 462x254 -f flv rtmp://localhost/hls/$name_mid-c:a copy  -c:v libx264 -b:v 100K -g 30 -s 230x128 -f flv rtmp://localhost/hls/$name_low;        }               application hls {            live on;            hls on;            hls_path /tmp/hls;            hls_nested on;            hls_fragment 2s;            hls_playlist_length 6s;            hls_variant _hi  BANDWIDTH=350000;    hls_variant _mid BANDWIDTH=250000;    hls_variant _low BANDWIDTH=150000;        }     }}#HTTPhttp{    server {        listen 8081;        #welcome        location / {            root   html;            index  index.html index.htm;        }        #hls         location /hls {            types {                application/vnd.apple.mpegusr m3u8;                video/mp2t ts;            }            #root /tmp;    alias /tmp/hls;            add_header Cache-Control no-cache;        }       }}

(2)解析配置文件,上面这些配置文件,究竟是干什么呢?作用是什么呢?

首先来看看rtmp模块的配置,如下图:

用不同颜色的线连接起来的都是一一对应。

listen 1935:表示rtmp服务默认监听的端口号。

application live:表示直播应用。这里面就是使用ffmpeg做的转码,不停地把视频转码为超高清,高清,标清,三份码流。

$name:表示节目名称,这里指的是livestream。

application hls:表示hls应用,与application live中的rtmp://localhost/hls/$name_xxx,一一对应。其中hls_variant _hi与application live中的rtmp://localhost/hls/$name_hi也是一一对应。hls应用中BANDWIDTH=350000,这里与m3u8文件的BANDWIDTH=350000是一一对应。

(3)然后,再看看HTTP模块,配置文件如下图所示:

listen 8081:http模块监听的端口号,默认是80,这里做了修改。

location /:这是使用浏览器访问http,出现默认的网页(html和index.html),比如如下图所示:

location /hls:这里与流地址http://xxx:端口号/hls/livestream.m3u8是一一对应。

types:表示m3u8和ts文件类型。

alias /tmp/hls:表示存放m3u8和ts文件路径。

(4) 进入当前如下目录

/usr/local/rtmp-nginx/conf

执行命令

vim nginx.conf

参照上面的配置文件,对nginx.conf进行修改。

界面如下:

注意:由于修改前后的配置文件,还是有些差别,所以为了保险起见,就把原来的配置文件,进行备份。源文件和备份文件,分别是,如下界面。

通过ffmpeg命令行去转码,转成不同的码率。这里的音频并没有做修改,只是把视频做了三份不同码率的,来模拟超高清,高清,标清。

关于分片需要说明下,如果源码流,帧率是15帧,gop为30,这个时候ts分片至少2秒,因为分片至少是一个完整的gop。下面参数仅仅供参考,所有参数都需要根据实际的需求去配置。

(5)下面参数的$name就是livestream,在后面超高清,高清,标清的名字就拼接成livestream_hi,livestream_mid,livestream_low。其中rtmp://localhost/hls/$name_low,其中hls对应的就是下面配置的application hls。其中rtmp://localhost/live/$name,其中live对应的就是上面配置的application live

注意:ffmepg的路径一定要指定对,否则可能无法生效。我这里ffmpeg的路径在/root/bin/ffmpeg。

application hls中,大括号中,hls_path /tmp/hls,表示hls的路径。如下界面:

注意:如果没有hls文件夹,那就需要再创建一个。

(6) 修改好上述配置文件后,那就再重新执行nginx。

在如下路径:

/usr/local/rtmp-nginx

执行命令:

sudo sbin/nginx -c conf/nginx.conf

注意:这里修改后配置文件,不能再使用80端口,重新修改端口为8081,再启动。否则会端口被占用的错误。

修改端口后正确执行:

前台启动界面:

6.测试

(1)经过前面一番折腾,终于可以测试了。客户端使用ffmpeg推流。

这里需要搭建win下的ffmpeg开发环境,可以看看这篇文章,手把手搭建FFmpeg的Windows环境

执行推流命令:

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

注意:IP也需要换成你自己的才行。

执行界面如下:

(2) RTMP流地址为:

rtmp://172.16.204.133/live/livestream

(3) HLS流地址为:

http://172.16.204.133/hls/livestream.m3u8http://172.16.204.133/hls/livestream_hi/index.m3u8

(4) 拉流端,可以使用ffplay和vlc进行测试。

我这里就使用ffplay拉流,可以拉取到rtmp流。其中命令为:

ffplay rtmp://172.16.204.133/live/livestream

界面如下:

(5) 拉取hls流:

ffplay http://172.16.204.133/hls/livestream.m3u8

超高清界面如下:

高清界面如下:

标清界面如下:

可以看到这里超高清,高清,标清以及master列表。

注意:使用ffplay拉流,可以按下键盘“C”键,然后自由切换超高清,高清,标清。

执行命令:

cd /tmp/hls

ls

界面如下:

(6) 现在随便进入一个文件。

执行命令:

cd livestream_hi

ls

可以看到这里很多ts文件,这里ts的文件是及时更新,个数与上面配置的切片个数有关系,这里设置的6个。界面如下:

(7) 再看看其它目录

执行命令

cd livestream_mid

ls

界面如下:

(8) 再看看其它目录

执行命令

cd livestream_low

ls

界面如下:

ffplay拉取的日志界面如下:

(9) 服务器使用ffmpeg查看转码命令,实时查看ffmpeg是否有在运行。

执行命令:

sudo ps -ef | grep ffmpeg

要看到如下界面,才说明成功了。否则就是不成功。

使用如下命令,单独拉取超高清码流,也是可以:

执行命令:

ffplay http://172.16.204.133/hls/livestream_hi/index.m3u8

拉取的日志界面:

注意:这个时候,再按键盘"C"键是不生效的,因为你已经选定了超高清了,不能再换了。如果要自由切换,那需要上上面的方式。

(10) 如果推流结束,那么/tmp/hls下的就为空了,ts文件都会被及时删除,也可以配置不删除。

如下界面:

(11) 在前面配置文件的章节中,有配置流媒体服务器日志的路径,通过命令行可以查看。通过日志文件可以排查和定位问题。

执行命令:

tail -f error.log

界面如下:

注意:这里就是上面所说的坑的问题,因为格式写错,而无法拉取hls流。如果使用右边书写有误的配置文件,ffplay拉流就会出现如下图404错误。

7.码流切换建议

关于自适应码率切换,我的建议是,由用户来选择,不要帮用户选择。当网络不好时,需要提醒用户,建议用户去切换码流,当网络良好的时候吗,再切换回来。如果帮用户去切换,通过日志发现,码流会频繁切换,有时会造成卡顿的现象。

8.模拟丢包测试

如果需要模拟丢包和延迟测试,作些debug,可以按照如下命令去测试:

//1. 延迟设置//延迟 300ms ± 100ms sudo tc qdisc add dev eth0 root netem delay 300ms 100mssudo tc qdisc del dev eth0 root netem delay 300ms 100ms// 2. 丢包 //丢包率 5%sudo tc qdisc add dev eth0 root netem loss 30% sudo tc qdisc del dev eth0 root netem loss 5%

界面如下:

9.总结

本文搭建环境是在前面环境的基础上做的,所以需要前面的基础作为铺垫。整理这些文章是为了帮助更多想学流媒体,而又遇到很多困难,而放弃的人。希望能够帮助更多的人,各位朋友的喜欢,才是我分享的动力。

创作、整理实战型文章不易,如果觉得对你或你的朋友有用,可以关注,转发,点赞,收藏,分享,评论区讨论。

后期关于项目的知识,会在微信公众号上更新,如果想要学习项目,可以关注微信公众号“记录世界 from antonio”

rtmp测试地址_超详细搭建多码率测试环境(成为流媒体高手必经之路)相关推荐

  1. 关于fi dd ler 手机抓包 网卡地址地址_超详细的网络抓包神器 tcpdump 使用指南

    tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有.熟悉 tcpdump 的使用能够帮助你分析调试网络数据,本文将 ...

  2. k8s v1.9.6 超详细搭建步骤

    部署说明 k8s新的版本与之前1.5的部署方式发生改变,官方将kubernetes大组件中的服务例如(kube-proxy.kube-api等服务)剥离出来封装成容器的形式来简化部署的方式.以下为三个 ...

  3. ICT,电路测试教程_您真得了解ICT测试吗?

    ICT,电路测试教程_您真得了解ICT测试吗? 本文介绍:有关用于PCB(印刷电路板)测试的在线测试,ICT和在线测试设备的所有基本要素的说明和详细信息. 自动测试设备(ATE)包括如下几个概念: 在 ...

  4. 超详细 WSL2安装+深度学习环境配置

    超详细 WSL2安装+深度学习环境配置 一点记录 ! 正式开始 ! 先决条件 WSL 启用 一.命令安装 二.手动安装(推荐方式) 三.设置 WSL 默认大版本 四.更新 WSL2 版本(可选) 五. ...

  5. 【CDH】超详细-搭建本地大数据研发环境(16G内存+CDH)

    工欲善其事必先利其器,在经过大量的理论学习以后,需要有一个本地的研发环境来进行练手.已经工作的可以不依赖于公司的环境,在家也可以随意的练习.而自学大数据的同学,也可以进行本地练习,大数据是一门偏实践的 ...

  6. 同一个项目相互调接口_超详细——接口测试总结与分享(一)

    1,接口的概念 1.接口是啥? 接口是传递数据的通道 接口测试: 是测试系统组件间接口的一种测试 接口主要包括: 同一个系统中模块与模块间的接口/前端后端接口, 另一个是跨系统平台与平台间的对接(内部 ...

  7. win10图标变白纸_超详细的纯净版win10安装教程,手把手教你学会,小白秒变大神!...

    最近很多用户问怎么安装纯净版的win10系统,那么今天针对这个问题,和大家分享一下超详细的纯净版win10安装教程,手把手教学,大伙们赶紧收藏哦! 如何安装?这一完整教程分为4个部分: 准备工作→系统 ...

  8. 超十万字_超详细SSM整合实践_手动实现权限管理

    SSM整合_基础配置 SSM框架中包含Spring,SpringMVC,Mybatis.而Spring与SpringMVC都是Spring Framework的模块,无需整合.只需将Mybatis与S ...

  9. url获取网站信息不包含网页源文件内的标签_超详细的网站内部seo优化教程

    很多人把seo分为站内和站外,也有人把seo分为搜索需求覆盖,收录,排序,展现和数据分析,结果是一样的,看待seo的角度有所不同.网站内部即站内seo优化教程主要从站内讲解如何做seo.另外,一篇文章 ...

最新文章

  1. (转)mq经验总结-转
  2. 淡淡说说技术人员创业
  3. Spring Roo 简介
  4. 软件设计师学习3——操作系统知识1
  5. Sqlserver数据类型精解
  6. iOS开发使用TouchID验证登录踩过的一些坑(同时更新FaceID使用方法)
  7. java textarea 自动滚动条,textarea根据内容自动延伸,不显示滚动条
  8. spss之数据预处理
  9. 在网页上查看App Store的app介绍
  10. Selenium04-selenium中的Xpath元素定位方法爬虫实践
  11. [jzoj5236]【NOIP2017模拟8.7A组】利普希茨
  12. 飞鸽短信平台发送国际短信
  13. Software Testing - UI自动化测试常用设计模式之工厂(Java)
  14. 【日语】日语商务情景口语
  15. 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘
  16. 一文搞懂Go语言的plugin
  17. Kuang_spring笔记
  18. 基于eNSP的小型企业网(附ensp源文件)
  19. Ubuntu18.04环境下I219-LM网卡不能识别问题解决
  20. 【软件开发】使用Electron开发简单的记事本

热门文章

  1. html整个项目怎么导出来,怎样将jquery导入web项目中?
  2. python读取usb扫码枪数据_USB
  3. 研究所月入两万,是一种什么体验?
  4. LL-verilog-HDLBitSim/circuit10解答和过程详解
  5. python微博热点_用 Python 监控知乎和微博的热门话题
  6. python int32 int8_Int8量化-介绍(一)
  7. java正则转义_Java 正则表达式 转义字符
  8. php 循环多条件,怎么循环带条件的数组
  9. 陈百强原来这么帅_朱一龙虽然很少玩手机,但居式打字法很有个性,手指飞舞超级帅!...
  10. oracle ebs po_header_all含税单价,Oracle EBS-追踪PO全过程