整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用nginx如何来实现视频的直播

使用nginx如何来实现视频的直播

ginx 是一个高性能的 Web 服务器和反向代理服务器,它也可以作为视频直播流媒体服务器使用。下面是如何利用 Nginx 实现视频直播推流和拉流的方式,以及其中所涉及到的模块和工具:

  1. 安装 Nginx

首先需要在服务器上安装 Nginx,可以根据操作系统的不同,采取相应的包管理器安装,例如在 Ubuntu 下可以执行以下命令进行安装:

复制代码sudo apt-get update
sudo apt-get install nginx
  1. 安装相关模块

在开始配置之前,需要安装几个 Nginx 相关的模块,其中最常用的是 RTMP 模块,其实现了基于 RTMP 协议的视频直播功能。可以通过以下命令下载和安装 RTMP 模块:

复制代码cd /usr/src/
sudo git clone https://github.com/arut/nginx-rtmp-module.git

另外,为了提供 HTTPS 支持,还需要安装 SSL 模块:

复制代码sudo apt-get install libssl-dev
sudo apt-get install openssl
  1. 配置 Nginx

在配置 Nginx 前,需要知道本地服务的 IP 地址。在Ubuntu 中,可以使用 ifconfig 命令来查看 IP 地址。

打开 Nginx 的默认配置文件 /etc/nginx/nginx.conf,在头部添加如下代码:

复制代码rtmp {
    server {
        listen 1935;
        chunk_size 4000;

        application live {
            live on;
            record off;
        }
	}
}

其中,listen 指定监听的端口号,RTMP 握手协议的端口为 1935;chunk_size 是数据包分段的大小(单位是字节)。

接下来要在 http 部分添加以下代码:

复制代码http {
    ...
	server {
		listen      80;
		server_name localhost;

		location /rtmp_stat {
			rtmp_stat all;   # enable the status module
			rtmp_stat_stylesheet stat.xsl; # path to the stylesheet
		}

		location /rtmp_stat.xsl {
			root /usr/src/nginx-rtmp-module/;
		}
		location / {
			proxy_pass http://127.0.0.1:8080;
			#root   /usr/share/nginx/html;	
			index  index.html index.htm;
		}

		location /live {
			flv_live on;
            add_header 'Cache-Control' 'no-cache';
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
            add_header 'Access-Control-Allow-Headers' 'Range';		
		
			chunked_transfer_encoding on;
			types {
				video/mp4 mp4;
				video/x-flv flv;
			}
			root /usr/local/webrtc_files;
			autoindex on;
		}
	}
}

这里添加了一个 HTTP 块,用于提供统计信息功能。具体就是通过 /rtmp_stat 和 /rtmp_stat.xsl 节点来访问 RTMP 状态页,可以实时获取到当前连接和流状态信息。

/live 节点是用来开启一个 HTTP Flv 转发服务,提供对 RTMP 直播视频的访问支持。其中 add_header 'Cache-Control' 'no-cache'; 表示不缓存返回内容,add_header 'Access-Control-Allow-Origin' '*' always; 设置了允许跨域请求,并添加了几个 Access-Control 标头。

  1. 启动 Nginx

在修改完配置文件后,使用 sudo nginx -t 检查是否有配置错误。如果没有报错,则可以通过以下命令启动 Nginx 服务器:

复制代码sudo service nginx start

现在已经可以通过 RTMP 协议发送和接收视频直播流。

  1. 推流

