您的位置:首页 > 运维架构 > Nginx

nginx上搭建HLS流媒体服务器

2013-11-09 22:22 507 查看
简介: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

OS: Ubuntu 12.04(64bit)

文档说明:此方案是本人亲测,并测试成功,由于环境的不同,可能使得有些软件的安装会和本人有所不同。

此文档并未做任何的讲解,只是所做的过程作记录,纯干货,作者本人倾向于实践中去理解。

为了保证成功的走通此服务,请按作者本人的目录和文件命名操作,这样易于查错。

一、安装nginx服务

(1) 安装

apt-get install nginx
(2) 配置

1. 在/etc/nginx/mime.types中的types的括号内加入以下两行:

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

2. 在/etc/nginx/nginx.conf文件中,

找到下面一行:
include /etc/nginx/sites-enabled/*;
将其注释掉,然后换成下面一行:
include /etc/nginx/sites-enabled/myweb;

3.
在/etc/nginx/sites-enabled目录下,创建myweb文件,文件内容如下

[plain] view
plaincopy

<pre name="code" class="plain"><pre name="code" class="plain">server {

listen 8080; ## listen for ipv4; this line is default and implied

root /var/www/hls;

index index.html index.htm;

location / {

try_files $uri $uri/ /index.html;

}

location /doc/ {

alias /usr/share/doc/;

autoindex on;

allow all;

}

}</pre></pre>

注:root选项后面的/var/www/hls是指nginx服务器的根目录。

(3) 启动

service nginx restart

二、安装ffmpeg

apt-get install ffmpeg

三、下载编译segmenter

下载:https://github.com/johnf/m3u8-segmenter.git

编译:

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

注,不需要使用m3u8-segmenter目录中的.configure和Makefile来编译,而只需要segmenter.c文件编译

四、将视频文件转化为http live stream文件:

(1) 脚本如下:

[plain] view
plaincopy

#!/bin/sh

file=$1

file_name=`echo ${file} | awk -F '.' '{ print $1 "" }'`

ffmpeg -i $1 -f mpegts -acodec libmp3lame -ar 48000 -ab 128k -vcodec libx264 -b 96k -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate 96k -bufsize 96k -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async 2 ${file_name}.ts

./segmenter -i ${file_name}.ts -n 20 -p hls -m ${file_name}.m3u8 -u http://192.168.6.240:8080/
(2) 此脚本命名为convert,并和segmenter和视频文件放在/var/www/hls/目录下。

(3) 使用方法:

./convert 视频文件名

注:会产生较多的.ts文件和一个.m3u8文件。

五、使用vlc测试

打开vlc的网络串流,则对话框输入
http://192.168.6.240:8080/视频文件名.m3u8
点击播放,则可以正常的播放视频。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: