音视频学习 (十) 基于 Nginx 搭建(rtmp、http)直播服务器

avatar
作者
猴君
阅读量:2

测试环境:

电脑 : MAC

推流软件: obs-studio

MAC 拉流软件: VLC

Android 拉流软件: 前几天写的一个 Android 播放器 ykplayer 正好供于拉流测试

HTML5 FLV 播放器: bilibili 开源的 flv.js

本来之前我是借助 nginx-rtmp-module 来搭建的直播服务器(已成功),奈何它好像不支持 Http-flv 协议,所以替换成了 nginx-http-flv-module 模块,它是基于 nginx-rtmp-module 模块二次开发的,所以完美的继承了 rtmp 模块的所有功能。

服务器搭建

1. download nginx

通过 wget 命令下载

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

解压

tar -zxvf nginx-1.17.8.tar.gz

2. download nginx-http-flv-module

提醒: 关于它的详细信息可以参考它的介绍

通过 wget 命令下载

wget https://github.com/winshining/nginx-http-flv-module/archive/v1.2.7.tar.gz

解压

tar -zxvf v1.2.7.tar.gz

重命名

mv v1.2.7 nginx-http-flv-module

3. install nginx 需要的环境

如果在执行 configure 之后报 OpenSSL 、PCRE 、Zlib error 那么就必须安装它们

#安装 openssl
yum install openssl
#安装 pcre
yum install pcre-devel
#安装 zlib
yum install zlib-devel

等它们安装好了之后编译 nginx

4. build nginx

在当前解压 nginx 目录中创建编译 nginx 和 http-flv 脚本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#!/bin/sh

…/ 代表当前目录的上一级

HTTP_FLV_MODULE_PATH=…/nginx-http-flv-module-1.2.7
OpenSSL_PATH=…/openssl-1.1.1d
#–prefix=./bin 代表编译完成之后输出的路径地址
#–add-module 将拓展模块添加到当前一起编译
./configure --prefix=./bin
–add-module= H T T P F L V M O D U L E P A T H   − − w i t h − o p e n s s l = HTTP_FLV_MODULE_PATH \ --with-openssl= HTTPFLVMODULEPATH withopenssl=OpenSSL_PATH
–with-debug

通过 make install 构建

make
make install

如果中途没有报任何错误,并且输出了我们指定的 bin 目录,那么就代表成功了。如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5. 配置 nginx.conf

在当前目录下输入 vim bin/conf/nginx.conf 进行配置 rtmp、http 直播协议,我直接贴上我的配置

user root;
worker_processes auto; #运行在Windows上时,设置为1,因为Windows不支持Unix domain socket
#worker_processes auto; #1.3.8和1.2.5以及之后的版本

#worker_cpu_affinity 0001 0010 0100 1000; #只能用于FreeBSD和Linux
worker_cpu_affinity auto; #1.9.10以及之后的版本

error_log logs/error.log error;

#如果此模块被编译为动态模块并且要使用与RTMP相关的功
#能时,必须指定下面的配置项并且它必须位于events配置
#项之前,否则NGINX启动时不会加载此模块或者加载失败

#load_module modules/ngx_http_flv_live_module.so;

events {
worker_connections 4096;
}

http {
include mime.types;
default_type application/octet-stream;

keepalive_timeout 65;

server {
listen 80;//自定义填写 http 的端口

location / {
root /root/nginx/nginx-http-flv-module-1.2.7/test/www;
index index.html index.htm;//默认首页
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location /flvjsplay {//测试地址
root /root/nginx/flv.js-1.5.0;
index index.html;//flv.js 测试播放首页
}

location /flv {
flv_live on; #打开HTTP播放FLV直播流功能
chunked_transfer_encoding on; #支持’Transfer-Encoding: chunked’方式回复
#跨域
add_header ‘Access-Control-Allow-Origin’ ‘*’; #添加额外的HTTP头
add_header ‘Access-Control-Allow-Credentials’ ‘true’; #添加额外的HTTP头
}

location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}

root /root/nginx/nginx-http-flv-module-1.2.7;
add_header ‘Cache-Control’ ‘no-cache’;
}

location /dash {
root /root/nginx/nginx-http-flv-module-1.2.7;
add_header ‘Cache-Control’ ‘no-cache’;
}

location /stat {
#push和pull状态的配置
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}

location /stat.xsl {
root /root/nginx/nginx-http-flv-module-1.2.7; #指定stat.xsl的位置
}

#如果需要JSON风格的stat, 不用指定stat.xsl
#但是需要指定一个新的配置项rtmp_stat_format

#location /stat {

rtmp_stat all;

rtmp_stat_format json;

#}

location /control {
rtmp_control all; #rtmp控制模块的配置
}
}
}

rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /root/nginx/nginx-http-flv-module-1.2.7;

rtmp {
out_queue 4096;
out_cork 8;
max_streams 128;
timeout 30s;
drop_idle_publisher 30s;

log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
log_size 1m; #log模块用来记录日志的缓冲区大小

server {
listen 1935;//自定义 rtmp 端口

server_name www.test.*; #用于虚拟主机名后缀通配

application devyk {
live on;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}

application hls {
live on;
hls on;
hls_path /root/nginx/nginx-http-flv-module-1.2.7/hls;
}

application dash {
live on;
dash on;
dash_path /root/nginx/nginx-http-flv-module-1.2.7/dash;
}
}

#可以有多个 server 配置
}

Nginx 配置文件详解请看该篇文章

nginx-rtmp-module配置指令详解

在根目录输入 bin/sbin/nginx -t , 如出现如下就说明配置成功。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6. 开启 nginx 服务

#开启服务
bin/sbin/nginx
#停止服务
bin/sbin/nginx -s stop
#重启服务
bin/sbin/nginx -s reload

7. 网页测试是否都显示正常

  1. 直接在网页上输入: http://ip:port,如果出现如下,证明首页和基本配置没有问题了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 直接在网页输入: http://ip:port/stat 如出现如下监控页面,说明监控页面一切正常。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在服务器搭建完成,下面可以进入测试环节了。

rtmp 推流

我们直接用开源 obs-studio 软件进行推流,听说很多游戏主播也用该款推流软件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

推流源设置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上图所示,证明已经推流成功了,下面我们就来测试拉流。

拉流

flv 在 Html5 上播放

注意: 其它播放也是如下格式,这里只是以 Html 举例说明:

例子:

假设在http配置块中的listen配置项是:

http {

server {
listen 8080; #不是默认的80端口

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
…(img-2CuSTpC6-1712780212067)]

[外链图片转存中…(img-PcQqiT14-1712780212067)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-zbFavIgk-1712780212067)]

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!