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的文件夹