`

nginx上搭建HLS流媒体服务器

 
阅读更多

简介:HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议。

是苹果公司QuickTime X和iPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP

的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速

率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包

含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。


HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防

火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

此协议详细内容请参考apple官方网站:https://developer.apple.com/resources/http-streaming/

有两种方式搭建HLSserver,

一种是利用apple SDK,

一种是利用adobe 的fms,4.5版本支持hls,参考,

http://www.adobe.com/products/flash-media-streaming/features._sl_id-contentfilter_sl_featuredisplaytypes_sl_new.html

adobe的fms现在很强大,但是商用需要licence。有兴趣的可以研究下。

一种是利用opensouce.我比较喜欢这一种。

 

方法:

opensource的方法主要是使用m3u8-segmenter+ffmpeg对ts文件进行分片。

因此思路就是:

1,用编译好的ffmpeg制作所需要的ts文件,

2,安装libavformat-dev版本,

3,编译m3u8-segmenter,

4,部署到nginx

5,高级功能,流切换

6,页面

过程

1,本来想下载ffmpeg源码编译,但是因为要涉及到faac,x264,lame库。有时候ffmpeg版本对这些库的版本又有最低版本要求,在编译

faac时候遇到以下问题

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. 安装支持库  
  2. apt-get install automake autoconf m4 libtool  
  3.   
  4. -bash: ./bootstrap: /bin/sh^M: bad interpreter: No such file or directory  
  5.   
  6. 转换字符:  
  7. dos2unix bootstrap  
  8. make  
  9.   
  10. 错误:mpeg4ip.h:126:58: error: new declaration ‘char* strcasestr(const char*, const char*)’  
  11.   
  12. 解决方法:Remove line 126 containing strcasecmp from mpeg4ip.h as a temporary workaround  
  13.   
  14. make install时遇到  
  15. usr/local/share/man/man1文件夹无法创建问题。  


最后一个问题无法解决,好像是linux(ubuntu)下同一个目录下,如果已经有一个文件了,则不能创建同名文件夹,遂放弃编译,

直接从ffmpeg网站:http://ffmpeg.org/download.html ,的linux下载页面下载编译好ffmpeg静态文件。这个静态文件的主要目的是

为了把各种文件转换成apple所规定的文件。所以需要AAC,mp3,x264库支持。

 

或者干脆按照2的方法。apt-get install ffmpeg.这样会得到ffmpeg可行性文件。

 

2,安装ffmpeg支持库,主要用于编译m3u8-segmenter,这里的ffmpeg支持库,其目的是给segmenter提供libavformat支持。不涉及编解码。

apt-get install libavformat-dev.

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. Reading package lists... Done  
  2. Building dependency tree         
  3. Reading state information... Done  
  4. The following extra packages will be installed:  
  5.   libavcodec-dev libavcodec53 libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0  
  6.   libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1  
  7. Suggested packages:  
  8.   libfaad-dev libgsm1-dev libogg-dev libschroedinger-dev libspeex-dev libtheora-dev libvorbis-dev libx11-dev  
  9.   libxext-dev libraw1394-dev libdc1394-22-dev speex  
  10. The following NEW packages will be installed:  
  11.   libavcodec-dev libavcodec53 libavformat-dev libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0  
  12.   libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1  


这样会自动安装ffmepg几个相关库。

 

 

3,从https://github.com/johnf/m3u8-segmenter 下载m3u8-segmenter

下载后不要用它的反复编译,直接取m3u8-segmenter.c文件,

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. gcc -Wall -g segmenter.c -o segmenter -lavformat  

 

从源码来看,因为只用到了avformat库,所以只链接这一个即可。生成segmenter文件,用help命令,可以看到已经成功。

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. HTTP Live Streaming - Segments TS file and creates M3U8 index.  
  2.         -i, --input FILE             TS file to segment (Use - for stdin)  
  3.         -d, --duration SECONDS       Duration of each segment (default: 10 seconds)  
  4.         -p, --output-prefix PREFIX   Prefix for the TS segments, will be appended  
  5.                                      with -1.ts, -2.ts etc  
  6.         -m, --m3u8-file FILE         M3U8 output filename  
  7.         -u, --url-prefix PREFIX      Prefix for web address of segments, e.g. http://example.org/video/  
  8.         -n, --num-segment NUMBER     Number of segments to keep on disk  
  9.         -h, --help                   This help  


从上图来看,语法很简单,这里贴一个我用的。

 

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. ./segmenter -i test.ts -n 30 -p sample_test -m stream-test.m3u8 -u http://192.168.1.10:8080/hls/  


i表示输入文件,n表示切割30个,p表示切割文件的前缀。m表示生成的m3u8文件名,u表示这些切割后的文件处于web server的哪个目录下,这个一定要和web目录匹配

 

 

4,部署到nginx。

nginx的相关部署我在前两个博客中已经详细说明,这里在jwplayer博客的基础上部署hls。

1)目录问题:

在html/jwplayer目录下,建立hls文件夹,将m3u8文件和切割后的全部ts文件拷贝到此目录下,

在VLC PLAYER或者ipad safie浏览器或者在ffplayer(我用的是0.11版本的windows编译版本)

上的访问路径应该是http://192.168.1.10:8080/hls/stream-test.m3u8

2)文件类型问题:编辑 /usr/local/nginx/conf/mime.types 文件,添加如下类型

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. application/x-mpegURL                 m3u8;  
  2. video/MP2T                             ts;   

 

 

3)重启nginx 

输入上述路径,你应该就看到视频了。

 

5,高级功能,流切换

上述m3u8文件,只有一个流,不具备流切换功能。在优酷上,如果是ipad客户端,可以看到有标清,高清,超清的按钮,其实那个是对应着不同标准

的(单个)m3u8文件,来实现流切换的,不知道apple是不是这样做的,apple好像是要求“智能”流切换。即不要求用户去选择,而是根据网络状况自适应的。

apple给的sample的流切换是把各个流的m3u8写在一个m3u8文件里实现的。

类似于这样,其实原理是一样的。

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. #EXTM3U  
  2. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=100000  
  3. video1/index1.m3u8  
  4. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000  
  5. video2/index2.m3u8  

 

 


6,页面,

如果再继续搭建一个页面,把上述地址嵌在页面里面,这样配合CSS就比较美观了。页面可以在这个基础上,用webpy去做。



页面参考:

苹果开发网:https://developer.apple.com/resources/http-streaming/

博客:http://www.nginxs.com/linux/459.html

ffmpeg开发网:http://ffmpeg.org/download.html

segmenter源码:https://github.com/johnf/m3u8-segmenter

adboe fms介绍:http://www.adobe.com/products/flash-media-streaming/features._sl_id-contentfilter_sl_featuredisplaytypes_sl_new.html


 

 

2014.02备注:

文中所描述的切片软件可能有问题,可选择这个

https://code.google.com/p/httpsegmenter/downloads/list

 

http://blog.csdn.net/cjsafty/article/details/7922849

分享到:
评论

相关推荐

    nginx搭建rtmp及hls

    linux下搭建rtmp及hls全套资料及资源,新手可在linux下快速搭建流服务器,所需源码都已打包,无需另外下载依赖包,简单快捷,搭建完成启动/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

    nginx+nginx-rtmp-module的流媒体服务器搭建文件

    nginx.conf配置详情

    搭建ffmpeg+nginx+yasm 流媒体服务器低延迟,最低延迟两三秒

    搭建ffmpeg+nginx+yasm 流媒体服务器低延迟,最低延迟两三秒,文档已清晰注明安装部署步骤,基本无需修改,直接可以使用,本文采用rtsp转hls流进行播放

    Window下安装配置nginx的HLS m3u8点播流媒体服务器

    使用nginx实现HLS m3u8点播功能。 包括,nginx安装,mp4、flv切片,测试,跨域问题,nginx集群等等。

    利用nginx与ffmpeg搭建流媒体服务器过程详解

    本文介绍的是利用nginx和ffmpeg搭建流媒体服务器的过程。例如这种场景:公司内部需要同时观看在线直播时,如果每个人直接观看必然给出口带宽带来压力,影响正常访问外网的同事。所以可以在内网通过nginx+ffmpeg拉...

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

    这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器. 这个流媒体服务器可以支持RTMP和HLS(Live Http Stream) 从安装开始 Nginx的安装参照我之前的这个: ...

    nginx-rtmp-win32搭建流媒体服务器,支持rtmp、hls

    本资源包括两部分,一是nginx-rtmp-win32安装包,二是安装、配置使用说明。本资源已验证实现的功能是将摄像机采集的rtsp视频流,推送到我们搭建的流媒体服务,然后以rtmp、hls两种协议VLC播放可以正常获取的到流。

    使用nginx与nginx-rtmp-module搭建流媒体服务器

    支持rtmp协议和hls协议,观看直播就比较简单了,可以简单的使用h5的vedio标签就可以观看了。 可以访问http://xxx:81/hls/mystream.m3u8来观看直播,其中xxx为你的服务器IP地址

    rtmp流媒体服务器搭建.zip

    利用nginx-rtmp搭建Windows流媒体服务器,支持rtmp、hls协议播放。包含rtmp流媒体服务器搭建的工具和方法。

    CentOS7下搭建基于Nginx的HLS,RTMP流媒体直播服务器-附件资源

    CentOS7下搭建基于Nginx的HLS,RTMP流媒体直播服务器-附件资源

    nginx-1.5.8.zip

    这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.这个流媒体服务器可以支持RTMP和HLS(Live Http Stream)。 nginx配合ffmpeg做流媒体服务器的原理是: ...

    FFmpeg+nginx+rtmp+hls+实例视频以及搭建服务教程

    Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。...这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器。

    Mac上搭建nginx+rtmp直播服务器的步骤详解

    相信大家都知道nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,所以小编在网上整理了安装流程,现在分享给大家并且作备忘。有需要的朋友们可以参考学习,下面来一起看看吧。 一、...

    直播网站理论与实战(Java+FFmpeg+Nginx+HLS+Videojs+VLC)

    我将带领大家使用Java、FFmpeg、Nginx亲手搭建“直播网站”。 主要内容包括: 1、亲手搭建Java+nginx直播网站,用...目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

    Nginx-rtmp实现直播媒体实时流效果

     下图是总体设计图,为了整合多平台,会自建RTMP流媒体服务器和使用云厂商SaaS的RTMP流媒体服务。但是由于有时候会传输一些非流媒体数据,需要传输一些二进制文件,所以会需要自定义媒体转发服务。  以下是我实际...

    video_test.zip

    Windows实现流媒体服务器搭建 ngnix+rtmp+ffmpg+hls实现播放rtmp和HLS/m3u8直播流工具和测试代码

    示例源码.rar

    此示例支持前端网页调用海康威视摄像头在谷歌浏览器显示的例子,里面有ffmpeg、nginx-1.7.11.3-Gryphon、及前端读取HLS流的video.js插件,最近有项目要用,自己调研的Windows10下nginx的rtmp流媒体服务器搭建,亲测...

Global site tag (gtag.js) - Google Analytics