利用简单的IO操作实现M3U8文件之间的合并

利用简单的IO操作实现M3U8文件之间的合并先上代码:1@SneakyThrows//合并操作,最终文件不包含结束标识,方便多次合并2privatestaticvoidmergeM3U8File(Stringsource,Stringtarget){34//读取target5List<String&gt

大家好,欢迎来到IT知识分享网。

先上代码:

  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。
– #EXT-X-ENDLIST:表示播放列表结束。

– #EXT-X-STREAM-INF:表示变换码率视频流中的音视频属性。
– #EXT-X-DISCONTINUITY:表示两个分段之间的不连续性。
– #EXT-X-PROGRAM-DATE-TIME:表示当前分段的播放时间点。
– #EXT-X-BYTERANGE:表示分段的字节范围。

合并代码中的m3u8文件的格式:

 * #EXTM3U
* #EXT-X-VERSION:3
* #EXT-X-TARGETDURATION:2
* #EXT-X-MEDIA-SEQUENCE:0
* #EXT-X-PLAYLIST-TYPE:EVENT
* #EXTINF:1.441000,
* 2052636967-12640237988249000.ts
* #EXTINF:1.848000,
* 2052636967-12640237988249001.ts
* #EXT-X-ENDLIST

关于代码中的一些说明:

1、由于m3u8文件中的ts文件索引规则一般是  m3u8文件名+索引号,因此在合并文件之前需要先统一索引文件名;

2、由于m3u8文件之间是相互独立的,所以要在写入外部m3u8索引文件之前加入 #EXT-X-DISCONTINUITY 标识,否则播放器会在播放完第一部分的m3u8文件之后停止播放;

3、关于m3u8文件的结束行 #EXT-X-ENDLIST 问题,大部分播放器在未识别到结束标识且已经读取到文件最后一行索引时,会不断的请求m3u8文件,获取新资源,可以通过这个特新来实现直播效果;

合并后的文件内容:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:EVENT
# EXTINF: 1.441000.
2052636967-12640237988249000.ts
# EXTINF: 1.848000.
2052636967-12640237988249001.ts
#EXT-X-DISCONTINUITY
# EXTINF: 1.741000.
2052636967-12640237988249002.ts
# EXTINF: 1.148000.
2052636967-12640237988249003.ts
#EXT-X-ENDLIST


                                                        

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30076.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信