rtmp测试地址_超详细搭建多码率测试环境(成为流媒体高手必经之路)
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测试地址_超详细搭建多码率测试环境(成为流媒体高手必经之路)相关推荐
- 关于fi dd ler 手机抓包 网卡地址地址_超详细的网络抓包神器 tcpdump 使用指南
tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有.熟悉 tcpdump 的使用能够帮助你分析调试网络数据,本文将 ...
- k8s v1.9.6 超详细搭建步骤
部署说明 k8s新的版本与之前1.5的部署方式发生改变,官方将kubernetes大组件中的服务例如(kube-proxy.kube-api等服务)剥离出来封装成容器的形式来简化部署的方式.以下为三个 ...
- ICT,电路测试教程_您真得了解ICT测试吗?
ICT,电路测试教程_您真得了解ICT测试吗? 本文介绍:有关用于PCB(印刷电路板)测试的在线测试,ICT和在线测试设备的所有基本要素的说明和详细信息. 自动测试设备(ATE)包括如下几个概念: 在 ...
- 超详细 WSL2安装+深度学习环境配置
超详细 WSL2安装+深度学习环境配置 一点记录 ! 正式开始 ! 先决条件 WSL 启用 一.命令安装 二.手动安装(推荐方式) 三.设置 WSL 默认大版本 四.更新 WSL2 版本(可选) 五. ...
- 【CDH】超详细-搭建本地大数据研发环境(16G内存+CDH)
工欲善其事必先利其器,在经过大量的理论学习以后,需要有一个本地的研发环境来进行练手.已经工作的可以不依赖于公司的环境,在家也可以随意的练习.而自学大数据的同学,也可以进行本地练习,大数据是一门偏实践的 ...
- 同一个项目相互调接口_超详细——接口测试总结与分享(一)
1,接口的概念 1.接口是啥? 接口是传递数据的通道 接口测试: 是测试系统组件间接口的一种测试 接口主要包括: 同一个系统中模块与模块间的接口/前端后端接口, 另一个是跨系统平台与平台间的对接(内部 ...
- win10图标变白纸_超详细的纯净版win10安装教程,手把手教你学会,小白秒变大神!...
最近很多用户问怎么安装纯净版的win10系统,那么今天针对这个问题,和大家分享一下超详细的纯净版win10安装教程,手把手教学,大伙们赶紧收藏哦! 如何安装?这一完整教程分为4个部分: 准备工作→系统 ...
- 超十万字_超详细SSM整合实践_手动实现权限管理
SSM整合_基础配置 SSM框架中包含Spring,SpringMVC,Mybatis.而Spring与SpringMVC都是Spring Framework的模块,无需整合.只需将Mybatis与S ...
- url获取网站信息不包含网页源文件内的标签_超详细的网站内部seo优化教程
很多人把seo分为站内和站外,也有人把seo分为搜索需求覆盖,收录,排序,展现和数据分析,结果是一样的,看待seo的角度有所不同.网站内部即站内seo优化教程主要从站内讲解如何做seo.另外,一篇文章 ...
最新文章
- (转)mq经验总结-转
- 淡淡说说技术人员创业
- Spring Roo 简介
- 软件设计师学习3——操作系统知识1
- Sqlserver数据类型精解
- iOS开发使用TouchID验证登录踩过的一些坑(同时更新FaceID使用方法)
- java textarea 自动滚动条,textarea根据内容自动延伸,不显示滚动条
- spss之数据预处理
- 在网页上查看App Store的app介绍
- Selenium04-selenium中的Xpath元素定位方法爬虫实践
- [jzoj5236]【NOIP2017模拟8.7A组】利普希茨
- 飞鸽短信平台发送国际短信
- Software Testing - UI自动化测试常用设计模式之工厂(Java)
- 【日语】日语商务情景口语
- 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘
- 一文搞懂Go语言的plugin
- Kuang_spring笔记
- 基于eNSP的小型企业网(附ensp源文件)
- Ubuntu18.04环境下I219-LM网卡不能识别问题解决
- 【软件开发】使用Electron开发简单的记事本
热门文章
- html整个项目怎么导出来,怎样将jquery导入web项目中?
- python读取usb扫码枪数据_USB
- 研究所月入两万,是一种什么体验?
- LL-verilog-HDLBitSim/circuit10解答和过程详解
- python微博热点_用 Python 监控知乎和微博的热门话题
- python int32 int8_Int8量化-介绍(一)
- java正则转义_Java 正则表达式 转义字符
- php 循环多条件,怎么循环带条件的数组
- 陈百强原来这么帅_朱一龙虽然很少玩手机,但居式打字法很有个性,手指飞舞超级帅!...
- oracle ebs po_header_all含税单价,Oracle EBS-追踪PO全过程