使用nginx搭建HTTP FLV流媒体服务器
文章目录
- 使用nginx搭建HTTP FLV流媒体服务器
- 1 HTTP FLV简介
- 2 HTTP FLV流媒体服务搭建
- 3 结果验证
1 HTTP FLV简介
前文已经介绍了RTSP、RTMP、HLS的流媒体协议,还有一种比较常见的流媒体协议HTTP FLV,其兼具RTMP的实时性及HLS的网络适应性的优点,在很多点直播领域广泛应用。网上有人总结了HTTP FLV、RTMP、HLS的对比,如下表所示:
协议名 | HTTP FLV | RTMP | HLS |
---|---|---|---|
传输方式 | HTTP | TCP | HTTP |
视频封装格式 | flv | chunk(rtmp header+body(tag body)) | TS |
视频时延 | 低 | 低 | 高 |
数据格式 | 连续音视频流 | 连续音视频流 | TS切片文件 |
web无插件播放 | 支持,通过flv.js | 不支持,需要flash插件 | 支持,直接HTML5的video标签即可播放 |
防火墙或代理穿透 | 支持 | 不支持 | 支持 |
其中当前直播流域用的最广泛的是RTMP和HTTP-FLV,因为其非常低的视频时延,可做到1s左右,本文介绍HTTP FLV的流媒体服务搭建方式,有关FLV格式文章,参照:https://blog.csdn.net/water1209/article/details/128562747
HTTP-FLV是将流媒体数据先封装成FLV格式,然后通过HTTP协议传输给客户端,通过HTTP FLV的直播,这里使用了一个HTTP的协议约定,http 的content-length头字段如果不存在,则客户端就会一直接收数据,直到HTTP连接断开为止,其流程很简单,视频客户端发送HTTP请求,不带content-length头字段,服务器响应HTTP,并一直发送FLV的数据;客户端接收响应并一直接收数据直到连接断开。
2 HTTP FLV流媒体服务搭建
nginx-http-flv-module是基于nginx-rtmp-module开发的,包含nginx-rtmp-module所有功能,因此不能nginx-rtmp-module同时安装,其编译安装步骤与nginx-rtmp-module类似,如下:
-
安装依赖库:
nginx编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum -y install gcc gcc-c++
nginx的http模块使用pcre来解析正则表达式,pcre-devel 是使用 pcre 开发的一个二次开发库,nginx需要依赖这两个库,执行如下命令:
yum install -y pcre pcre-devel
nginx使用zlib对http包的内容进行gzip,需要安装此库:
yum install -y zlib zlib-devel
nginx可能需要支持HTTPS,最好在系统中安装好openssl,一般系统自带,可通过如下命令确认:
openssl version
如果安装了会显示版本号,如果提示未安装,执行如下命令安装:
yum install -y openssl openssl-devel
-
nginx编译和安装
-
下载nginx:
wget http://nginx.org/download/nginx-1.21.6.tar.gz
-
下载nginx模块HTTP FLV模块:
wget https://github.com/winshining/nginx-http-flv-module/archive/v1.2.10.tar.gz
-
解压nginx和HTTP FLV模块:
tar -zxvf nginx-1.21.6.tar.gz
tar -zxvf v1.2.10.tar.gz
-
nginx编译和安装:
./configure --prefix=/home/wangdenuan/nginx --add-module=../nginx-http-flv-module-1.2.10
这里配置了–prefix,配置安装路径,不安装到默认路径,以便安装文件移植和卸载,可直接拷贝次目录下的文件到其他电脑运行如果目录不同,启动时通过-p指定目录即可。
make&makeinstall
-
启动nginx,验证是否正确,执行命令(注意安装目录下的sbin/nginx):
/home/wangdenuan/nginx/sbin/nginx
打开浏览器输入:http://10.45.12.29/,注意ip为本机ip,显示如下内容,即表示安装成功
- 修改nginx相关配置支持HTTP FLV
在/home/wangdenuan/nginx/conf/nginx.conf文件中增加:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
meta off;#为了兼容flvj.js
hls on;
hls_path /tmp/hls;
hls_fragment 4;
hls_playlist_length 30;
record off;
allow play all;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /hls{
add_header Access-Control-Allow-Origin *;
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls;
expires -1;
}
location /flv {
flv_live on;
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
其配置与RTMP配置增加了HTTP FLV的URI的配置。
配置完成后,执行:/home/wangdenuan/nginx/sbin/nginx -s reload
,使得配置生效。
3 结果验证
-
在PC机上安装ffmpeg,具体安装方式可百度
-
找一个可播放的RTSP地址,通过vlc播放器验证rtsp地址播放是否正常,这里以rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream为例:
-
打开命令提示行,输入如下ffmpeg命令,推送rtmp视频流到rtmp服务器,这里假设rtmp服务器IP为:10.45.12.29
ffmpeg -i rtsp://admin:zxm10@@@@10.45.12.141/h264/ch1/main/av_stream -vcodec copy -acodec copy -f flv rtmp://10.45.12.29:1935/live/test
ffmpeg推流命令成功后,出现如下图所示界面:
-
用vlc播放如下串流:rtmp://10.45.12.29:1935/live/test,验证是否rtmp拉流成功:
-
用VLC播放如下串流:http://10.45.12.29/hls/test.m3u8,验证HLS是否能够播放成功:
-
用VLC播放如下串流:http://10.45.12.29/flv?port=1935&app=live&stream=test,验证HTTP FLV是否能播放成功