• Stars
    star
    565
  • Rank 78,889 (Top 2 %)
  • Language
    Java
  • Created over 7 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

M3U8管理器,M3U8格式视频下载,支持点播下载,直播缓存

License Download

M3U8Manger (M3U8管理器)

如果帮助到你,麻烦来个star,更欢迎你的fork

  • M3U8格式视频下载
  • 获取M3U8格式信息
  • 中途停止任务
  • 获取下载速度
  • 支持多任务下载
  • 支持url重定向处理过的m3u8
  • 支持直播缓存

温馨提示: 项目会一直维护, 请尽量通过issue渠道提bug和改进建议(绑定过邮箱,会第一时间回复)

体验app

扫描二维码:

或打开下面的地址

https://fir.im/2g5c

温馨提示:应用介绍里面有直播缓存教程

适用性

适用以下格式的m3u8格式(如果名字不是时间毫秒值的话,调用获取m3u8信息的方法将得不到开始时间,但不影响下载),当然有鉴权信息也是允许的

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:10
#EXTINF:9.960,
1500480000074.ts
#EXTINF:10.190,
1500480009999.ts
#EXTINF:9.960,
1500480020246.ts
#EXTINF:9.960,
1500480030189.ts
#EXTINF:10.030,
...

导入:

compile 'com.jwkj:M3U8Manger:v2.3.0'

获取M3U8信息:

   M3U8InfoManger.getInstance().getM3U8Info(url, new OnM3U8InfoListener() {
            @Override
            public void onSuccess(M3U8 m3U8) {
                ELog.e("获取成功了" + m3U8);
            }

            @Override
            public void onStart() {
                ELog.e("开始获取信息");
            }

            @Override
            public void onError(Throwable errorMsg) {
                ELog.e("出错了" + errorMsg);
            }
        });

点播下载

下载M3U8格式的视频文件:

 M3U8DownloadTask task1 = new M3U8DownloadTask("1001");
//下载按钮监听事件
 public void onDownload(View view) {
        task1.download(url, new OnDownloadListener() {
            @Override
            public void onDownloading(final long itemFileSize, final int totalTs, final int curTs) {
                ELog.e(task1.getTaskId() + "下载中.....itemFileSize=" + itemFileSize + "\ttotalTs=" + totalTs + "\tcurTs=" + curTs);
            }

            /**
             * 下载成功
             */
            @Override
            public void onSuccess() {
                ELog.e(task1.getTaskId() + "下载完成了");
            }

            /**
             * 当前的进度回调
             *
             * @param curLenght
             */
            @Override
            public void onProgress(final long curLenght) {
                if (curLenght - lastLength > 0) {
                    final String speed = NetSpeedUtils.getInstance().displayFileSize(curLenght - lastLength) + "/s";
                    ELog.e(task1.getTaskId() + "speed = " + speed);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            ELog.e("更新了");
                            tvSpeed1.setText(speed);
                            ELog.e(tvSpeed1.getText().toString());
                        }
                    });
                    lastLength = curLenght;

                }
            }

            @Override
            public void onStart() {
                ELog.e(task1.getTaskId() + "开始下载了");
            }

            @Override
            public void onError(Throwable errorMsg) {
                ELog.e(task1.getTaskId() + "出错了" + errorMsg);
            }
        });
    }

停止任务:

      task1.stop();

直播缓存

开启缓存

 String toFile="/sdcard/" + System.currentTimeMillis() + ".ts";
        tvSaveFilePathTip.setText("缓存目录在:/sdcard/11m3u8/\n最终导出的缓存文件在:"+toFile);
        M3U8LiveManger.getInstance()
                .setTempDir("/sdcard/11m3u8/")
                .setSaveFile(toFile)//(设置导出缓存文件)必须以.ts结尾
                .caching(url, new OnDownloadListener() {
                    @Override
                    public void onDownloading(long itemFileSize, int totalTs, int curTs) {
                      //此回调只有curTs有意义,表示开始缓存第几个ts
                    }

                    @Override
                    public void onSuccess() {
                        //此回调没有什么意义
                    }

                    @Override
                    public void onProgress(long curLength) {
                        if (curLength - lastLength > 0) {
                        //计算缓存速度
                            final String speed = NetSpeedUtils.getInstance().displayFileSize(curLength - lastLength) + "/s";
                            lastLength = curLength;
                        }
                    }

                    @Override
                    public void onStart() {
                        //开始缓存
                    }

                    @Override
                    public void onError(Throwable errorMsg) {
                        //缓存出错了
                    }
                });

获取开始缓存到当前时间的ts文件

 String filePath = M3U8LiveManger.getInstance().getCurrentTs();

温馨提示:此方法会自动合并当次任务所下载的所有ts文件,如果你不需要此方法,也可以使用com.hdl.m3u8.utils.MUtils.merge(java.util.List<java.io.File>, java.lang.String)方法来合并,当然自己写合并方法也是可以的

停止缓存

 M3U8LiveManger.getInstance().stop();

版本记录

v2.x

v2.3.0(2018.03.07)

  • 【新增】支持缓存直播类型的m3u8

v2.2.3(2018.03.06)

  • 【优化】支持更多格式的ts命名

