为什么需要边下边播
头条官方文档中对自己播放器的特色功能有这几点介绍,其中专门提到了“边下边播”的功能,边下边播的核心目的是:播放器提供视频播放时下载视频的选项,这样重复播放视频时可以直接播放本地视频文件,减少网络流量,增加播放稳定性。
播放网络视频的过程就是需要先将视频数据拉取下来,然后解封装,解码,然后渲染出声音和画面,首先需要的就是网络请求的流程,边下边播就是在网络请求过程中将请求下来的数据存储到本地,这样下次看视频的时候,不用重复请求已经拉取到本地的数据了,既节省流量,也能加速播放。
下面是阿里云播放器的边下边播介绍:
边下边播的3个优势 :
1.定制优化方便
2.省流量,二次打开快
3.稳定省资源
1.定制优化方便
正常使用播放器的开发者不一定非常熟悉播放器的流程,他们通常只是想要一个功能比较全面的播放器SDK,但是很多播放器网络层的优化太繁杂了,因为网络请求通常是播放器的一个子模块,这样如果我想优化网络请求的话,需要改动播放器的源码,这样对普通开发者的挑战太大了。
例如我使用exoplayer播放器,网络请求都放在DataSource模块
这个DataSource模块深深嵌入到exoplayer源码中,如果改动它确实对普通的开发者太难了,我们能不能将DataSource对应的网络模块抠出来,从exoplayer独立出来,在exoplayer的上层来优化网络模块?
答案是可以的,使用本地代理时可以做到的。
播放器就相当于客户端,在客户端和视频源服务器之间架设一个本地代理服务器,这个服务器负责接管客户端向服务器发送请求,然后将服务器返回的数据转发给客户端。
这样做的好处是:
播放器的网络模块完全从播放器中独立出来, 我们之后想针对网络层做定制优化的话,例如我想复用链接、DNS优化、独立代理等等,就不用修改播放器内部源码了。
2.省流量,二次打开快
播放视频本身就会请求视频数据,这些视频数据被请求下来了,会直接开始解封装、解码、渲染流程,不一定非要保存下来,再次播放这个视频的时候,这些流程还是需要走一遍,继续发网络请求,如果我已经缓存到本地,再次播放这个视频我直接读本地文件,速度显然要快很多,而且只要一次请求,不再重复消耗流量。
3.稳定节省资源
稳定省资源,这是相对了内存资源而言的,用了边下边播之后,占用的内存资源会变少。
我们为了提升播放速度,会采用预加载的方式,传统的预加载方式会创建多个播放器实例,像抖音一般都会预加载6个视频,传统的预加载方式要创建6个播放器实例,播放器实例创建之后,还会创建对应的MediaCodec,MediaCodec资源是有限的,如果平白无故创建这么多MediaCodec实例,就会导致ANR/NE/OOM等各种各样的问题。
现在使用了边下边播之后,可以脱离播放器开始预加载,这样无论预加载多少视频,都不会发生异常的问题。
脱离播放器实例开始预加载,这种思路确实帮我们节省了很多资源。
边下边播的坑
说了这么多边下边播的好话,那边下边播有没有什么坑,或者说要特殊说明的难点。因为这些问题或多或少影响着边下边播技术的推广应用。
1.MP4的结构问题
MP4格式的视频是BOX嵌套的结构,有点类似于俄罗斯套娃,主要结构图如下:
其中比较重要的是moov和mdat:
(1)moov
该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。同File Type Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现。
moov定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含以下三种Atom中的一种:mvhd标签、cmov标签、rmra标签。
moov是MP4视频的头部信息,只有解析出moov信息,才能完整识别这个MP4视频,否则无法解析MP4的核心数据mdat
(2)mdat
该box包含于文件层,可以有多个,也可以没有(当媒体数据全部为外部文件引用时),用来存储媒体数据。数据直接跟在box type字段后面,具体数据结构的意义需要参考metadata(主要在sample table中描述)。
moov的结构如下,其中mvhd是moov的头部信息,里面记录这BOX存储的其他字段信息。
对于一个MP4视频,如果没有解析出moov头部信息,是无法播放这个MP4视频的。
但是有一些MP4的视频的结构中moov头部信息在尾部:
moov在MP4视频尾部,这种情况下就无法边下边播了,因为网络请求只负责请求数据,并不负责解析moov头部,所以通常无法识别这种情况的数据。
现在抖音和快手都会在服务端对MP4视频处理====> 将MP4的moov移到mdat之前。
ffmpeg -i input.mp4 -movflags faststart output.mp4
2.拖动播放进度条之后怎么办
播放视频有一项通用的功能,拖动进度条,拖动进度条的情况下怎么管理请求,这是一个很大的问题。
开始边下边播的情况下,已经缓存到了cached_position位置,这时候是顺序缓存的,如果用户拖动进度条到一个新的位置,这个位置已经超过了目前的cached_position,我应该怎么做?
1.继续沿着cached_position顺序缓存下去
2.只要当前拖动的进度条超过cached_position,那就不继续缓存,后续的数据完全是网络请求。
3.拖动的进度条即使超过了cached_position, 从新的位置开始发起Range 请求
三种方式的优劣比较一下:
方案一:继续沿着cached_position顺序缓存下去,我拖动进度条的位置和cached_position相隔很远,如果采用这种方案拖动进度条之后播放会很慢,所以方案一被毙掉了。
方案二:方案二的做法也是可以的,拖动进度条之后也不会卡,但是也有问题,就是无法做法真正的边下边播,只能顺序下载。目前网络上热门的开源项目https://github.com/danikula/AndroidVideoCache 就是采用的这种方案
方案三:解决拖动之后卡顿,也解决了只能顺序下载的问题。目前是最优的解决方案
下面主要分析一下方案三是怎么解决拖动进度条之后的缓存管理问题的。
拖动过程中pos可能的情况下有很多种
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
*
* pos
* |--------------| |-------------------| |-------------------|
首先本地要维护一个VideoRange 数据结构
public class VideoRange {
private long mStart; //分片的起始位置
private long mEnd; //分片的结束位置
}
LinkedHashMap<Long, VideoRange> mVideoRangeMap
mVideoRangeMap中维护了一个VideoRange列表,key是VideoRange的起始位置,value是VideoRange的对象,mVideoRangeMap是按照key顺序排列的。
如果两个VideoRange之间是部分重合的,是需要merge成一个新的VideoRange的。
3.M3U8视频如何做边下边播
整视频的边下边播其实很好理解,即使有MP4的结构问题什么的?但是毕竟是一个整文件,Range请求还是比较好弄的,M3U8视频如何做边下边播?
头条播放器、阿里云播放器或者说市面上很多其他的播放器提供的边下边播功能,都明确说了只支持MP4视频。
但是网络上有很多M3U8的视频,我们在播放M3U8视频的时候支持边下边播。
M3U8视频是一个由M3U8索引文件按照特定规则组成的一个视频,其中M3U8索引文件管理了很多分片视频文件,这个M3U8索引文件本质上就是一个文本。
例如 https://iqiyi.zuidameiju.com/20200227/12397_4c680974/index.m3u8
索引文本是:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:7.0
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000000.ts
#EXTINF:6.255,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000001.ts
#EXTINF:3.753,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000002.ts
#EXTINF:2.919,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000003.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000004.ts
#EXTINF:5.421,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000005.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000006.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000007.ts
#EXTINF:1.9599,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000008.ts
#EXTINF:4.7121,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000009.ts
#EXTINF:6.1716,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000010.ts
#EXTINF:3.5862,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000011.ts
#EXTINF:0.7923,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000012.ts
#EXTINF:5.5878,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000013.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000014.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000015.ts
#EXTINF:2.6271,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000016.ts
#EXTINF:5.1291,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000017.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000018.ts
#EXTINF:4.2117,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000019.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000020.ts
#EXTINF:2.8356,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000021.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000022.ts
#EXTINF:6.0048,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000023.ts
#EXTINF:2.2935,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000024.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000025.ts
#EXTINF:4.3785,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000026.ts
#EXTINF:4.0032,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000027.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000028.ts
#EXTINF:4.6287,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000029.ts
#EXTINF:2.3352,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000030.ts
#EXTINF:3.2943,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000031.ts
#EXTINF:7.1724,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000032.ts
#EXTINF:2.2101,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000033.ts
#EXTINF:3.6279,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000034.ts
#EXTINF:2.9607,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000035.ts
#EXTINF:3.753,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000036.ts
#EXTINF:4.0032,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000037.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000038.ts
#EXTINF:5.5044,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000039.ts
#EXTINF:5.2959,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000040.ts
#EXTINF:0.5421,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000041.ts
#EXTINF:6.255,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000042.ts
#EXTINF:2.2518,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000043.ts
#EXTINF:5.004,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000044.ts
#EXTINF:2.502,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000045.ts
#EXTINF:4.5036,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000046.ts
#EXTINF:4.7955,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000047.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000048.ts
#EXTINF:4.5453,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000049.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000050.ts
#EXTINF:1.8348,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000051.ts
#EXTINF:4.0866,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000052.ts
#EXTINF:7.0473,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000053.ts
#EXTINF:4.0032,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000054.ts
#EXTINF:0.9591,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000055.ts
#EXTINF:6.2133,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000056.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000057.ts
#EXTINF:3.6696,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000058.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000059.ts
#EXTINF:1.8348,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000060.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000061.ts
#EXTINF:5.004,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000062.ts
#EXTINF:4.587,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000063.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000064.ts
#EXTINF:2.2935,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000065.ts
#EXTINF:4.17,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000066.ts
#EXTINF:1.0425,
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000067.ts
#EXT-X-ENDLIST
M3U8索引文件中有很多个分片视频,我们解析完M3U8文件之后,还要分别请求各个分片文件,播放器是通过索引文件找到对应的分片文件,然后解封--->解码分别文件,最终达成播放M3U8视频的目的。
所以我们做M3U8视频的边下边播,还是不能脱离M3U8索引文件,只不过需要对索引文件做一下改造:
1.构造一个本地代理的M3U8索引文件
2.发起对M3U8分片文件的请求,这个请求怎么维护和管理,下一小节【网络请求是放在客户端还是local proxy server端】会展开来讲。
3.local proxy server 端分别读取下载的分片文件发送到播放器客户端。
本地代理的M3U8索引文件如何构建:
构建规则是:http://127.0.0.1:port/base64-info
这个port是本地代理的端口,后面的base64-info是按照特定规则组合起来的数据:
我们解码一个数据看看:
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8wLnRzJmplZmZtb255X3NlZyZ1bmtub3du
解码出来如下:
https://iqiyi.zuidameiju.com/20200227/12397_4c680974/1000k/hls/f2b17811203000000.ts&jeffmony_seg&/877d9d6df35d7348241d7177c66bea3d/0.ts&jeffmony_seg&unknown
我们采用特定的分隔符&jeffmony_seg&来分割几个字段,这样在local proxy server端就有更多的信息来解析当前的分片文件了。
构建好的本地代理M3U8索引文件如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:7.0
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8wLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:6.255,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:3.753,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:2.919,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zLnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:5.421,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC83LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:1.9599,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC84LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:4.7121,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMDkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC85LnRzJmplZmZtb255X3NlZyZ1bmtub3du
#EXTINF:6.1716,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.5862,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:0.7923,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.5878,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xMy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.6271,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.1291,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xNy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xOC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.2117,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMTkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8xOS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.8356,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:6.0048,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yMy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2935,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.3785,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0032,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yNy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yOC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.6287,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMjkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8yOS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.3352,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.2943,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:7.1724,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2101,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zMy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.6279,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.9607,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.753,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0032,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zNy50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zOC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.5044,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwMzkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC8zOS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.2959,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80MC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:0.5421,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80MS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:6.255,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80Mi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2518,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80My50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.004,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80NC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.502,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80NS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.5036,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80Ni50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.7955,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80Ny50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80OC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.5453,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNDkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC80OS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81MC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:1.8348,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81MS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0866,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81Mi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:7.0473,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81My50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.0032,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81NC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:0.9591,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81NS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:6.2133,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81Ni50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81Ny50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:3.6696,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTgudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81OC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNTkudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC81OS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:1.8348,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjAudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82MC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjEudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82MS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:5.004,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjIudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82Mi50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.587,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjMudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82My50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjQudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82NC50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:2.2935,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjUudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82NS50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:4.17,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjYudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82Ni50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXTINF:1.0425,
http://127.0.0.1:39215/aHR0cHM6Ly9pcWl5aS56dWlkYW1laWp1LmNvbS8yMDIwMDIyNy8xMjM5N180YzY4MDk3NC8xMDAway9obHMvZjJiMTc4MTEyMDMwMDAwNjcudHMmamVmZm1vbnlfc2VnJi84NzdkOWQ2ZGYzNWQ3MzQ4MjQxZDcxNzdjNjZiZWEzZC82Ny50cyZqZWZmbW9ueV9zZWcmdW5rbm93bg
#EXT-X-ENDLIST
下面展示一个M3U8视频边下边播的例子:
4.网络请求是放在客户端还是local proxy server端
网络请求是放在客户端还在local proxy server端,这个问题有点奇怪,我们开头不是说播放器相当于一个客户端,我们使用本地代理边下边播的目的就是为了将视频网络请求从播放器中独立出来,现在还在讨论网络请求是不是放在客户端,是不是有点矛盾?
其实一点也不矛盾,播放器是客户端,但是客户端不一定就一定是播放器。
还是放一下JeffVideoCache的架构图吧:
发起请求还是放在客户端,没有放在服务端,放在客户端有什么好处?
1.客户端数据请求维护很方便,不用被驱动才能开始工作,local proxy server是需要被驱动才能开始工作的。
2.客户端的流量控制比较精确,而且和播放器接口交互非常方便。
3.放在客户端,请求数据和发送数据模块分离,本地代理控制方便多了。
如何使用JeffVideoCache
快到碗里来,多多提意见,方便JeffVideoCache后续改进。
https://github.com/JeffMony/JeffVideoCache
一个音视频领域专业问答的小圈子!
加我微信 ezglumes 拉你入技术交流群
推荐阅读:
觉得不错,点个在看呗~