视频直播方案(nginx-rtmp-module ffmpeg) - Andrew's BlogAndrew's Blog

标签: | 发表时间:2019-04-24 17:39 | 作者:
出处:https://lzzone.top

视频直播方案(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

相关 [视频 直播 nginx] 推荐:

视频直播方案(nginx-rtmp-module ffmpeg) - Andrew's BlogAndrew's Blog

- -
视频直播方案(nginx-rtmp-module ffmpeg). 本文将介绍如何从零搭建流媒体服务器作为直播方案. 一般视频录像板或者网络摄像头仅支持RTSP服务,或自己的私有协议. 因为RTSP是基于TCP的协议一般浏览器是无法支持创建Socket与其他服务相连前端无法播放. 私有协议仅能在IE浏览器下调用OCX插件播放视频,兼容性太差.

nginx 播放视频(1)

- - ITeye博客
1,首先拷贝一个flv文件到nginx 的html目录中. cp /var/www/html/ajl/uploadvideos/20150428101917_31520150408监利新闻(三).flv ./. flv文件的路径是:/usr/local/nginx/html/broadcast2/20150428101917_31520150408监利新闻(三).flv.

HTML5 视频直播(一)

- - JerryQu 的小站
前不久工作中遇到了在移动 WEB 端直播视频的需求,研究了一下相关技术,记录一下. 目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前就只有 HLS 能用,我们重点介绍它. HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议,由 Apple 公司实现,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持.

[原]视频直播 解决方案

- - banketree
中国好声音2016年开始海选了,某某代理了地方海选,为了更好的推广,决定进行网上直播. 服务端:Srs  (https://github.com/ossrs/srs). 收看直播嘛,只要开源播放器支持rtmp、hls…等等都可以看的,具体的我就不多说了. 作者:banketree 发表于2016/5/17 13:01:10 原文链接.

nginx+jwplayer配置flv/MP4点播系统, 视频拖动支持 - 一 水

- - 博客园_首页
下载 nginx 最新版 http://nginx.org/. 安装依赖库, 以ubuntu为例. 编译nginx, 增加flv和MP4的支持.    编译时可以指定安装目录 --prefix=/path/to/install.    然后make install. 测试是否支持seek(拖动, 快进).

Nginx下搭建flv视频服务器且支持视频拖动进度条播放

- gOODiDEA - CSDN博客推荐文章
目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频. 在互联网上播放视频,有两种方式,一种是文件方式,即通过HTTP协议访问视频文件,这种方式的缺点是不能从特定的帧开始播放;另外一种就是采用专门的流媒体服务器,这种方式的缺点是要搭建复杂的流媒体服务器. 不过,现在有了一种集合了以上两种方式优点的一种解决方案,即通过HTTP来实现伪流媒体.

音乐人 Daria Musk 利用 Google+ Hangouts 直播演出视频

- jeff - 谷奥——探寻谷歌的奥秘
独立流行音乐人Daria Musk最近潮流了一把,她和自己的乐队利用Google+的Hangouts视频群聊服务,在自己的工作室里举办了一场小型音乐会的直播. 尽管鉴于Hangouts的限制,只能有10个人观看视频直播,但是咱有山寨的办法突破这个限制,就是10个人里的其中一位拿起自己另外一台电脑上的摄像头,拍摄自己看到的音乐会直播画面,然后在这台新电脑上再组建一个10人的Hangouts视频群聊,这样理论上可以一直接力下去,只不过质量就…….

webvbox :集网络视频、直播、小游戏、音乐欣赏

- tackwell - 笨兔兔
webvbox,是一款集网络视频观看、电视直播、音乐电台、小游戏、网络工具于一体的利器. 最新版本为webvbox 2 beta版本. 主页:http://hi.baidu.com/webvbox/. (这段话只有一个叹号标点,全是逗号,堪比GRE的长句子啦,玩笑. 支持多家视频网站:优酷、土豆、新浪…不用打开网页,想看就看.

谷奥: Google 在首页强推 Google+ Hangouts 演出视频直播

- lili - 谷奥聚合——谷奥主站+谷安 aggregator
尽管这并非黑眼豆豆的Will I. Am第一次利用Google+的Hangouts进行视频群聊了,但却是他第一次出现在Google首页里,这也是Google第一次将一个Google Profile个人链接地址放置在Google首页强推──这可是一个无价的广告位啊. 在直播开始之前的现在,如果你点击那个链接,只能看到黑眼豆豆的Will I.

Hangouts On Air-google+的全球视频直播工具

- - 无名小卒
        Google+向全球用户正式推出视频直播工具——Hangouts On Air,该工具可以让用户向公众直播视频. 用户需要登录google+,点击start a hangout,勾选Enable Hangouts On Air按钮,验证你的Youtube账户,这样你的视频就可以向全球直播了.