基于nginx的hls直播系统

原创 2013年06月22日 20:04:31

 之前写了一篇基于nginx的hls点播系统,本质上是把一个媒体文件做成m3u8索引,对应的文件都是提前做好放在服务器上的。

nginx充当的是个Http 服务器的角色,之所以说是基于nginx的,是因为它可以设置限速。

本文主要是描述一个直播系统,核心在于m3u8和里面对于的ts链接都是实时的,可以刷新。类似于cntv里面的直播。

这里分按顺序分几个部分讲述:软件编译,rtmp源的提供,nginx配置,html代码修改,客户端播放。

1,软件编译:

所需模块:nginx-rtmp-module

github:

https://github.com/arut/nginx-rtmp-module#example-nginxconf

 这个模块对nginx的版本好像没有什么要求,我用1.2.2是可以的。编译方法github上写的很清楚。

 

./configure --add-module=<path-to-nginx-rtmp-module>
make
make install

1.3.14-1.5.0版本

./configure --add-module=<path-to-nginx-rtmp-module> --with-http_ssl_module


2,rtmp源的提供

一类是用一个已有的媒体文件,一类是用摄像头和麦克风采集。

例如:

ffmpeg.exe -re -i sample.flv -vcodec copy -acodec copy -f flv rtmp://server-ip-address/hls/mystream
ffmpeg.exe -f dshow -i video="USB2.0 Camera" -vcodec libx264 -pix_fmt yuv420p -f flv rtmp://server-ip-address/hls/mystream

第一个是基于一个媒体文件的,必须用re,标识native frame rate,意思是按照播放的帧率。

第二个是基于dshow的,在windows上,编码用x264,图像用420p,

两种方式都是以rtmp协议发给server,其中hls和mystream各有含义。hls表示application,mystream表示一个实例。稍后解释。

 

3,nginx配置

这个nginx-rtmp-module里面已经包含了一个nginx.conf,位于test目录下,如果你已经有了一个nginx配置文件,那么只需要用

include  <path-to-nginx-rtmp-module>/test/nginx.conf;

即可包含这个新配置,Include必须与现有配置平级,即http级别的。

这里通常会有些问题,例如rtmp不能识别。

unknown directive "?rtmp
unknown directive "rtmp" in /etc/nginx/conf.d/rtmp.conf:1

解决方法一般是两种,一个是新conf的编码必须是和原有的一样,一般都是ASCII的,用file指令就知道。

一是重新编译后的nginx的model没有加载进去,可以尝试stop nginx再start就行。

rtmp {
    server {
        listen 1935;

        application myapp {
            live on;

            #record keyframes;
            #record_path /tmp;
            #record_max_size 128K;
            #record_interval 30s;
            #record_suffix .this.is.flv;

            #on_publish http://localhost:8080/publish;
            #on_play http://localhost:8080/play;
            #on_record_done http://localhost:8080/record_done;

       }
       application hls {
             live on;
             hls on;
             hls_path /tmp/app;
             hls_fragment 5s;


       }
    }
}

http {
    server {
        listen      8080;

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root <path-to-nginx-rtmp-module>;
        }

        location /control {
            rtmp_control all;
        }

        #location /publish {
        #    return 201;
        #}

        #location /play {
        #    return 202;
        #}

        #location /record_done {
        #    return 203;
        #}

        location /rtmp-publisher {
            root <path-to-nginx-rtmp-module>/test;
        }

        location /hls {
           #server hls fragments
           types{
             application/vnd.apple.mpegurl m3u8;
             video/mp2t ts;
           }
        alias /tmp/app;
        expires -1;
        }

        location / {
            root <path-to-nginx-rtmp-module>/test/rtmp-publisher;
        }

    }
}


简单解释:application中app是rtmp直播的,就是flash用的。我这里没有用。有个player.html在test目录下就是为这个服务的。

hls是hls直播的。是我这里用的。

/tmp/app是一个目录,是用来存放实时刷新的m3u8里面的文件的。这个文件刷新时间大约是1分钟。老文件会不断的用新文件取代。

4,html代码修改

nginx-rtmp-module里面已经包含了一个测试html,player.html,那个是播放flash用的。我们这里为播放Hls,可以简单的修改如下。

命名为playhls.html

<!DOCTYPE html>
<html>
<head>
    <title>HLS Player</title>
</head>
<body>
<video height="270" width="480" controls>
    <source src="http://server-ip-address:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />
    <p class="warning">Your browser does not support HTML5 video.</p>
</video>
</body>
</html>


5 ,客户端播放

浏览器一般还不支持m3u8直接播放,因为这个是H5才有的。

在android手机端,我们可以用QQ浏览器最新版本去播放网页。

