m3u8结构以及hls协议简单解析

HLS(Http Live Streaming): 用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。
HLS的优势就是:可以自适应调整播放码流,即网络畅通时选择高码流,网络繁忙时选择低码流,二者可以随意自行切换,以保证视频流的流畅度。当然该方法需要服务器提供多码流视频数据了,还需在列表文件中注明,播放形式会根据用户实际情况来调整。

ffmpeg 切割ts流的方法

有两种方式来切割,一种适合点播,一种适合直播。
一、segment方式
以这个视频源为例:http://120.87.10.21:8888/10/areaNode/3/20181112/90000001000000027546267261407316/00000000000000017546266136620000-0.m3u8?playType=vod&reset=0

ffmpeg -re -i "http://120.87.10.21:8888/10/areaNode/3/20181112/90000001000000027546267261407316/00000000000000017546266136620000-0.m3u8?playType=vod&reset=0" -codec copy -map 0 -f segment -segment_list playlist.m3u8 -segment_list_flags +live -segment_time 10 out%03d.ts

参数
-segment_list_flags +live :表示直播,加此参数可当做直播来用,但不代表该方式适合直播。
segment_list_size :对列表数量进行控制在6个。
该方式其实适合点播,因为它的ts流会被保存,相当于录制下来,如果你需要录制功能,那么此方法倒是变成了一个优势。

二、hls方式
直播的方式最好用hls的方式,因为它自己做了独立的功能模块,专门适用直播流。
目前新版本的ffmpeg的HLS模块加了很多参数,函数相关参考libavformat/hlsenc.c、 hls.c、 hlsproto.c

ffmpeg -re -i "http://120.87.10.21:8888/10/areaNode/3/20181112/90000001000000027546267261407316/00000000000000017546266136620000-0.m3u8?playType=vod&reset=0" -codec copy -map 0 -f hls -hls_list_size 10 -hls_wrap 10 -hls_time 10 playlist.m3u

参数解析:
-re :该参数表示ffmpeg将会按照当前视频的播放速率进行转码,这样就不会说切片的速度和播放速度不一致。不加这个参数,切片速度会非常快,客户端还来不及播放,列表已经被更新了。
-hls_time n :设置每片的长度,默认值为2,单位为
-hls_list_size n :设置m3u8文件播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5。一般用于直播流,点播文件可以设置成0,即全部保存。
-hls_wrap n :设置多少片之后开始覆盖,设置为0则不会覆盖,默认值为0。这个选项能够避免在磁盘上存储过多的片,而且能够限制写入磁盘的最多的片的数量。
以上参数可以自己尝试调整看看效果。

上面两个命令就是制作m3u8文件的。

m3u8文件介绍

m3u8的直播和点播区别
1、直播没有#EXT-X-ENDLIST属性,因为是直播流,不会结束,否则就是点播了。
2、直播不断更新,移除前面的文件进行替换,且#EXT-X-MEDIA-SEQUENCE属性标签以步长为1进行递增。

下面先看下我制作的一个m3u8文件。
在这里插入图片描述
#EXTM3U m3u文件头,必须放在第一行,用来标明这是m3u文件

#EXT-X-VERSION 该属性可以没有,只是表明当前的版本,默认为1

#EXT-X-TARGETDURATION:<s> s表示最大的秒数
指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这个最大值。这个tag在整个PlayList文件中只能出现一 次(在嵌套的情况下,一般有真正ts url的m3u8才会出现该tag)。

#EXT-X-MEDIA-SEQUENCE
这是media URI,每一个media URI 在 PlayList中只有唯一的序号,并不是必须要包含的,如果没有,默认为0。
作用:定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。

#EXTINF 指定每个媒体段(ts)的持续时间,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔开。

#EXT-X-ENDLIST m3u8的结束符,表示到了PlayList的末尾,这也表明了是点播资源,直播不会出现此属性。它可以在PlayList中任意位置出现,但是只能出现一次。