v2.1.9(2017.11.21)

  • 【优化】支持url重定向处理过的m3u8

v2.1.8(2017.11.21)

  • 【新增】支持m3u8中的ts名字为非时间毫秒值的格式(此时ts的开始时间为0)

v2.1.7(2017.09.12)

  • 【新增】设置下载线程数方法(默认3个,建议不要设置超过5个)

v2.1.6(2017.08.15)

  • 【新增】设置连接超时时间、读取超时时间

v2.1.4、v2.1.5(2017.08.14)

  • 【优化】延迟删除临时文件(因为存取速度比较低的设备可能存在未移动完成而被删除情况)

v2.1.3(2017.08.14)

  • 【优化】网络不稳定时的数据抖动问题

v2.1.2(2017.08.14)

  • 【新增】设置是否清除临时目录的方法

v2.1.1(2017.08.14)

  • 【修复】文件生成与设置的文件名字不一致问题

v2.0.8(2017.08.14)

  • 【修复】设置文件保存路径时,会多出文件夹

v2.0.7(2017.08.14)

  • 【修复】设置文件保存路径方法被隐藏

v2.0.6(2017.08.14)

  • 【新增】断点续传
  • 【新增】支持多任务
  • 【优化】下载速度不准确问题

V1.x

v1.0.8(2017.08.08)

  • 【新增】onLoadFileSizeForItem方法(获取单个ts文件的平均大小)
    • 可根据这个平均值x总的切片个数(total)=总文件的大小

v1.0.7(2017.07.31)

  • 【修复】获取M3U8信息不走onStart的bug

v1.0.6

  • 【修复】指定下载的区间时间不准问题

v1.0.5

  • 【修复】下载成功走的是onStart
  • 【新增】指定下载的区间

v1.0.4

  • 【新增】获取M3U8基本信息方法
  • 【新增】停止任务方法

v1.0.3

  • 【修复】url失效时抛出异常
  • 【新增】M3U8开始、结束时间

More Repositories

1

HRichEditor

Android端富文本编辑器HEichEditor
Java
323
star
2

RulerView

时间刻度尺
Java
121
star
3

MRichEditorDemo

The MRichEditor is a richeditor for Android
Java
99
star
4

livetemplates

Android Studio Live Templates使用详解,提高敲代码的速度
97
star
5

newkjdemo

mvp+retrofit+rxjava
Java
63
star
6

RootUtils

Firefly-RK系列(eg:RK3288 RK3368)一键获取root权限工具RootUtils
Java
45
star
7

LogcatView

Logcat手机版日志记录
Java
44
star
8

Android_ProtoBuf_Demo

Android中protobuf的使用教程,结合HttpURLConnection及Retrofit+RxJava使用
Java
42
star
9

MyHttpUtils

一个非常好用的异步网络请求框架
Java
40
star
10

UDPSender

UDPSender 一个基于NIO的UDP发送-接收器
Java
35
star
11

DatepickerDialog

日期选择器,日历选择器,可标记某一天,DatepickerDialog,Tagged calendar
Java
28
star
12

TimeRuler

时间轴、时间刻度尺
Java
27
star
13

CommWebView

android端通用WebView
Java
27
star
14

WebViewDialog

WebViewDialog默认背景透明的加载网页的对话框, 红包、活动弹窗
Java
20
star
15

ELog

ELog----日志打印工具,带定位功能
Java
17
star
16

jpushdemo

jpushdemo
Java
15
star
17

CrashExcptioner

全局异常捕获器,带默认app错误信息页
Java
15
star
18

BuglyAutoInstaller

使用Bugly实现自动安装/静默安装App autoinstaller
Java
11
star
19

MVPOptimize

MVP优化Demo
Java
11
star
20

VideoPlayer_for_Android

android网络视频播放器,可截图
Java
7
star
21

SoundWaveLib

声波配网库
Java
5
star
22

ALiPayDemo

微信、支付宝支付demo
Java
4
star
23

uniapp-plugin-android

开发uniapp for android原生插件
HTML
4
star
24

HProgressDialog

简单加载进度对话框
Java
3
star
25

FacebookDemo

facebook登录、分享demo
Java
3
star
26

NDKDemo

ndk开发-----android studio打包so动态库demo
Java
3
star
27

Ffmpeg_cmd_android

android端ffmpeg命令行工具
C
3
star
28

HPermission

Android权限管理类
Java
3
star
29

andfixdemo

andfixdemo
Java
2
star
30

TimeLineView

时间轴、时间刻度、带时间轴中选择时间
Java
2
star
31

MenuDemo

自定义菜单
Java
2
star
32

YZXVedioLib

抽取云之讯视频通话部分作为单独的库,便于后期的集成
Java
2
star
33

Spring

Spring学习
Java
2
star
34

linux

linux学习笔记
Java
2
star
35

taxiservice

基于SSM的出租车管理系统
Java
2
star
36

IJKMediaplayerDemo

ijkplayer简单实现播放视频
Java
1
star
37

DeivceUDPLib

设备UDP库
Java
1
star
38

ColorExtraction

颜色吸取器
Java
1
star
39

UDPSenderDemo

基于NIO的广播发送器---搜索局域网设备
Java
1
star