ToB企服应用市场:ToB评测及商务社交产业平台

标题: 使用Nginx搭建流媒体服务器 [打印本页]

作者: 小秦哥    时间: 2024-12-3 16:27
标题: 使用Nginx搭建流媒体服务器
目录

什么是流媒体服务器

流媒体服务器(Streaming Media Server)是一种用于存储和传输音频、视频、直播等媒体内容的服务器软件。它通过网络将媒体文件实时传输给用户,而不必要用户先下载完整文件。流媒体服务器支持按需播放、实时广播等功能,常见的使用场景包括在线视频、音频点播、直播视频等。
视频流媒体数据传输每每对流媒体服务器编解码本领和协议转换有要求,因为不同的编码格式和不同的协议适用的场景不同。比方,RTMP协议延迟低,但是web浏览器不支持,必要将其转为HLS大概是FLV才气举行播放。
Nginx如何实现流媒体服务器

Nginx作为web服务器的一种,本身关注点在静态资源代理、正反向代理方面,实现作为流媒体服务器使用是依赖“插件”来扩展。比方:nginx-rtmp-module插件和nginx-http-flv-module插件。
为Nginx安装nginx-http-flv-module

概述

nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展。针对像 nginx-http-flv-module 这样的 nginx 模块,仅能通过重新编译 nginx 源码的方式完成“插件的安装”。
nginx-http-flv-module 基于 nginx-rtmp-module 二次开发,拥有 nginx-rtmp-module 全部的功能,同时具备HTTP-FLV播放,这个功能就很Nice,有了这个就可以实现在浏览器中观看直播,针对推送端无需额外的配置,一个直播流推送到流媒体服务器,直接可以输出多种流,包括:rtmp、hls、flv,rtmp用于在桌面应用程序中播放,hls和flv用于在浏览器中播放,当然hls也可以在桌面应用程序中播放,在浏览器播放方式中flv的画面延迟显着由于hls。
必要注意的是 nginx-http-flv-module 要求nginx的版本大于等于1.2.6。由于nginx-http-flv-module包含了 nginx-rtmp-module 模块,所以不可将 nginx-http-flv-module 和 nginx-rtmp-module 同时编译,当我们编译完 nginx-http-flv-module 之后,着实就已经拥有了 nginx-rtmp-module 的完整功能。
流程

操作步调

使用如下命令查看当前已经安装的nginx的版本
  1. [root@bogon sbin]# ./nginx -V nginx version: nginx/1.18.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module
复制代码
下载 nginx 源码和 nginx-http-flv-module 的源码,示例代码如下:
  1. wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz git clone https://github.com/winshining/nginx-http-flv-module.git
复制代码
进入nginx源码目录,使用如下命令重新编译nginx:
  1. ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --add-module=/home/cml/nginx-http-flv-module make
复制代码
编译乐成后,在 objs中会有一个 名为nginx的可实行文件,这个就是编译好的nginx了, 里面包含已经安装的功能和新增加的nginx-rtmp-module,将这个可实行文件拷贝到当前安装目录(/usr/local/nginx/sbin)中就可以了。
注意拷贝之前必要制止nginx,否则会报当前文件繁忙,无法覆盖的错误。
通过如下命令验证安装是否正常:
  1. nginx -V
复制代码
若打印的信息中包含nginx-http-flv-module,说明安装好了。
配置流媒体服务器

当安装好了 nginx-http-flv-module 之后,就可以创建流媒体应用了。所谓的创建流媒体应用着实就是编写 nginx 的配置文件,如果必要创建一个名为 live 的流媒体应用,那么可以在 nginx.conf 中做如下配置
  1. #以下内容放可在 nginx.conf 的最后,rtmp 配置块为顶级配置块
  2. rtmp_auto_push on ;
  3. rtmp {
  4.    server {
  5.         listen 1935; #监听的端口
  6.         notify_method get;
  7.         chunk_size 4000;
  8.         application live { #rtmp推流请求路径
  9.             live on;
  10.             # 添加 hls 支持
  11.             hls on;
  12.             hls_path /usr/local/nginx/html/hls;
  13.             hls_fragment 3;
  14.             hls_playlist_length 60;
  15.             # 允许从任何源push 流
  16.             allow publish  all ;
  17.             # 允许从任何地方来播放流
  18.             allow play all;
  19.             # 20s内没有push,就断开连接
  20.             drop_idle_publisher 20s ;
  21.         }
  22. }
  23. }
