博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android——实现m3u8视频缓存
阅读量:2083 次
发布时间:2019-04-29

本文共 3280 字,大约阅读时间需要 10 分钟。

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,
  • #EXTINF:10,
    …………..
  • #EXTINF:12,
  • #EXT-X-ENDLIST

上面是一个m3u8的例子

现在主流的视频网站基本都是用这中格式做在线视频。

2.播放

Android原生系统好像是不支持m3u协议的,所以一般情况要继承第三方的播放器,百度或者vatimio 使用参考各自的api文档即可比较简单。

3.缓存

参考上面的例子,可分析出:

这玩意就是我们要的视频源文件,拷贝地址到浏览器可以下载到xxxx.ts的文件。

我们缓存的思路也很简单:

  1. 解析原始的m3u8 获取每个短视频的源地址。
  2. 下载所有的短视频到本地。
  3. 根据原始的meu8生成本地版的m3u8。
  4. 把本地生成的m3u8路径传入播放器。

下面根据这个思路敲代码即可…

4.喜闻乐见的代码

1.解析m3u8:

public static List
parseStringFromUrl(String url) { List
resultList = null; HttpResponse res = HttpConnect.getResponseFromUrl(url); try { if (res != null) { resultList =new ArrayList
; 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
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"); } } } } 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://xrcqf.baihongyu.com/

你可能感兴趣的文章
Java面试题全集(中)
查看>>
值传递和引用传递
查看>>
什么情况下用+运算符进行字符串连接比调用StringBuilder对象的append方法连接字符串性能更好?
查看>>
怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?
查看>>
理解事务的4种隔离级别
查看>>
常用正则匹配符号
查看>>
建议42: 让工具类不可实例化
查看>>
Java 异步机制与同步机制的区别
查看>>
hibernate的对象三种状态说明
查看>>
什么是N+1查询?
查看>>
直插,快排,堆排,归并排序的分析
查看>>
二叉树的各种操作(面试必备)
查看>>
oracle
查看>>
Struts2中的session、request、respsonse获取方法
查看>>
如何理解MVC模型
查看>>
SpringMVC中乱码解决方案
查看>>
SpringMVC中时间格式转换的解决方案
查看>>
post和get请求相关知识点
查看>>
关于try finally 中的return语句的问题
查看>>
RequestBody/ResponseBody处理Json数据
查看>>