现在看来,这是之前做过的最有意思的一个功能。😁
M3U8是一种流媒体,现多用于视频播放。当把m3u8格式视频对应的url下载下来用文本打开会发现其实只是一段字符串,包含了很多视频小片段的地址,那么怎么样把整个视频下载下来用于本地播放呢?
m3u8文件
首先,m3u8文件展开后的字符串类似这样:
|
|
在每一行#EXTINF:下面的网址就是一个个ts文件的地址,实际去下载的应该是这些视频小片段。而在#EXTINF:后面的数字代表的是这个ts文件所包含视频的时长。
解析
第一步要解析这个m3u8的url,将其中所有ts文件的下载地址记录下来:
|
|
下载
得到了这些视频文件的真实地址后,就可以去下载了。下载方法有很多,可以用第三方库ASIHTTPRequest,AFNetworking;或者直接用原生的NSURLConnection,NSURLSession都可以。注意因为一个视频包含很多个小的ts文件,所以为了便于管理,建议1 是将这些文件按索引号分别命名为id0.ts,id1.ts,id2.ts等,2 是按顺序去下载这些小片段,且同一时间只下载一个,当一个下载完成后,再去下载下一个。注意这里其实每一个ts小片段本身都是不支持断点续传的😳。
拼接
当所有这些ts文件下载完成后,需要在本地将它们拼接成一个新的m3u8文件:
|
|
其中127.0.0.1是随便写的,只要和播放时调用的一致即可。拼成后本地的m3u8文件用文本打开类似如下:
|
|
本地播放
由于m3u8只支持http协议的远程播放,所以必须在应用程序里搭建一个服务器。好消息是早就有开源库CocoaHTTPServer做到了这一点:
|
|
最后,将类似127.0.0.1:54321/%@/movie.m3u8这样的地址传给系统播放器就可以实现本地播放了。
完整版Demo请猛戳这里。