#java合并多个m3u8

java合并多个m3u8

1.m3u8是何物

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放,同时可以进行分片加载,节省了很多带宽。

2.m3u8索引简单介绍

EXTM3U: 这个是M3U8文件必须包含的标签,必须放在第一行
EXT-X-VERSION:M3U8文件的版本,常见的是3(目前最高版本应该是7)
EXT-X-MEDIA-SEQUENCE: 第一个TS分片的序列号
EXT-X-TARGETDURATION: 每个分片TS的最大的时长
#EXTINF:11.986,      时长
20210123175203-11986.ts ts片段
#EXT-X-ENDLIST  结束索引

3.代码合并m3u8,注全部m3u8地址都必须要放在同一个目录底下,包括ts文件

	List<String> strings = new ArrayList<>();
	
	strings.add("xxx");
	strings.add("xxx");
	strings.add("xxx");
	
	String result = "#EXTM3U\n" +
			"#EXT-X-VERSION:3\n" +
			"#EXT-X-TARGETDURATION:40\n" +
			"#EXT-X-MEDIA-SEQUENCE:0\n";
	
	for (String str : strings) {
		// 操作网络这块需要关闭流和catch异常
		HttpClient client = new HttpClient();
		HttpMethod method = new GetMethod(str);
		InputStream resStream = null;
		ByteArrayOutputStream swapStream = null;
		byte[] buff = null;
		client.executeMethod(method);
		resStream = method.getResponseBodyAsStream();
		swapStream = new ByteArrayOutputStream();
		buff = new byte[100]; //buff用于存放循环读取的临时数据
		int rc = 0;
		while ((rc = resStream.read(buff, 0, 100)) > 0) {
			swapStream.write(buff, 0, rc);
		}
		buff = null;
		byte[] buffer = swapStream.toByteArray();
		
		Pattern reg = Pattern.compile("^#EXTINF:([\\s\\S]*)#EXT-X-ENDLIST$",Pattern.MULTILINE);
		String m3u8 = new String(buffer);
		Matcher matcher = reg.matcher(m3u8);
		while(matcher.find()) {
			
			result = result + matcher.group(0).replace(" no desc","").replace("#EXT-X-ENDLIST","");
			log.info("提取结果:{}",result);
		}
	}
	
	result = result + "#EXT-X-ENDLIST";
	
	InputStream inputStream = new ByteInputStream(result.getBytes(),result.getBytes().length);
	// todo 获取到了inputStream流,可以将此文件上传到跟m3u8的文件夹
posted @ 2021-01-25 18:05  无敌哈士奇  阅读(610)  评论(0编辑  收藏  举报