hls 协议

家住魔仙堡 提交于 2020-01-16 11:28:50

HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于Http协议的的流媒体网络传输协议。是苹果公司QuickTime XiPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流

 

HLS协议的优点:

1.跨平台性:支持iOS/Android/浏览器,通用性强。

2.穿墙能力强:由于HLS是基于HTTP协议的,因此HTTP数据能够穿透的防火墙或者代理服务器HLS都可以做到,基本不会遇到被防火墙屏蔽的情况。

3.切换码率快(清晰度):自带多码率自适应,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。

3.负载均衡:HLS基于无状态协议(HTTP),客户端只是按照顺序使用下载存储在服务器的普通TS文件,做负责均衡如同普通的HTTP文件服务器的负载均衡一样简单。

HLS的缺点:

1.实时性差:苹果官方建议是请求到3个片之后才开始播放。所以一般很少用HLS做为互联网直播的传输协议。假设列表里面的包含5个 ts 文件,每个 TS 文件包含5秒的视频内容,那么整体的延迟就是25秒。苹果官方推荐的ts时长时10s,所以这样就会大改有30s(n x 10)的延迟。

2.文件碎片化严重:对于点播服务来说, 由于 TS 切片通常较小, 海量碎片在文件分发, 一致性缓存, 存储等方面都有较大挑战.

HLS协议由三部分组成:HTTP+M3U8+TS

HTTP:传输协议

M3U8:索引文件

TS:音视频媒体信息,视频的编码格式为H.264,音频格式为AAC。

 

HLS的工作原理:

 

HLS工作原理图

1.填入请求m3u8的url,通过http请求。

2.sever返回一个m3u8的播放列表,该列表包含了5段数据的url。

3.客户端解析m3u8播放列表后,按顺序的拿每一段数据的url去获取ts流。

 

 

 

HLS如何切片问题

Media encoder将视频源中的视频数据转码到目标编码格式(H264)的视频数据之后,在stream segmenter模块将视频切片。切片的结果就是index file(m3u8)和ts文件,如上图。

 

 

FFmpeg+Nginx搭建HLS直播服务

 

nginx配合ffmpeg做流媒体服务器的原理是:

nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个rtmp流到nginx,然后客户端通过访问nginx来收看实时视频流,只是最终客户端是通过HTTP协议来访问的,但是ffmpeg推送流仍然是rtmp的。

在这个过程中 ,Nginx是一个非常出色的HTTP服务器,NGINX提供 rtmp服务来接受文件上传,FFmpeg程序作为rtmp服务的客户端 向NGINX 上传视频文件。

 

  安装NGINX和nginx-rtmp-module 模块:

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

 

NGINX在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

 

FFMPEG的安装

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

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

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

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

rtmp {
    server {
        listen 1935; #端口
      RTMP 直播流配置
        application rtmplive {
            live on;
        }
       HLS 直播流配置
        application hls {
            live on;
            hls on;  #开启hls
            hls_path /tmp/hls;
          hls_fragment 5s #一个ts 文件的时长 5s
        }
    }
}

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

location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
}

 

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

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

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

 

然后用ffmpeg推流到nginx:

RTMP流,推流至rtmplive:

ffmpeg -re -i "D:\download\film\aqgy\02.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:\download\film\aqgy\02.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

 

直播与点播

http://elkpi.com/topics/2015/09/ffmpeg-f-hls.html

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!