在推流前,需要先安装推流工具,例如 OBS(https://obsproject.com/download)或 FFmpeg(https://ffmpeg.org/download.html)等。

使用 OBS 进行推流时,将 RTMP URL 和推流密钥输入至设置中并进行测试即可:

复制代码rtmp://<server address>:1935/live/<stream_key>

上述命令中的 <server address> 是服务器的 IP 地址或者域名,<stream_key> 是视频流名称或推流密钥。

  1. 拉流

在 Web 页面中,可以通过 video 标签进行拉流展示,首先需引入以下 JavaScript 库:

html复制代码<script src="//cdn.bootcss.com/hls.js/0.9.1/hls.min.js"></script>

然后使用以下代码添加 source 标签和 video 标签:

html复制代码<video id="my-video" class="video-js" controls preload="auto" width="640" height="264"
    data-setup="{}">
    <source src="http://<server address>/live/<stream_key>.flv" type="video/flv">
</video>

其中 <server address> 是您的服务地址,<stream_key> 指的是您推出的视频流名称或推流密钥。

这样,就能够成功在 Web 端看到直播视频流了。

总之,Nginx 作为一款功能强大的反向代理服务器,可以通过整合 RTMP、SSL 等模块轻松实现视频直播推流和拉流等重要功能,方便开发者快速搭建直播系统。这些技术的应用也为直播领域提供了更加全面和丰富的解决方案。

流只能用rtmp协议,拉流可以使用rtmp协议和hls协议。rtmp协议是adobe公司开发的开放协议,hls是苹果公司推出的直播协议。我们使用nginx的rtmp插件来搭建推流服务器

基于nginx的rtmp直播服务器

安装加载nginx-rtmp-module模块的nginx

  • 首先下载nginx
  • 到 https://github.com/arut/nginx-rtmp-module 下载rtmp模块(git clone https://github.com/arut/nginx-rtmp-module.git)
  • 分别解压nginx和rtmp模块,使他们在同一目录下。
  • 编译nginx./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module.1.1.4 --with-http_ssl_module
  • make && make install 安装
  • 配置rtmp模块
rtmp {
    server {
        listen 9999;
?
        application myapp {
            live on;
        }
       application live {
             live on;   #开启实时
             hls on;    #开启hls
             hls_path /usr/local/etc/nginx/html/multimedia/hls;  #hls的ts切片存放路径
             hls_fragment 2s;         #本地切片长度
             hls_playlist_length 6s;  #HLS播放列表长度
       }
    }
}

使用rtmp协议并且监听了9999端口,如果我们的推流地址填写的是rtmp://ip:9999/myapp,那么就是纯粹的rmtp协议的流,如果推流地址填写的是rmtp://ip:9999/live,那么推流之后会在/usr/local/etc/nginx/html/multimedia/hls目录下生成很多ts格式的视频切片和一个m3u8格式的文件,我们想要用http协议访问这个m3u8文件就需要再配置http模块。

  • 配置http模块
location /live {
    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
    }
    alias /usr/local/etc/nginx/html/multimedia/hls/;
    add_header Cache-Control no-cache;
}

当我们的推流地址填写的是rtmp://ip:9999/live/room1时,使用http://ip:80/live/room1.m3u8就能把rtmp转成hls访问这个直播流了。

  • 新建文件夹 mkdir -p /usr/local/etc/nginx/html/multimedia/hls/
  • 重启nginx nginx -s reload

以上就完成了直播服务器的搭建。


m3u8格式的直播流


使用video.js在h5播放rtmp

使用obs推流,推流地址可以填写rtmp://ip:9999/myapp或者rtmp://ip:9999/live,如果用的是rtmp://ip:9999/myapp,在h5端播放的时候会涉及到h5播放rtmp协议的问题,h5安装vide.js之后还要额外安装videojs-flash插件。

video.js版本是7.8.3

安装好之后在相关页面引入:

import videojs from 'video.js';
import "videojs-flash"
import 'video.js/dist/video-js.css'

然后初始化videojs即可:

player=videojs("myVideo", {
    poster: baseUrl + '/file/download?file_id='+that.props.videos.foreImg,
    controls: true,
    preload: 'auto',
    // fluid:false,
    fill: true,
    playsinline: true,
    languages: 'en',
    suppressNotSupportedError: false,
    sources: that.props.videos.url,
    techOrder: ['flash', 'html5']
})

在pc端播放rtmp时依赖flash播放器,所以要打开flash,这样就解决了pc端rtmp协议直播流的问题。

但问题是现在流行的是移动端直播,而苹果就没支持过flash播放器,所以目前正常方法解决不了在移动端使用rtmp协议拉流的问题。

移动端使用rtmp协议拉流

因为苹果不支持flash所以使用rtmp拉流肯定是不行的,但是可能客户给我们的就只有rtmp协议,那么我们就可以用到上面的另外一个地址,把rtmp协议转成hls协议。

