Android 实现m3u8视频缓存

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

ti4 中国战队好猛 B神可惜了~



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值