Nginx hls流媒体服务器实现直播

2023-11-13

通过Nginx模块nginx-rtmp-module实现hls流媒体服务器并用OBS进行推流

一、直播协议简介:

首先,在搭建服务之前先了解下目前主流的几个直播协议:

1、RTMP:

     实时消息传输协议,Real Time Messaging Protocol,是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。这种方式的实时性比较强,基本能保证延迟在1-2s内,是现在国内直播主要采用的方式之一;不过使用这种协议,就必须安装flash,而H5、IOS、Android并不能原生支持flash,因此这种协议能流行多久,就不得而知了,毕竟移动端才是现在的主流。

2、HLS:

     hls是Apple推出的直播协议,是通过视频流切片成文件片段来直播的。客户端首先会请求一个m3u8文件,里面会有不同码率的流,或者直接是ts文件列表,通过给出的ts文件地址去依次播放。在直播的时候,客户端会不断请求m3u8文件,检查ts列表是否有新的ts切片。这种方式的实时性较差,不过优势是H5、IOS、Android都原生支持。

3、HTTP-FLV:

      HTTP-FLV就是对RTMP协议的封装,相比于RTMP,它是一个开放的协议。因此他具备了RTMP的实时性和RTMP不具备的开发性,而且随着flv.js出现(感谢B站),使得浏览器在不依赖flash的情况下,播放flv视频,从而兼容了移动端,所以现在很多直播平台,尤其是手机直播平台,都会选择它
 

二、HLS直播配置

Nginx服务器配置:

新建目录:用于存放nginx以及nginx-rtmp-moudle模块

mkdir /usr/local/nginx

下载压缩包:进入到创建的nginx目录下下载,这里如果下载不成功可以把https改为http,之前一直可以下载,后面换了一台云服务器后https就下载不了了,不知道是不是被屏蔽的原因,换成http后解决了

cd /usr/local/nginx
wget http://nginx.org/download/nginx-1.12.2.tar.gz
wget https://codeload.github.com/arut/nginx-rtmp-module/zip/master

如果没有wget命令的话执行下面的命令安装

yum -y install wget

解压:

tar -zxvf nginx-1.12.2.tar.gz
unzip nginx-rtmp-module-master.zip 

同理,没有unzip命令的执行下面命令安装

yum -y install unzip

安装nginx以及安装nginx模块之前,先安装一些依赖库:

yum -y install gcc-c++ 
yum -y install pcre pcre-devel  
yum -y install zlib zlib-devel 
yum -y install openssl openssl-devel

然后进行nginx-rtmp-module模块的安装:

cd /usr/local/nginx/nginx-1.12.2
#完成rtmp模块安装,=后面输入你的模块包的绝对路径
./configure --add-module=/usr/local/nginx/nginx-rtmp-module-master
make&make install
使用以下命令查看nginx是否启动成功:

cd /usr/local/nginx/sbin
./nginx -t
出现下图提示时表示配置成功

nginx以及相关模块安装完成

配置及启动服务支持hls

由于nginx-rtmp-module支持hls协议,因此我们可以直接在nginx.conf进行配置:

vi /usr/local/nginx/conf/nginx.conf
加入以下内容rtmp模块:(rtmp{}的内容和http{}为同级,位置不要放错)

rtmp {  
  
    server {  
  
        listen 1935;  #监听的端口
  
        chunk_size 4000;  
        
        application hls {
            live on;
            hls on;
            hls_path /usr/local/html/hls;#视频流存放地址
            hls_fragment 5s;
            hls_playlist_length 15s;
            hls_continuous on; #连续模式。
            hls_cleanup on;    #对多余的切片进行删除。
            hls_nested on;     #嵌套模式。
        }
    }  
}


如下图所示

在http里添加一个直播流存放的地址:

location /hls {  #添加视频流存放地址。
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        #访问权限开启,否则访问这个地址会报403
        autoindex on;
        alias /usr/local/html/hls;#视频流存放地址,与上面的hls_path相对应,这里root和alias的区别可自行百度
        expires -1;
        add_header Cache-Control no-cache;
        #防止跨域问题
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';  
    }

如图:

设置好之后保存文件然后重启服务器:

cd /usr/local/nginx/sbin
./nginx -s reload

直播推流配置

推流指的就是直播端将视频流推到设定的服务器位置。这里我使用的是obs进行推流:

在设置->串流 中填写信息:URL为 rtmp://xxx:1935/hls,xxx为你的服务器的IP地址,hls是用来存放流媒体的,”对应的就是conf文件中设置的application名称,流名称可自定义,服务器端生成的m3u8文件就是以此命名的。设置完成之后,点击“开始推流”,推流端的设置就完成了。

三、拉流设置