搭建ffmpeg

rtmp转flv

ffmpeg  -re -i rtmp://ip:9999/myapp/room1 
-vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://ip:9999/live/room1

这样当客户给的拉流地址是rtmp://ip:9999/myapp/room1时,可以用ffmpeg 转成http://ip:9999/live/room1.m3u8实现全平台播放了。

但是这样还有个问题,因为客户给地址的话,用户拉流是从客户平台上拉,但是如果使用自己的服务器转了一下的话,那就变成用户从我们自己的服务器拉流了,如果用户比较多的话那带宽的问题就要考虑一下了。

频直播是借助流媒体及通信技术,通过采集、编码、发布和播放等过程实现实时播放。近年来,随着移动互联网的发展,企业的移动端应用日渐增长,手机直播需求也应运而生。根据业务需求,需在App端和H5端调用摄像头视频流,来达到现场生产作业直播的目的。

1 需求分析

我厂安装的摄像头,主要由海康威视、大华和英飞拓三个品牌构成,输出协议均为RTSP。App端支持直接播放RTSP协议的视频流,但无法直接在H5端显示。故欲达到在H5端直播的目的,需要将RTSP协议转换成RTMP或HLS协议。

常见流媒体协议:

1、RTSP协议:英文全称 Real Time Streaming Protocol,RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议!协议主要规定定了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP体系结位于RTP和RTCP之上(RTCP用于控制传输,RTP用于数据传输),使用TCP或UDP完成数据传输!

2、RTMP协议:RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。

3、HLS协议:HTTP Live Streaming,是Apple的开放标准,基于HTTP流,它最初是苹果公司针对苹果移动设备而开发的流,由于是基于HTTP的,因此很多HTTP的优点都得到了继承。

RTMP协议支持在Html播放,但是它依赖flash播放器,所以在移动端H5不能采用RTMP协议。HLS协议基于HTTP流,支持IOS、Android、HTML5,故采取将RTSP拉流并转码为HLS协议输出的方式,下图是HLS的工作原理:

2 架构设计

考虑到内网带宽限制及多用户并发以及便于管理,我们采用流媒体服务器(内外网映射、拉流/转码)+web服务器+手机App+H5的方案,其中流媒体服务器负责拉取摄像头RTSP视频流,并压缩编码成HLS,等待来自手机App+H5的request请求;WEB服务器用于管理摄像头信息;H5端通过video.js开源插件实现播放,架构图如下:

3 具体实现

为了保证系统稳定性及管理便捷性,我们使用了EasyNVR流媒体服务器软件,EasyNVR集成了可视化web管理服务,能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP协议输出的设备接入到EasyNVR,EasyNVR能够将这些视频源的音视频数据进行拉取,转换为RTMP或HLS,进行全平台终端H5直播(Web、Android、iOS)

相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

音视频免费学习地址:https://xxetb.xet.tech/s/2cGd0

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

1、安装流媒体服务器软件EasyNVR

在EasyNVR官网下载安装包,解压后运行ServiceInstall-EasyNVR.exe进行安装,成功将启动web管理界面。

2 获取摄像机的RTSP流

我们以海康威视摄像头为例,首先在摄像头机web管理界面(默认入口是摄像头ip地址),在网络菜单配置里了,开通UPnP端口,以及RTSP视频流的映射。

开通映射以后,UPnP状态显示生效。

根据海康威视摄像头的视频流格式,拼出该摄像头的RTSP地址,如:rtsp://账号:密码@http://172.16.xxx.xxx:554/h264/ch35/main/av_stream

可使用VLC media player软件对摄像头视频流进行测试,看看是否正常输出。

3、添加摄像头信息

将摄像头rtsp视频流,配置到easyNvr的通道后,点击预览查看视频能否正确输出。

4、HLS转码

在预览界面,其他设置一栏中,可以查看HLS的.m3u8地址。

5、demo测试

采用video.js开源的视频插件编码,调用.m3u8地址,在H5端成功展示视频。

通过项目中实际的应用,HLS直播在无论是在实时性、连续性还是多用户并发控制方面都达到了我们预期的目标。


原文 H5直播RTSP摄像头视频流解决方案 - 掘金