视频直播方案(nginx-rtmp-module ffmpeg)

Linux 2018-03-15

视频直播方案(nginx-rtmp-module ffmpeg)

本文将介绍如何从零搭建流媒体服务器作为直播方案

  • 搭建的服务将支持RTMPHLS两种协议。
  • 支持传统的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


方案简介

解决的方法:

  • 现在前端直播一般采用RTMPHLS协议
  • 使用nginxnginx-rtmp-module搭建支持RTMPHLS的流媒体服务器
  • FFmpegRTSP码流转换成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浏览器

参考

  1. nginx-rtmp-module
  2. FFmpeg
  3. nginx-rtmp-module wiki
  4. Installing on Ubuntu using PPAs

发表评论

电子邮件地址不会被公开。 必填项已用*标注