观看直播就比较简单了,可以简单的使用h5的vedio标签就可以观看了。

可以访问http://xxx:80/hls/abcd.m3u8来观看直播,其中xxx为你的服务器IP地址,后面的abcd就是在推流时候使用的秘钥,是自定义的。或者使用

<video>  
    <source src="http://xxx:80/hls/abcd.m3u8"/>  
    <p class="warning">Your browser does not support HTML5 video.</p>  
</video>
在此处遇到一个小坑,上述访问地址我是根据网上资料来写的,但是在我自己实际使用时发现服务器把推流时使用的密钥自动生成一个目录,然后把流文件存放到了里面,并不是直接生成abcd.m3u8,如下图

所以我使用的访问地址是http://xxx:80/hls/abcd/index.m3u8,然后就成功拉到直播流了。
原文链接:https://blog.csdn.net/Ricardo18/article/details/89359623

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx hls流媒体服务器实现直播 的相关文章

  • airflow webserver 命令失败并显示 {filesystemcache.py:224} 错误 - 不允许操作

    我正在 Cent OS 7 上安装 Airflow 我已经配置了 Airflow db init 并检查了 nginx 服务器的状态及其工作正常 但是当我运行airflow webserver命令时 我收到下面提到的错误 2021 03 2
  • 使用 client_body_in_file_only 进行 nginx 文件上传

    晚上好 我需要将静态内容上传到 nginx 服务器 1 9 因此上传模块不适用于此版本 我读过这篇文章 Nginx 直接文件上传 无需通过后端传递 https coderwall com p swgfvw nginx direct file
  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • ./manage.py 使用 https 运行服务器

    manage py 运行服务器 0 0 0 0 8000 我使用上面的行作为我从 github 借用的代码的一部分 https github com ribeiroit boh puppet https github com ribeiro
  • 如何将亚马逊颁发的免费证书配置到nginx.config

    我已经安装了nginx服务器在Amazon Linux 2环境 在创建弹性负载均衡器期间 我创建了 Amazon 的免费证书 现在 我想通过以下方式访问我的服务器https port 443 我该如何配置这个SSL证书在nginx conf
  • 在“git pull”我的 Django 项目后重新启动/重新加载 Gunicorn(通过 Upstart)的更好方法

    我正在寻找比sudo restart projectname每次我发出git pull origin master 它会下载我对 Django 项目的最新更改 这restart我相信该命令与 Upstart 有关 我用它来启动 停止我的 G
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • NGinx 域名重定向

    假设我有一个名为 xyz co 的网站 我还有其他具有相同前缀的域名 例如 xyz com xyz it xyz co it 现在 nginx 与端口 80 的 nginx conf 中的 server name xyz co 配合得很好
  • Nginx反向代理返回404

    我的 Nginx 安装并运行 下面是配置 etc nginx nginx conf 我要全部转发 api 到我的 tomcat 服务器 该服务器在同一服务器上的端口 9100 上运行 类型http myhost 9100 api apps有
  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • 将代码从 htaccess 重写为 nginx 配置?

    我在将 htaccess 文件中的重写代码实现到 nginx 配置中时遇到问题 我已经尝试过生成器 http winnginx com htaccess http winginx com htaccess用于生成我的重写 代码 我的ngin
  • 连接到上游时 Nginx 错误:(13:权限被拒绝)

    我在我的中收到此错误nginx error log file 2014 02 17 03 42 20 crit 5455 0 1 connect to unix tmp uwsgi sock failed 13 Permission den
  • 如何修复 Nginx 自动 301 重定向到带有尾部斜杠的相同 URL?

    当我尝试将 Web 应用程序的子目录中的索引文件访问到相同的 URL 但附加了斜杠 时 Nginx 出现了不良行为 它正在重新路由请求 我有一个简单的 Web 应用程序 其中设置了一个根目录和其中的许多子目录 每个子目录中都有一个 inde
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟

