Android 实现m3u8视频缓存
2015-09-24 23:25
1046 查看
1.M3U8协议
HLS(HTTP Live Streaming)是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案。在
HLS 技术中 Web 服务器向客户端提供接近实时的音视频流。但在使用的过程中是使用的标准的 HTTP 协议,所以这时,只要使用 HLS 的技术,就能在普通的 HTTP 的应用上直接提供点播和直播。在App Store中的视频相关的应用,基本都是应用的此种技术。该技术基本原理是将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。支持的视频流编码为H.264,音频流编码为AAC。
#EXTM3U
#EXT-X-TARGETDURATION:19
#EXT-X-VERSION:2
#EXTINF:10,
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=0&ts_end=10&ts_seg_no=0
#EXTINF:10,
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=10&ts_end=20&ts_seg_no=1
…………..
#EXTINF:12,
http://122.225.31.85/657DD4BEC15488401753C7200C/0300080B0A53D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=320&ts_end=336&ts_seg_no=396
#EXT-X-ENDLIST
上面是一个m3u8的例子
现在主流的视频网站基本都是用这中格式做在线视频。
2.播放
Android原生系统好像是不支持m3u协议的,所以一般情况要继承第三方的播放器,百度或者vatimio
使用参考各自的api文档即可比较简单。
3.缓存
参考上面的例子,可分析出
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=0&ts_end=10&ts_seg_no=0
这玩意就是我们要的视频源文件,拷贝地址到浏览器可以下载到xxxx.ts的文件。
我们缓存的思路也很简单:
1. 解析原始的m3u8 获取每个短视频的源地址。
2. 下载所有的短视频到本地。
3. 根据原始的meu8生成本地版的m3u8。
4. 把本地生成的m3u8路径传入播放器。
下面根据这个思路敲代码即可…
4.喜闻乐见的代码
解析m3u8:
public static List<String>
parseStringFromUrl(String
url) { List<String>
resultList = null; HttpResponse res = HttpConnect.getResponseFromUrl(url); try { if (res != null) { resultList =new ArrayList<String>;
InputStream in = res.getEntity.getContent; BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String line =
""; while ((line = reader.readLine) != null) { if (line.startsWith("#")) { } else if (line.length > 0 && line.startsWith("http://")) { resultList.add(line); } } in.close; } } catch (Exception
e) { e.printStackTrace;
} return resultList; }
2.下载视频 这个参考文件下载的代码即可。
3. 我们把视频文件保存在SD卡目录下,文件名可以自己定了,我用的是1.ts,2.ts。。这样的。
public static String
getNativeM3u(String
url,List<String>
pathList,String saveFilePath)
{ HttpResponse res = HttpConnect.getResponseFromUrl(url); int num=0; //需要生成的目标buff StringBuffer buf = new StringBuffer; try { if (res != null) { InputStream in = res.getEntity.getContent; BufferedReader reader = new BufferedReader( new InputStreamReader(in));
String line = ""; while ((line = reader.readLine) != null) { if (line.length > 0 && line.startsWith("http://")) { //replce 这行的内容 buf.append("file:/"+saveFilePath+num+".ts\r\n"); num++; }else { buf.append(line+"\r\n");
} } in.close; } } catch (Exception e) { e.printStackTrace; } return buf.toString; }
url 是m3u8的地址
pathList 为上面解析出来的ts视频地址的list
saveFilePath 为本地保存ts的路径
然后把这个生成的m3u8文件写到本地即可。
/** * 将内容回写到文件中
* * @param filePath * @param content */ public static void write(String filePath, String content) { BufferedWriter bw = null; try { // 根据文件路径创建缓冲输出流 bw = new BufferedWriter(new FileWriter(filePath));
// 将内容写入文件中 bw.write(content); } catch (Exception e) { e.printStackTrace; } finally { // 关闭流 if (bw != null) { try { bw.close; } catch (IOException
e) { bw =
null; } } } }
要播放的时候把这个本地的m3u8地址扔个播放器即可,就这么简单~
附上demo的地址:http://apk.hiapk.com/appinfo/com.shixforever.gamevideo
HLS(HTTP Live Streaming)是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案。在
HLS 技术中 Web 服务器向客户端提供接近实时的音视频流。但在使用的过程中是使用的标准的 HTTP 协议,所以这时,只要使用 HLS 的技术,就能在普通的 HTTP 的应用上直接提供点播和直播。在App Store中的视频相关的应用,基本都是应用的此种技术。该技术基本原理是将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。支持的视频流编码为H.264,音频流编码为AAC。
#EXTM3U
#EXT-X-TARGETDURATION:19
#EXT-X-VERSION:2
#EXTINF:10,
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=0&ts_end=10&ts_seg_no=0
#EXTINF:10,
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=10&ts_end=20&ts_seg_no=1
…………..
#EXTINF:12,
http://122.225.31.85/657DD4BEC15488401753C7200C/0300080B0A53D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=320&ts_end=336&ts_seg_no=396
#EXT-X-ENDLIST
上面是一个m3u8的例子
现在主流的视频网站基本都是用这中格式做在线视频。
2.播放
Android原生系统好像是不支持m3u协议的,所以一般情况要继承第三方的播放器,百度或者vatimio
使用参考各自的api文档即可比较简单。
3.缓存
参考上面的例子,可分析出
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=0&ts_end=10&ts_seg_no=0
这玩意就是我们要的视频源文件,拷贝地址到浏览器可以下载到xxxx.ts的文件。
我们缓存的思路也很简单:
1. 解析原始的m3u8 获取每个短视频的源地址。
2. 下载所有的短视频到本地。
3. 根据原始的meu8生成本地版的m3u8。
4. 把本地生成的m3u8路径传入播放器。
下面根据这个思路敲代码即可…
4.喜闻乐见的代码
解析m3u8:
public static List<String>
parseStringFromUrl(String
url) { List<String>
resultList = null; HttpResponse res = HttpConnect.getResponseFromUrl(url); try { if (res != null) { resultList =new ArrayList<String>;
InputStream in = res.getEntity.getContent; BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String line =
""; while ((line = reader.readLine) != null) { if (line.startsWith("#")) { } else if (line.length > 0 && line.startsWith("http://")) { resultList.add(line); } } in.close; } } catch (Exception
e) { e.printStackTrace;
} return resultList; }
2.下载视频 这个参考文件下载的代码即可。
3. 我们把视频文件保存在SD卡目录下,文件名可以自己定了,我用的是1.ts,2.ts。。这样的。
public static String
getNativeM3u(String
url,List<String>
pathList,String saveFilePath)
{ HttpResponse res = HttpConnect.getResponseFromUrl(url); int num=0; //需要生成的目标buff StringBuffer buf = new StringBuffer; try { if (res != null) { InputStream in = res.getEntity.getContent; BufferedReader reader = new BufferedReader( new InputStreamReader(in));
String line = ""; while ((line = reader.readLine) != null) { if (line.length > 0 && line.startsWith("http://")) { //replce 这行的内容 buf.append("file:/"+saveFilePath+num+".ts\r\n"); num++; }else { buf.append(line+"\r\n");
} } in.close; } } catch (Exception e) { e.printStackTrace; } return buf.toString; }
url 是m3u8的地址
pathList 为上面解析出来的ts视频地址的list
saveFilePath 为本地保存ts的路径
然后把这个生成的m3u8文件写到本地即可。
/** * 将内容回写到文件中
* * @param filePath * @param content */ public static void write(String filePath, String content) { BufferedWriter bw = null; try { // 根据文件路径创建缓冲输出流 bw = new BufferedWriter(new FileWriter(filePath));
// 将内容写入文件中 bw.write(content); } catch (Exception e) { e.printStackTrace; } finally { // 关闭流 if (bw != null) { try { bw.close; } catch (IOException
e) { bw =
null; } } } }
要播放的时候把这个本地的m3u8地址扔个播放器即可,就这么简单~
附上demo的地址:http://apk.hiapk.com/appinfo/com.shixforever.gamevideo
相关文章推荐
- 【Android】解析Json数据
- 解决android的ListView嵌套在ScrollView中不能被滚动的问题
- Android Studio安装SVN
- Android自定义View---正式篇
- android布局
- android EditText 控件中加入图片(非背景图片)
- 【Android测试】【第九节】MonkeyRunner—— 初识
- Android开发经验:成为高手必看的10个建议
- Android中dp,px,sp概念梳理以及如何做到屏幕适配
- android基础知识
- android中dp(dip) px sp
- Android手势操作(双击,长按,滑动,滚动,多点触控)
- android 中在内存中保存文件
- Android播放网页视频以及帧动画
- java泛型操作复习,以及讲解在android中使用的场景
- Android Api Demos登顶之路(八十一)Graphics-->Patterns
- Android 事件的传递机制
- Fetching Android SDK component information
- android PorterDuffXfermode、PorterDuff.Mode 使用
- Android0924(事件传递、手势操作)