搭建nginx+HLS服务器播放m3u8视频格式

2020-2-28    分类: wordpress教程

RTMP、HTTP-FLV、HLS,三大直播协议

RTMP
优点:
RTMP 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀,同时它 Adobe Flash 支持好,基本上所有的编码器(摄像头之类)都支持 RTMP 输出。现在 PC 市场巨大,PC 主要是 Windows,Windows 的浏览器基本上都支持 Flash。另外RTMP适合长时间播放,曾经有过测试,联系 100 万秒,即 10 天多连续播放没有出现问题。最后 RTMP 的延迟相对较低,一般延时在 1-3s 之间,一般的视频会议,互动式直播,完全是够用的。

缺点:
一方面是它是基于 TCP 传输,非公共端口,可能会被防火墙阻拦;另一方面,也是比较坑的一方面是 RTMP 为 Adobe 私有协议,很多设备无法播放,特别是在 iOS 端,需要使用第三方解码器才能播放。

运用在现场直播方案:https://www.xgllseo.com/?p=7926

 

FLV
FLV (Flash Video) 是 Adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。
优点:
相较于 RTMP 协议,HTTP-FLV 能够好的穿透防火墙,它是基于 HTTP/80 传输,有效避免被防火墙拦截。除此之外,它可以通过 HTTP 302 跳转灵活调度/负载均衡,支持使用 HTTPS 加密传输,也能够兼容支持 Android,iOS 的移动端。

缺点:
由于它的传输特性,会让流媒体资源缓存在本地客户端,在保密性方面不够好。因为网络流量较大,它也不适合做拉流协议。

---------------------------上述两个协议都是有Adobe公司推出的---------------------------

HLS
HLS (HTTP Live Streaming) 则是苹果公司基于 HTTP 的流媒体传输协议。
主要应用于 iOS 设备,包含(iPhone, iPad, iPod touch) 以及 Mac OSX 提供音视频直播服务和录制内容(点播)等服务。
相对于常见的流媒体协议,HLS 最大的不同在于它并不是一下请求完整的数据流。它会在服务器端将流媒体数据切割成连续的时长较短的 ts 小文件,并通过 M3U8 索引文件按序访问 ts 文件。客户端只要不停的按序播放从服务器获取到的文件,从而实现播放音视频。

HLS 的优势:
Apple 的全系列产品支持:由于 HLS 是苹果提出的,所以在 Apple 的全系列产品包括 iPhone、 iPad、safari 都不需要安装任何插件就可以原生支持播放 HLS, 现在 Android 也加入了对 HLS 的支持。
穿透防火墙。基于 HTTP/80 传输,有效避免防火墙拦截
性能高。通过 HTTP 传输, 支持网络分发,CDN 支持良好,且自带多码率自适应,Apple 在提出 HLS 时,就已经考虑了码流自适应的问题。

HLS 的劣势:
实时性差,延迟高。HLS 的延迟基本在 10s+ 以上
文件碎片。特性的双刃剑,ts 切片较小,会造成海量小文件,对存储和缓存都有一定的挑战

https://www.upyun.com/tech/article/352/RTMP%E3%80%81HTTP-FLV%E3%80%81HLS%EF%BC%8C%E4%BD%A0%E4%BA%86%E8%A7%A3%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%89%E5%A4%A7%E7%9B%B4%E6%92%AD%E5%8D%8F%E8%AE%AE%E5%90%97.html

---------------------------以上内容都是科普-------------------------------------

这里的教程如何使用HLS协议播放视频。
本人使用的环境是centos6

1,安装nginx,且安装nginx-rtmp-module模块

https://www.xgllseo.com/?p=5731

 

2,配置nginx.conf

查看mime.types文件是否有以下内容(一般都会有),如果没有就加上

application/vnd.apple.mpegurl m3u8;
video/mp2t ts;

 

编辑nginx.conf

http{
  server{
    #其他网站
  }

  server{
    #其他网站
  }


  server {
    listen 8080;
    server_name localhost;

    location /hls {
       types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2ts ts;
       }
       root /tmp;
       add_header Cache-Control no-cache;
       add_header Access-Control-Allow-Origin *;
    }


    location /on_publish {
       return 201;
    }
    # 推流的监控台
    location /stat {
      rtmp_stat all;
      rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
      alias /opt/nginx/conf/stat.xsl;
    }
    location /control {
      rtmp_control all;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
      root html;
    }
  }

}


#rtmp跟http同级
rtmp {
  server {

    listen 1935; #//服务端口

    #chunk_size 4096; #//数据传输块的大小
    application rtmplive {
      live on;
    }
    application hls { #rtmp推流请求路径 
      live on; 
      hls on; 
      hls_path /tmp/hls; #去创建这个目录,在tmp目录的文件服务器重启就会删除里面的文件
      hls_fragment 10; 
      hls_cleanup off;
    } 
  }
}

配置完成之后重启nginx。
开启的端口是8080和1935,使用命令netstat -ltn查看是否有这两端口。
主要防火墙是否允许对外访问这两端口。
如果你是阿里云服务器,要开启端口查看https://www.xgllseo.com/?p=5797
http://ip:8080/ 看下你的网站是否能访问

关于更多HLS在nginx中的配置可看看https://www.xgllseo.com/?p=7902

 

3,安装ffmpeg

window 64位的下载:
链接: https://pan.baidu.com/s/1jVOHOIAuEoNpCJQ7XeI7-A 提取码: g333

 

centos安装:

yum -y install epel-release

CentOS 6比较简单,安装yum源之后直接安装即可:

su -c 'yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-6.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-6.noarch.rpm'
yum -y install ffmpeg ffmpeg-devel

而CentOS 7需额外安装扩展源:

su -c 'yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm'

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm

yum -y install ffmpeg ffmpeg-devel

 

4,视频转m3u8
我是在window环境下转码的,执行

D:\ffmpeg\bin\ffmpeg.exe -i E:\zszz\zszz.mp4 -c:v libx264 -hls_time 10 -hls_list_size 0 -c:a aac -strict -2 -f hls E:\zszz\1.m3u8

没10秒切成一个ts视频,之后你会看到会有一个m3u8格式的文件和一堆ts视频,把这些文件都上传到/tmp/hls目录

 

5,播放m3u8视频

苹果设备直接就可以播放

<video controls>
  <source src="1.m3u8"></source>
</video>

其他设备的需要第三方插件

videojs

<link href="video-js.min.css" rel="stylesheet">
<script src="video.js"></script>
<script src="videojs-contrib-hls.js"></script>

<video class="video-js video-js vjs-default-skin" id="video1"></video>
function run(str,url,type) {
  var player = videojs(str, {
     width:1920,//宽string|number
     height:450,//高:string|number
     controls:true,//控制条:boolean
     preload:"none",//预加载:string;'auto'|'true'|'metadata'|'none'
     // poster:'source/suoluetu.jpg',//预览图:string
     autoplay:false,//自动播放:boolean
     loop:true,//循环:boolean
     muted:true,//静音:boolean
     fluid:true,
     sources:[
      {
        src:url,
        type:type
      }
     ],
     controlBar: {
      muteToggle: false,
      volumeMenuButton:false//静音按钮
     }
  }, function () {

  });
}

run('video1','http://xxxx:8080/hls/1.m3u8','application/vnd.apple.mpegurl');

 

其他测试地址:

https://zuikzy.603ee.com/2019/05/06/Et6dCHH62ojQBCqB/playlist.m3u8

 

6,总结通过测试了一下把1g的电影视频转成m3u8,在4g下进行播放还是可以的,总比去加载整个mp4文件后在播放实际。