随机推荐

  • 算法学习笔记——动态规划:不连续取值的前提下求最大总和

    LeetCode 198 打家劫舍 一排房屋 某房屋内的金额数为nums i 相邻房屋内的钱不能被同时取出 求最多能取出多少钱 nums 1 1 3 4 返回5 选择取出1 4 5 dp i 代表对于0 i号房屋 能取走的最大金额 依次考虑
  • python高级7.多任务--协程-迭代器

    迭代器 迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 直到所有的元素被访问完结束 迭代器只能往前不会后退 可迭代对象 iterable object 我们已经知道可以对list t
  • define()和defined()

    define 用来定义一个常量 define IN ADMIN true 定义一个IN ADMIN常量 defined 用来检测定义的常量是否存在 defined IN ADMIN 检测IN ADMIN是否存在 用处很大 比如你在一个页面上
  • 【数据库 Mysql查询系列】在sc表 中查询平均成绩高于75分的学生。

    和之前发的博文中涉及到的sc 表一样 本文不再展示表内容 直接上代码 select sno 学号 avg ifnull grade 0 平均成绩 from sc group by sno having avg ifnull grade 0
  • vue封装axios实现

    axios很多前端都应该是非常熟悉了 前端访问后端很多都是使用的它 今天我们使用vue来封装一个axios 首页我们新建一个request js文件并引入axios的依赖 import axios from axios 接着创建axios的
  • 熵的概念理解

    Author 修远 说明 本文为Datawhale下开源项目 李宏毅机器学习 决策树的补充内容 作者水平有限 还望学习者批评指正 Datawhale 学习目标 学习信息量计算 原理 学习信息熵 证明 0 H p
  • Pandas数据处理3:数据合并(join、merge),累计与分组(groupby)

    Pandas数据合并 join merge 累计与分组 groupby import pandas as pd import numpy as np def make df cols ind 一个简单的DataFrame data c st
  • 多维时序

    多维时序 MATLAB实现SCNGO CNN Attention多变量时间序列预测 目录 多维时序 MATLAB实现SCNGO CNN Attention多变量时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍 1 S
  • Pretues和Keil使用stm32F103C6芯片实现跑马灯

    一 Protues创建工程 添加好名称 不断下一步就行 二 pretues添加原件 构建电路图 二 keil做代码 添加文件这里不做说明 注意一下几个点 1 芯片使用stm32F103c6 2 mdk的汇编文件随之改变 3 宏定义改成stm
  • 【NLP】使用 LSTM 和Beam Search进行文本自动完成

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 获取腾讯视频的视频url

    爬视频喽 1 获取链接地址 如下图 类似 https v qq com x page q0900ebm4qz html 2 取值 取上图获取到的加粗的数据 然后替换下面链接中的加粗数据http vv video qq com getinfo
  • 记一次python3 pip 报错Retrying

    错误信息如下 Retrying Retry total 4 connect None read None redirect None status None after connection broken by SSLError Can t
  • Nginx超详细入门教程

    目录 一 nginx配置文件介绍 二 nginx的核心功能 1 反向代理 lt 1 gt 正向代理 lt 2 gt 反向代理 lt 3 gt 准备工作 2 负载均衡 3 负载均衡策略 4 动静分离 三 Nginx的高可用性 1 准备两台虚拟
  • Qt控件使用方法技巧合集

    Qt控件使用方法技巧合集 本篇博客代码示例包含C 版本和Python版本 不管是哪个版本 Qt的API都是一样的 使用方式大同小异 文章目录 Qt控件使用方法技巧合集 1 QTextEdit设置背景色和文本颜色 2 QMessageBox的
  • GBK转成utf-8,java实现及讲解,androidstudio学习

    好吧 看来问的人和回答的人都不一定清楚什么是 编码和编码格式 以及如何理解 java中字符串的编码 首先明确几点 unicode是一种 编码 所谓编码就是一个编号 数字 到字符的一种映射关系 就仅仅是一种一对一的映射而已 可以理解成一个很大
  • 连接SqlServer数据库报错version TLS10 is not accepted by client preferences [TLS12,TLS13]

    报错内容 我的报错信息如下 其他类似的可能也好使 你们可以试试 The server selected protocol version TLS10 is not accepted by client preferences TLS12 T
  • 程序员进阶攻略-笔记-021~030

    信息 过载与有效 忙碌 充实而疲倦 的虚幻假象 在这个信息过载的洪流中 需要的就是在这股洪流中筛选信息并建立自己中流砥柱般的 知识磐石 心智 这两个字合在一起是一个意思 分开为 心 和 智 两个字又可以分别解释为 心 是你对需要的选择 从心
  • 八款国产操作系统

    点击上方蓝字 快速关注 目前世界上存在的那些操作系统 Windows MAC OS X MVX DOS VSE UNIX Linux等 很少见到国产操作系统的影子 你知道国产操作系统有那些吗 虽然国内的操作系统我们可能用不上 但我们有足够的
  • sd卡详细资料

    1 简介 SD卡是基于flash的存储卡 SD卡和MMC卡的区别在于初始化过程不同 SD卡的通信协议包括SD总线和SPI两类 SD卡使用卡内智能控制模块进行FLASH操作控制 包括协议 安全算法 数据存取 ECC算法 缺陷处理和分析 电源管
  • Nginx hls流媒体服务器实现直播

    通过Nginx模块nginx rtmp module实现hls流媒体服务器并用OBS进行推流 一 直播协议简介 首先 在搭建服务之前先了解下目前主流的几个直播协议 1 RTMP 实时消息传输协议 Real Time Messaging Pr