之前一直不明白类似爱奇艺这类的门户到底是怎么播放视频类文件的,最近做了这方面东西,研究了一下,大致整理了一下流程。
首先视频提供商会提供有关的视频文件,可以封装在tar包中,其中包括m3u8以及包含ts文件的文件夹。将这个tar文件和xml文件,fin,jpg放在某个固定的input目录下面,系统不定期扫描这个目录,看下面是不是有fin文件,将这些fin文件放在一个线程池里卖弄,但是一次只能有一个线程,阻塞线程可以有多个。针对每个fin文件扫描是,和input同级简历poster和asset目录,扫描fin文件,将对应的jpg放在poster文件夹下,扫描文件将各种元数据保存到数据库对应的表中,这里包括m3u8文件的位置保存在sarft_message表中。
用户到时候点播视频,系统返回m3u8位置到android,andrid系统读取m3u8文件,这里的m3u8是一级的m3u8,然后根据m3u8读取到对应的文件夹里的二级m3u8,在这个问津里面针对视频的切片文件ts进行的读取顺序的排列,android按照文件里的顺序读取对应的ts文件,这样视频就可以播放了。这里的m3u8是能针对多码流的,所以一级m3u8里面可以对应多个存ts的文件夹,这些文件可以是不同的码流。
m3u8主要可以做多码率的适配,
根据网络带宽,客户端会选择一个适合自己码率的文件进行播放,保证视频流的流畅。
多码率适配流,
单码率适配流#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:5220
#EXTINF:5220,
http://media.example.com/entire.ts
#EXT-X-ENDLI
M3U8分顶级M3U8和二级M3U8, 顶级M3U8主要是做多码率适配的, 二级M3U8才是真正的切片文件,
客户端默认会首先选择码率最高的请求,如果发现码率达不到,会请求郊低码率的流
客户端拿到上面的二级M3U8文件后,会继续请求里面的文件,这时就可进行播放了。
上面讲解的是点播的情况,直播的情况,M3U8文件里面会有属性告诉是直播,客户端会定时来请求新的M3U8文件。