zoukankan      html  css  js  c++  java
  • HLS-搭建Nginx流媒体服务器

    Nginx本身是一个非常出色的HTTP服务器,FFMPEG是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.

    这个流媒体服务器可以支持RTMP和HLS(Live Http Stream)

    从安装开始

    Nginx的安装参照我之前的这个: http://blog.csdn.net/redstarofsleep/article/details/45092127

    在configure的时候需要增加nginx-rtmp-module的支持,下载好nginx-rtmp-module后解压,然后nginx安装时增加这个模块(--add-module),其它都是一样的.

     ./configure --prefix=/usr/local/nginx --with-pcre=/home/user/pcre/pcre-8.32 --with-zlib=/home/user/zlib/zlib-1.2.8 --with-openssl=/home/user/openssl/openssl-1.0.1i  --add-module=/home/user/nginx-rtmp-module

    ## Mac 系统可以使用Homebrew, Homebrew是以最简单,最灵活的方式来安装苹果公司在MacOS中不包含的UNIX工具

    FFMPEG的安装

    ubuntu 安装: http://blog.csdn.net/redstarofsleep/article/details/45092145

    Liunx下yum 安装: http://www.cnblogs.com/dennisit/archive/2012/12/27/2835089.html

    nginx配合ffmpeg做流媒体服务器的原理是: nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个rtmp流到nginx,然后客户端通过访问nginx来收看实时视频流. HLS也是差不多的原理,只是最终客户端是通过HTTP协议来访问的,但是ffmpeg推送流仍然是rtmp的。

     在整个 http{} 之后添加 rtmp的配置内容 

    官方rtmp 手册https://github.com/arut/nginx-rtmp-module/wiki/Directives

    中文手册 :视频直播点播nginx-rtmp开发手册中文版

     1 rtmp {
     2     server {
     3         listen 1935; #端口
     4       RTMP 直播流配置
     5         application rtmplive {
     6             live on;
     7         }
           HLS 直播流配置
    8 application hls { 9 live on; 10 hls on; #开启hls 11 hls_path /tmp/hls;
              hls_fragment 5s #一个ts 文件的时长 5s
    12 } 13 } 14 }

    需要在http里面增加一个location配置

    1 location /hls {
    2             types {
    3                 application/vnd.apple.mpegurl m3u8;
    4                 video/mp2t ts;
    5             }
    6             root /tmp;
    7             add_header Cache-Control no-cache;
    8 }

    注意:修改nginx.conf之后,需重启nginx服务,才会生效:$nginx -s reload。

         再次在浏览器中测试:http://localhost:8080,以确认nginx开启的状态。

    保存完配置文件后,启动nginx,通过netstat -ltn命令可以看到增加了一个1935端口的监听.8080是nginx默认的http监听端口。

    # netstat -ltn
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:1935            0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::22                   :::*                    LISTEN     
    tcp6       0      0 ::1:631                 :::*                    LISTEN  

    然后用ffmpeg推流到nginx:

    RTMP流,推流至rtmplive:

    ffmpeg -re -i "D:downloadfilmaqgy2.mp4" -vcodec libx264 -vprofile baseline -acodec aac
     -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://server:1935/rtmplive/test1

    HLS流,推流至hls:

    ffmpeg -re -i "D:downloadfilmaqgy2.mp4" -vcodec libx264 -vprofile baseline -acodec aac
     -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://ip:1935/hls/test2
     
    其中,HLS流表现较明显,在nginx的临时目录下,直观的可看到m3u8索引文件和N多个.ts文件。m3u8列表会实时更新,且会动态更改当前播放索引切片(.ts)。这种实时更新的机制,不会使得.ts文件长时间存在于Nginx服务器上,且当推流结束之后,该目录下的内容会被全部清除,这样无形中减缓了nginx服务器的压力。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
     
    m3u8索引文件
    #EXTM3U                     m3u文件头,必须放在第一行
    #EXT-X-MEDIA-SEQUENCE       第一个TS分片的序列号 #当前索引
    #EXT-X-TARGETDURATION       每个分片TS的最大的时长
    #EXT-X-ALLOW-CACHE          是否允许cache
    #EXT-X-ENDLIST              m3u8文件结束符
    #EXTINF                     extra info,分片TS的信息,如时长,带宽等

     

    现在我们的流媒体服务器有两个实时流了,一个是rtmp的,另一个是hls的,用流媒体播放器播放一下,流媒体播放器可以用vlc也可以用ffmpeg带的ffplay.手机也是可以播放的。

    第一个就是推送的地址: rtmp://serverIp:1935/myapp/test1

    第二个是HTTP地址: http://serverIp:8080/hls/test2.m3u8

    播放rtmp流或hls流

    最简单的测试,可通过VLC播放器,建立网络任务实现播放。所谓的播放,就是从Nginx服务器取到视频流并播放,也称之为“拉流”。需注意的是,HLS是基于HTTP的流媒体传输协议,端口为8080 ,hls的话用hls on开启hls,并且为hls设置一个临时文件目录hls_path /tmp/hls;其它更高级的配置可以参看nginx-rtmp-module的readme;而RTMP本身即为实时消息传输协议,端口为1935。由此决定了客户端访问直播流的方式,见下图:(客户端拉流过程)

    拉流地址:

    RTMP流:rtmp://localhost:1935/rtmplive/test

    HLS流:http://localhost:8080/hls/test.m3u8

    文章引用:HLS-搭建Nginx流媒体服务器(3)

            nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

  • 相关阅读:
    按钮,文本框
    d01
    第一天,对于课程和工作的了解
    javaweb概念性知识
    Jdbc概念性知识
    连接数据库,和数据增删改
    oracle基础概念性知识
    面向对象java知识汇总题
    javaweb
    date日期
  • 原文地址:https://www.cnblogs.com/xuey/p/9244434.html
Copyright © 2011-2022 走看看