huangdali / M3U8Manger

M3U8管理器,M3U8格式视频下载,支持点播下载,直播缓存
579 stars 154 forks source link

License Download

M3U8Manger (M3U8管理器)

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

体验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.lang.String)方法来合并,当然自己写合并方法也是可以的

停止缓存

 M3U8LiveManger.getInstance().stop();

版本记录

v2.x

v2.3.0([2018.03.07]())

v2.2.3([2018.03.06]())

v2.1.9([2017.11.21]())

v2.1.8([2017.11.21]())

v2.1.7([2017.09.12]())

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]())

v1.0.7([2017.07.31]())

v1.0.6

v1.0.5

v1.0.4

v1.0.3