下面再罗列一下其它的字段属性:
#EXT-X-PLAYLIST-TYPE:<EVENT|VOD>
如果是VOD,则服务器不能改变PlayList 文件;如果是EVENT,则服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该文件中增加新的一行内容

EXT-X-ALLOW-CATCH:<YES|NO>
EXT-X-ALLOW-CATCH标签指定客户端能否用缓存下载的媒体文件用来重播。它可能会出现在播放列表文件的任何地方,但只能出现一次。该标签适用于播放列表中的所有分片。

M3U8两层结构介绍

M3U8分为两种顶级M3U8和二级M3U8,就是一个父子关系,顶级管理二级。
顶级M3U8:多码率适配的管理
二级M3U8:真正的切片文件,
看下面的例子:
顶级的M3U8:

#EXTM3U
#EXT-X-STREAM-INF
out001.m3u8
#EXT-X-STREAM-INF
out002.m3u8

二级M3U8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXTINF:10.214667,
out000.ts
#EXTINF:10.000000,
out001.ts
#EXTINF:0.480000,
out002.ts
#EXTINF:0.760000,
out003.ts
#EXT-X-ENDLIST

意思就是顶级M3U8管理多码流,二级M3U8才是真正获取的切片文件。
如果网络好就选择高码流,网络繁忙就选择低码流。

在线测试视频URL

下面给出一些测试的视频流:
一、在线的测试视频,视频真实URL地址
http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4
http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4
http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4
http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4
http://vfx.mtime.cn/Video/2019/03/18/mp4/190318214226685784.mp4
http://vfx.mtime.cn/Video/2019/03/19/mp4/190319104618910544.mp4
http://vfx.mtime.cn/Video/2019/03/13/mp4/190313094901111138.mp4
http://vfx.mtime.cn/Video/2019/03/12/mp4/190312143927981075.mp4
http://vfx.mtime.cn/Video/2019/03/12/mp4/190312083533415853.mp4
http://vfx.mtime.cn/Video/2019/03/09/mp4/190309153658147087.mp4
https://vfx.mtime.cn/Video/2019/01/15/mp4/190115161611510728_480.mp4

二、CCTV的URL
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 //可播放
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8 //不可播放,CCTV5不允许网络直播!
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8 //可播放
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8

三、m3u8和ts流的URL地址
http://120.87.10.21:8888/10/areaNode/3/20181112/90000001000000027546267261407316/00000000000000017546266136620000-0.m3u8?playType=vod&reset=0

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HLS.js 是一种流媒体播放器库,主要用于在网页上实现 HTTP Live Streaming (HLS) 视频播放功能。而 M3U8 则是一种基于文本的播放列表文件格式,常用于描述 HLS 视频的分片信息。 HLS.js 提供了一套 JavaScript 接口,通过解析 M3U8 文件以及下载和解码视频分片,实现了在网页上流畅播放 HLS 视频的功能。它可以在现代浏览器上运行,包括桌面和移动设备的浏览器。 使用 HLS.js,开发者可以通过简单的 HTML 代码来嵌入视频播放器,并配置播放器参数来自定义播放器界面和功能。HLS.js 支持自适应码率(Adaptive Bitrate)播放,可根据用户的网络情况动态调整视频的质量。 在 HLS 中,视频被切成多个分片,并以 M3U8 文件的形式描述每个分片的 URL 信息。HLS.js 能够通过解析 M3U8 文件,根据网络情况自动选择合适的分片进行缓冲和播放。同时,HLS.js 还支持预加载、跳转、重试等常见的播放器功能。 HLS.js 还提供了一些 API 和事件,使开发者能够对播放器进行控制和自定义。通过这些接口,我们可以动态改变播放状态、获取播放进度、监听播放事件等。 总的来说,HLS.js 是一个非常实用的工具,可以让开发者方便地在网页上实现 HLS 视频播放功能。通过使用 M3U8 文件来描述分片信息,HLS.js 能够根据网络情况进行自适应码率播放,提供流畅的视频体验。同时,HLS.js 还提供了丰富的 API 和事件,使开发者能够对播放器进行灵活的控制和自定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值