在ios设备上,我们可以用Iphone,ipad去播放,因为这个HLS本来就是apple的,所以它的safari天然支持

PC机上我们可以用ffplayer去播放。
 
http://server-ip-address:8080/hls/mystream.m3u8

如果能播,则浏览器的地址为
http://server-ip-address:8080/hls/playhls.html

6,状态查看
http://server-ip-address:8080/stat

 参考页面:
1,rtmp配置

http://yeyingxian.blog.163.com/blog/static/34471242012916050362/

2,ffmpeg 抓取设备

http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20capture%20a%20webcam%20input

http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide

http://ffmpeg.gusari.org/viewtopic.php?f=11&t=841

 这里说一下,在windows7 上,声音设备的名字往往有中文字符,例如"麦克风(High Definition Audio设备)"

这个中文在ffmpeg下调用dshow是不能用的。所以我采集的是纯视频+音频(0 channels),即没有声音的视频。

audio的采集

  /dev/snd
http://man.chinaunix.net/linux/how/Alsa-sound-5.html
linux 音频驱动“
http://yiranwuqing.iteye.com/blog/1840176


unknown directive "rtmp"

不用怀疑,你的安装没有任何问题,问题的他妈的配置文件编码 UTF8-BOM,要是有bom,你一辈子都检查不出来错在哪,你妈炸了!...
  • hizhangxiang
  • hizhangxiang
  • 2016年10月06日 16:50
  • 1352

Mac搭建nginx+rtmp服务器

最近因为在学习直播,所以研究了下推流,这篇博客是基于RTMP的视频推流:开始:我个人电脑里面很早以前就搭建过nginx+rtmp服务器, 但是昨天在公司电脑上搭建的时候, 手动输入命令的时候, 还是出...
  • Levilly
  • Levilly
  • 2016年08月05日 11:42
  • 3294

启动nginx服务unknown directive &quot;rtmp&quot;

启动nginx服务有没有遇到这样的错误:unknown directive "rtmp" in /usr/live/nginx-1.11.5/conf/nginx.conf:16。下面是我的源码版本...
  • piyi7348
  • piyi7348
  • 2016年12月30日 14:53
  • 855

Nginx rtmp 模块安装及配置及遇到的问题

nginx rtmp 安装 配置 问题 unknown directive "rtmp"
  • O0mm0O
  • O0mm0O
  • 2017年06月29日 14:03
  • 2804

使用nginx搭建流媒体直播平台(该方式不适用与多人聊天)

使用nginx搭建流媒体直播平台,目的就是要支持rtmp协议,实现用户使用rtmp(rtmp://192.168.201.128/myapp)协议推送流到服务器...
  • WK313753744
  • WK313753744
  • 2016年02月05日 11:59
  • 9230

nginx+obs搭建流媒体,实现直播

1.直播是现在最热门的,尤其是电竞的发展成功的带动的直播的发展,各种游戏直播月入XXX,经常听到的一句话:某主播XXX月入百万,不知道是真是假暂且不管,看看直播到底是怎么实现的,直播使用的是RTMP协...
  • gaoxuaiguoyi
  • gaoxuaiguoyi
  • 2016年08月31日 21:22
  • 8911

Nginx下配置rtmp安装 以及一些配置

安装g++ 终于配成功了,在安装编译Nginx的时候就需要增加nginx-rmtp-module模块,执行./configure --add-module=./nginx-rmtp-module(即...
  • zhuguorong11
  • zhuguorong11
  • 2016年08月09日 09:56
  • 1119

利用nginx搭建RTMP视频点播、直播、HLS服务器

开发环境 Ubuntu 14.04 server nginx-1.8.1 nginx-rtmp-module nginx的服务器的搭建安装nginx的依赖库sudo apt-get update su...
  • kingroc
  • kingroc
  • 2016年03月09日 23:48
  • 26253

使用nginx搭建流媒体直播平台

一 概要说明 使用nginx搭建流媒体直播平台,目的就是要支持rtmp协议,实现用户使用rtmp(rtmp://192.168.201.128/myapp)协议推送流到服务器。然后其他用户点播该用户...
  • zhiboshequ
  • zhiboshequ
  • 2016年12月24日 00:02
  • 2838

全民大直播,流媒体选择Nginx是福还是祸?

视频直播的持续升温,无意间也让带宽生意的争夺变得异常残酷。一时间,各种云计算、CDN、视频云提供商都在视频尤其是直播上投入重兵,揭竿而起的新生起义军们也正马不停蹄的赶往这方战场,各种号称可以在IaaS...
  • charleslei
  • charleslei
  • 2016年07月23日 10:29
  • 4217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于nginx的hls直播系统
举报原因:
原因补充:

(最多只允许输入30个字)