设为首页 收藏本站
查看: 486|回复: 0

[经验分享] nginx上搭建HLS流媒体服务器

[复制链接]

尚未签到

发表于 2016-12-28 07:34:25 | 显示全部楼层 |阅读模式
  转自:http://blog.csdn.net/cjsafty/article/details/7922849
简介: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 



  • 安装支持库  
  • apt-get install automake autoconf m4 libtool  
  •   
  • -bash: ./bootstrap: /bin/sh^M: bad interpreter: No such file or directory  
  •   
  • 转换字符:  
  • dos2unix bootstrap  
  • make  
  •   
  • 错误:mpeg4ip.h:126:58: error: new declaration ‘char* strcasestr(const char*, const char*)’  
  •   
  • 解决方法:Remove line 126 containing strcasecmp from mpeg4ip.h as a temporary workaround  
  •   
  • make install时遇到  
  • 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 



  • Reading package lists... Done  
  • Building dependency tree         
  • Reading state information... Done  
  • The following extra packages will be installed:  
  •   libavcodec-dev libavcodec53 libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0  
  •   libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1  
  • Suggested packages:  
  •   libfaad-dev libgsm1-dev libogg-dev libschroedinger-dev libspeex-dev libtheora-dev libvorbis-dev libx11-dev  
  •   libxext-dev libraw1394-dev libdc1394-22-dev speex  
  • The following NEW packages will be installed:  
  •   libavcodec-dev libavcodec53 libavformat-dev libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0  
  •   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 



  • gcc -Wall -g segmenter.c -o segmenter -lavformat  

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



  • HTTP Live Streaming - Segments TS file and creates M3U8 index.  
  •         -i, --input FILE             TS file to segment (Use - for stdin)  
  •         -d, --duration SECONDS       Duration of each segment (default: 10 seconds)  
  •         -p, --output-prefix PREFIX   Prefix for the TS segments, will be appended  
  •                                      with -1.ts, -2.ts etc  
  •         -m, --m3u8-file FILE         M3U8 output filename  
  •         -u, --url-prefix PREFIX      Prefix for web address of segments, e.g. http://example.org/video/  
  •         -n, --num-segment NUMBER     Number of segments to keep on disk  
  •         -h, --help                   This help  

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



  • ./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 



  • application/x-mpegURL                 m3u8;  
  • video/MP2T                             ts;   

 
 
  3)重启nginx 
输入上述路径,你应该就看到视频了。
 
5,高级功能,流切换
上述m3u8文件,只有一个流,不具备流切换功能。在优酷上,如果是ipad客户端,可以看到有标清,高清,超清的按钮,其实那个是对应着不同标准
的(单个)m3u8文件,来实现流切换的,不知道apple是不是这样做的,apple好像是要求“智能”流切换。即不要求用户去选择,而是根据网络状况自适应的。
apple给的sample的流切换是把各个流的m3u8写在一个m3u8文件里实现的。
类似于这样,其实原理是一样的。
 
[plain] view plaincopy 



  • #EXTM3U  
  • #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=100000  
  • video1/index1.m3u8  
  • #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000  
  • 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-320319-1-1.html 上篇帖子: nginx + msm 负载均衡及session共享fro windows 下篇帖子: nginx上搭建HLS流媒体服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表