设为首页 加入收藏

TOP

利用简单的IO操作实现M3U8文件之间的合并(一)
2023-07-25 21:24:07 】 浏览:29
Tags:利用简 单的 M3U8 文件之

先上代码:

  1    @SneakyThrows  //合并操作,最终文件不包含结束标识,方便多次合并
  2     private static void mergeM3U8File(String source, String target) {
  3         
  4         //读取target
  5         List<String> sl = new ArrayList<>();
  6         try (BufferedReader reader = new BufferedReader(new FileReader(source))) {
  7             String line;
  8             while ((line = reader.readLine()) != null) {
  9                 sl.add(line);
 10             }
 11         }
 12         //读取source
 13         List<String> tl = new ArrayList<>();
 14         try (BufferedReader reader = new BufferedReader(new FileReader(target))) {
 15             String line;
 16             while ((line = reader.readLine()) != null) {
 17                 tl.add(line);
 18             }
 19         }
 20         //合并且统一ts文件名
 21         String filename = target.replace(dir,"");
 22         filename = filename.replace(".m3u8","");
 23         Long order = 0l;
 24         if (tl.size() <= 0) {
 25             for (String s : sl) {
 26                 if(s.startsWith("#")) tl.add(s);
 27                 else {
 28                     tl.add(filename + order + ".ts");
 29                     log.info("转存文件 {}{} 存在状态 {}", dir, s, Files.exists(Paths.get(dir + s)));
 30                     Files.copy(Paths.get(dir + s), Paths.get(dir + filename + order + ".ts"));
 31                     Files.delete(Paths.get(dir + s));
 32                     order++;
 33                 }
 34             }
 35         }
 36         else {
 37             //删除结束段落
 38             if(tl.get(tl.size()-1).startsWith("#EXT-X-ENDLIST")) {
 39                 tl.remove(tl.size() - 1);
 40             }
 41             //获取文件序号(dir+filename+order.ts)
 42             String s = tl.get(tl.size() - 1);
 43             s = s.replace(".ts","");
 44             s = s.replace(filename,"");
 45             order = Long.parseLong(s);
 46             //sl处理 获取头部标识的下标并移除头部
 47             int i = 0;
 48             for (i = 0; i < sl.size(); i++) {
 49                 if (sl.get(i).startsWith("#EXTINF")) break;
 50             }
 51             for (int j = 0; j < i; j++) {
 52                 sl.remove(0);
 53             }
 54             sl.remove(sl.size() - 1);
 55             tl.add("#EXT-X-DISCONTINUITY");
 56             //sl文件内容写入tl
 57             for (int j = 0; j < sl.size(); j++) {
 58                 String s1 = sl.get(j);
 59                 if(s1.startsWith("#EXTINF")) //#EXTINF
 60                     tl.add(s1);
 61                 else//按规则写入文件索引
 62                 {
 63                     order++;
 64                     tl.add(filename + order + ".ts");
 65                     log.info("转存文件 {}{} 存在状态 {}",dir,s1,Files.exists(Paths.get(dir + s1)));
 66                     Files.copy(Paths.get(dir + s1), Paths.get(dir + filename + order + ".ts"));
 67                     Files.delete(Paths.get(dir + s1));
 68                 }
 69             }
 70         }
 71         //生成新的buffer
 72         StringBuffer buffer = new StringBuffer();
 73         for (String t : tl) {
 74             buffer.append(t).append(System.lineSeparator());
 75         }
 76         //写入文件
 77         try (BufferedWriter writer = new BufferedWriter(new FileWriter(target))) {
 78             writer.write(buffer.toString());
 79         }
 80         //清除source
 81         Files.delete(Paths.get(source));
 82     }
 83 
 84     @SneakyThrows //给m3u8文件添加结束标识
 85     private static void endM3u8(String m3u8) {
 86         List<String> sl = new ArrayList<>();
 87         try (BufferedReader reader = new BufferedReader(new FileReader(m3u8))) {
 88             String line;
 89             while ((line = reader.readLine()) != null) {
 90                 sl.add(line);
 91             }
 92         }
 93         sl.add("#EXT-X-ENDLIST");
 94         //生成新的buffer
 95         StringBuffer buffer = new StringBuffer();
 96         for (String t : sl) {
 97             buffer.append(t).append(System.lineSeparator());
 98         }
 99         //写入文件
100         try (BufferedWriter writer = new BufferedWriter(new FileWriter(m3u8))) {
101             writer.write(buffer.toString());
102         }
103 
104     }

关于m3u8文件的说明:

- #EXTM3U:文件头,标识这是一个M3U8文件。
- #EXT-X-VERSION:表示M3U8的版本号。
- #EXT-X-TARGETDURATION:表示每个分段的最长时间(以秒为单位)。
- #EXT-X-MEDIA-SEQUENCE:表示播放列表中的第一个分段的编号。
- #EXTINF:表示当前分段的播放时间长度(以秒为单位)和URI

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring Cloud开发实践(六): 基于C.. 下一篇聊聊运营活动的设计与实现逻辑

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目