复制代码
之后就是创建http-flv端点和hls端点了,目的是让直播流可以在http协议上面传输直播画面。
若不创建,将仅可以使用rtmp协议拉流,即rtmp://ip:1935/live/stream_no;若创建了就可以使用hls大概flvjs来拉流播放了。
创建http-flv端点和hls端点同样是编辑nginx.conf来实现,如下示例配置:
  1. server {
  2.         listen  82;
  3.         server_name  rtmpserver;
  4.         # 创建hls端点
  5.         location /hls {
  6.             add_header 'Access-Control-Allow-Origin' '*' ;
  7.             add_header 'Access-Control-Allow-Credentials' 'true' ;
  8.             types {
  9.                 application/vnd.apple.mpegurl m3u8 ;
  10.                 video/mp2t ts;
  11.             }
  12.             alias /usr/local/nginx/html/hls;
  13.             expires -1 ;
  14.             add_header 'Cache-Control' 'no-cache';
  15.         }
  16.         # 创建 flv 端点
  17.         location /flv {
  18.                 flv_live on ;
  19.                 chunked_transfer_encoding on;
  20.                 add_header 'Access-Control-Allow-Origin' '*';
  21.                 add_header 'Access-Control-Allow-Credentials' 'true';
  22.         }
  23.     }
复制代码
使用OBS推流

OBS 是非常成熟的软件了,安装参考官网:https://obsproject.com/
假设约定的推拉流地址为 rtmp://192.168.1.115:1935/live/room-1
设置直播流来源为 视频采集装备 和 浏览器,此中视频采集装备就是笔记本的摄像头,浏览器为OBS内置浏览器并打开 https://time.is/zh/ 这个网址。最终的直播画面就是两个采集终端的画面叠加在一起,底部是一个网址,网页中有一个时钟,顶部是摄像头。
设置直播服务器和推流码:
点击开始直播,OBS就开始向流媒体服务器推流了。
此时就可以使用拉流客户端拉取直播画面了,同时hls_path 下将生成m3u8文件,文件名称为 room-1.m3u8。
使用VLC拉RTMP

VLC是非常成熟的软件了,安装参考官网。
VLC拉流使用rtmp举行,拉流地址为:
  1. rtmp://192.168.1.115:1935/live/room-1
复制代码
使用flv.js拉流

基于flv.js编写一个视频播放器,新建一个html文件,示例代码如下:
flvjs_player.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>FLV.js Example</title>
  7.    
  8. </head>
  9. <body>
  10.     <h1>FLV.js Player</h1>
  11.     <video id="videoElement" width="640" height="360" controls></video>
  12.     <button id="playButton">Click to Play Video</button>
  13.    
  14. </body>
  15. </html>
复制代码
使用jls.js拉m3u8

基于hls.js编写一个视频播放器,新建一个html文件,示例代码如下:
m3u8_play.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>HLS.js Example</title>
  7.    
  8. </head>
  9. <body>
  10.     <h1>HLS.js Player</h1>
  11.     <video id="videoElement" width="640" height="360" controls></video>
  12.    
  13. </body>
  14. </html>
复制代码
总结

本文介绍了流媒体服务器的特性及各种流媒体传输协议的适用场景,并详细论述了使用 nginx-http-flv-module 扩展Nginx作为流媒体服务器的详细步调,并提供了在VLC,flv.js,hls.js下的流媒体拉流播放示例。
引用

https://www.cnblogs.com/Naylor/p/18427309
https://www.cnblogs.com/Naylor/p/18070157
https://www.cnblogs.com/Naylor/p/18070047
技术交换QQ群:1158377441 接待关注我的微信公众号【TechnologyRamble】,后续博文将在公众号首发:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4