视频直播方案(nginx-rtmp-module ffmpeg)
本文将介绍如何从零搭建流媒体服务器作为直播方案
- 搭建的服务将支持
RTMP
与HLS
两种协议。 - 支持传统的
flash
与现代H5
浏览器播放。 - 视频流采用支持
RTSP
服务的摄像头。
解决的问题:
- 一般视频录像板或者网络摄像头仅支持RTSP服务,或自己的私有协议。
- 因为RTSP是基于TCP的协议一般浏览器是无法支持创建Socket与其他服务相连前端无法播放。
- 私有协议仅能在IE浏览器下调用OCX插件播放视频,兼容性太差。
主要用到以下几款软件:
- nginx是一个高性能的HTTP和反向代理服务器。但是原生不支持充当流媒体服务器。
- nginx-rtmp-module 是个比较轻量的项目,可以满足直播的采集,编码和分发工作,该项目丰富的完善了nginx对视频的支持,特别的nginx-rtmp实现了对HLS的支持;
- FFmpeg 提供了录制、转换以及流化音视频的完整解决方案,我们将使用FFmpeg进行推流服务;
- FFplay 可以进行RTMP与RTSP码流视频播放与测试。
环境:
- OS: Ubuntu 16.04 xenial
- Kernel: x86_64 Linux 4.13.0-37-generic
方案简介
解决的方法:
- 现在前端直播一般采用
RTMP
或HLS
协议 - 使用nginx与nginx-rtmp-module搭建支持
RTMP
与HLS
的流媒体服务器 - FFmpeg将
RTSP
码流转换成RTMP
码流推送到RTMP服务器
上 - RTMP服务器根据配置将码流转成HLS并提供RTMP码流
框架图
流程如图所示。
##具体操作
Nginx与nginx-rtmp-module安装
// 创建文件夹,方便整理
mkdir rtmp-server;
cd rtmp-server;
// 下载nginx-rtmp-module模块
git clone https://github.com/arut/nginx-rtmp-module.git
// 下载nginx 1.8.1源码包
wget http://nginx.org/download/nginx-1.8.1.tar.gz
// 进入nginx源码包
cd nginx-1.8.1
// configure报错时请查阅解决
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_module
// 编译 && 安装 需要管理员权限
make && make install
注意: 此为源码安装Nginx。附录有PPA安装模块链接。
Nginx编译时遇到的问题可参阅:
配置 Nginx
在默认配置 /usr/local/nginx/conf/nginx.conf
下添加
# RTMP 推流设置
rtmp {
server {
listen 1935;
chunk_size 4000;
application hls {
live on;
hls on;
hls_path /usr/local/nginx/html/hls;
hls_fragment 2s; //配置视频分片时长
hls_playlist_length 10s;
}
}
}
# HLS视频服务设置,如不需要HLS协议可以去掉
http {
server {
listen 8080;
location /hls {
# 允许跨域
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root html;
expires -1;
}
}
}
注意: hls_path地址要保证可写,保留80服务。
需要录播或更多设置可参阅:
启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
现在RTMP服务器已经搭建完成。开启Nginx服务请参阅:
修改index.html 支持HLS协议
vim /usr/local/nginx/html/index.html
<html>
<head>
<title>Hls.js demo - basic usage</title>
</head>
<body>
<script src="https://cdn.bootcss.com/hls.js/0.8.9/hls.min.js"></script>
<center>
<h1>Demo</h1>
<video height="600" id="video" controls></video>
</center>
<script>
if(Hls.isSupported()) {
var video = document.getElementById('video');
var hls = new Hls();
hls.loadSource('http://localhost:8080/hls/channel4.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,function() {
video.play();
});
}
</script>
</body>
</html>
注意IP替换
FFmpeg 安装
sudo add-apt-repository ppa:jonathonf/ffmpeg-3
sudo apt-get update
sudo apt-get install ffmpeg
此时已经同时安装上了FFplay
FFmpeg 使用
我们将使用FFmpeg将rtsp码流转发至rtmp服务器上
RTSP码流地址为:rtsp://192.168.100.183:554/user=admin&password=admin&channel=4&stream=0.sdp
RTMP服务器地址为:rtmp://localhost:1935/hls/channel4
ffmpeg -i "rtsp://192.168.100.183:554/user=admin&password=admin&channel=4&stream=0.sdp" -c copy -f flv "rtmp://localhost:1935/hls/channel4"
项目使用的视频录像板为雄迈具体RTSP协议请参阅:
测试
RTMP测试
使用ffplay进行测试
ffplay "rtmp://localhost:1935/hls/channel4"
在使用FFmpeg转码流之前最好也用ffplay测试一下
若延时严重可加参数-fflags nobuffer
HLS测试
打开http://localhost
进行测试
Edge浏览器
![]()