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

这篇具有很好参考价值的文章主要介绍了利用简单的IO操作实现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。
- #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://www.toymoban.com/news/detail-445432.html

                    

到了这里,关于利用简单的IO操作实现M3U8文件之间的合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【爬虫】九、综合案例之m3u8文件

    视频网站常规处理方法: 用户上传视频–转码(处理视频)–切片处理(把单个文件进行拆分,一般把拆分好的文件放到M3U8、txt、json的文本中),用户在拖动进度条时则进入到某个分片中。 需要一个文件记录: 1.视频播放顺序。 2.视频存放路径。 抓取视频的方法: 1.找到

    2024年02月17日
    浏览(54)
  • m3u8文件转换mp4

    今天在做项目的时候遇到下载的视频文件格式是m3u8,且播放器不能播放。产品经理提出需要下载可播放的视频格式。便研究起来如何m3u8转mp4并下载。 后端所给的是一个对应的加密链接,将加密链接放入 a 标签内即可实现下载功能。但下载的是m3u8文件。 在码云上查到一篇关

    2024年02月12日
    浏览(34)
  • ffmpeg 下载网上m3u8的视频文件

    FFmpeg 是一个音视频领域使用最广泛的跨平台开源库。由C语言编写,但广泛的为 C/C++、C#、Java、Python 等主流编程语言所调用。它集合了几乎所有的编码解码库与流协议,几乎能完美处理音视频开发领域的所有需求。 方式一:源码安装 FFmpeg 通过编译源码安装 FFmpeg 的优点是可

    2023年04月09日
    浏览(44)
  • hls.js如何播放m3u8文件(实例)?

     HLS(HTTP Live Streaming)是一种视频流传输协议,是苹果推出的适用于iOS与macOS平台的流媒体传输协议。它将视频分割成若干个小段,每个小段大小一般为2~10秒不等,并通过HTTP协议进行传输。通过在每个小段之间插入若干秒的间隔,可以提高视频的传输稳定性和用户的观看体验

    2023年04月23日
    浏览(38)
  • 处理前端访问m3u8视频文件出现跨越问题

    一、后端模板渲染的方式,不需要处理,不会存在跨域问题 二、如果是前后端分离项目在 nginx 中配置跨域 1、 m3u8 文件存放在服务器地址为`/home/video-api/public/uploads/video 2、修改 nginx 的配置 3、客户端在 js 代码里面输入视频地址 http://【ip或者域名】/uploads/video/1686034066126185.m3u

    2024年02月09日
    浏览(55)
  • Python 实现 m3u8 视频下载

    m3u8 是一种 基于文本的媒体播放列表文件格式 ,通常用于指定流媒体播放器播放在线媒体流。它是一个简单的文本文件,其中包含多个由 URI 引用的媒体资源文件的 URL。m3u8 文件通常包含多个 ts 文件的链接,这些 ts 文件是实际的视频和音频数据文件,通常是通过 HTTP 协议传

    2024年02月07日
    浏览(53)
  • 原生小程序实现视频监控(m3u8格式)

    本文主要实现实时播放监控视频,基于原生微信小程序实现 1、在.wxml文件代码,视频一定要写宽高,不然可能显示不出来,以下属性介绍 src:视频地址, controls:是否显示默认播放控件(播放/暂停按钮、播放进度、时间) binderror: 视频播放出错时触发 show-center-play-btn:是

    2023年04月08日
    浏览(35)
  • 视频网站的工作原理-->m3u8视频文件的提取与解析(理论)

    目录 一、视频网站的工作原理 二、抓取视频步骤 2.1、找到m3u8文件 2.2、把m3u8下载到ts文件 2.3、ts文件合并为mp4文件         古老的视频网站的视频一般是在源码放一个video src=\\\"xxx.mp4\\\"/video,用户点击播放视频,会跳转到src的连接进行视频资源的获取进行播放。 缺点:视频

    2024年02月13日
    浏览(35)
  • python 爬虫 m3u8 视频文件 加密解密 整合mp4

    完整代码如下: 1. 认识m3u8文件 m3u8 的结构详细分析可以看这个链接m3u8 文件格式详解 - 简书 (jianshu.com),这里我们只简要介绍一下; 相信无论多小白都应该知道如何打开开发者模型解析得到下面的结果; 要注意的是,只有预览里面包含了 ts 信息的才算是我们需要的 m3u8 文件

    2024年02月20日
    浏览(52)
  • 调用JSch实现mp4转m3u8格式

    今天记录一下通过JSch实现MP4转m3u8格式文件。另外,如果需要转载我的文章,请表明文章出处及作者。https://blog.csdn.net/caleb_520/article/details/131701421?spm=1001.2014.3001.5502 ProcessBuilder ,这个是通过 java 调用 cmd 命令 JSch,由Java实现的SSH2协议的库,它提供了一种在Java程序中连接和操作

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包