Giter Site home page Giter Site logo

m3u8download's Introduction

m3u8Dowload

java下载m3u8视频,解密并合并ts

m3u8链接获取方式以及代码分析请参见:

https://blog.csdn.net/qq494257084/article/details/103551293

准备

JDK:1.8
开发环境:IntelliJ IDEA
用于解密的jar包:bcprov-jdk16-139.jar
了解一些m3u8标签作用
https://www.cnblogs.com/shakin/p/3870442.html

使用方法

M3u8DownloadFactory.M3u8Download m3u8Download =  M3u8DownloadFactory.getInstance(M3U8URL);
//设置生成目录
m3u8Download.setDir("F://m3u8JavaTest");
//设置视频名称
m3u8Download.setFileName("test");
//设置线程数
m3u8Download.setThreadCount(100);
//设置重试次数
m3u8Download.setRetryCount(100);
//设置连接超时时间(单位:毫秒)
m3u8Download.setTimeoutMillisecond(10000L);
//添加额外请求头
  /*  Map headersMap = new HashMap<>();
    headersMap.put("Content-Type", "text/html;charset=utf-8");
    m3u8Download.addRequestHeaderMap(headersMap);*/
//设置日志级别
//可选值:NONE INFO DEBUG ERROR
 m3u8Download.setLogLevel(Constant.DEBUG);
//设置监听器间隔(单位:毫秒)
m3u8Download.setInterval(500L);
//如果需要的话设置http代理
//m3u8Download.setProxy("172.50.60.3",8090);
//添加监听器
m3u8Download.addListener(new DownloadListener() {
    @Override
    public void start() {
        System.out.println("开始下载!");
    }
    @Override
    public void process(String downloadUrl, int finished, int sum, float percent) {
        System.out.println("下载网址:" + downloadUrl + "\t已下载" + finished + "个\t一共" + sum + "个\t已完成" + percent + "%");
    }
    @Override
    public void speed(String speedPerSecond) {
        System.out.println("下载速度:"+speedPerSecond);
    }
    @Override
    public void end() {
        System.out.println("下载完毕");
    }
});
//开始下载
m3u8Download.start();

更新日志

2021.12.20

* 增加代理设置

2020.05.22

* 解决获取链接问题

2020.04.01

* 解决链接转换问题 * 添加自定义请求头功能

2020.02.10

* 解决日志级别为NONE模式下无法合并文件的问题

2020.01.14

* 增加进度监听功能

2020.01.08

* 优化内存占用率

2019.12.24

* 进制转换问题

2019.12.23

* 文件路径优化 * 解决新合并的文件会把以前的删除的问题

2019.12.21

* 修复key获取错误 * 更新使用说明 * 解决内存占用过多 * 解决链接获取错误 * 增加IV向量偏移解密 * 解决合并文件后程序并没有退出

提示

如果遇到了问题,请发邮件至[email protected]

m3u8download's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

m3u8download's Issues

视频使用暴风影音也无法播放

image

我把如上那密钥的路径注释掉了,因为密钥获取失败,key不存在; 合出来的文件打不开,是因为密钥的问题吗,m3u8里的文件使用了AES-128对称加密算法。

地址:https://mv.aura-el.com/0434af755a444f738795823e1f61324d/NTdiMThhZWEtMmQ0OS00YmNmLThhYzktMjUwOWYwYzRhN2U1L2pqL2R5QU9CaFZCTmJnYjdsWjc4NnBneXZhZ29zbm5BQUFBQUFBQUFBQmVwdHcxWDVPQzVrK1NybHNaREdZSlJ0cVlMWE9XSStkYlRhRnl0NlFUSzV4b2tOQ2J4ZXh1

这是获取密钥的地址,我看原页面也没有访问这个地址,所以就注释掉了。

单例模式模式下,不同的下载链接只下载第一个链接

参考如下代码:
` downloadVideoButton.addActionListener(new ActionListener() {
@OverRide
public void actionPerformed(ActionEvent actionEvent) {

            int index = list.getSelectedIndex();
            String name = nameList.get(index);

            String html = "https://" + nameListURL.get(index);
            System.out.println(html);

            String html1 = GetContent.getHtml(html);

            String videoUrl = GetContent.getVideoUrl(html1);
            System.out.println(videoUrl);

            File file = new File(name);
            if (!file.exists()) {
                file.mkdir();
            }
            String filePath = file.getAbsolutePath();

            M3u8DownloadFactory.M3u8Download m3u8Download = M3u8DownloadFactory.getInstance(videoUrl);
            m3u8Download.setDir(filePath);
            m3u8Download.setFileName(name);
            m3u8Download.setThreadCount(100);
            m3u8Download.setRetryCount(20);
            m3u8Download.setTimeoutMillisecond(10000L);
            m3u8Download.setLogLevel(Constant.DEBUG);
            m3u8Download.setInterval(500L);
            m3u8Download.addListener(new DownloadListener() {
                @Override
                public void start() {
                    System.out.println("开始下载!");
                    progressBar.setValue(0);
                }

                @Override
                public void process(String downloadUrl, int finished, int sum, float percent) {
                    System.out.println("下载网址:" + downloadUrl + "\t已下载" + finished + "个\t一共" + sum + "个\t已完成" + percent + "%");
                    progressBar.setValue((int) percent);
                }

                @Override
                public void speed(String speedPerSecond) {
                    System.out.println("下载速度:" + speedPerSecond);
                }

                @Override
                public void end() {
                    System.out.println("下载完毕");
                    progressBar.setString("Video download completed!");
                }
            });
            m3u8Download.start();
        }
    });`

改变 list 的值,每次点击 downloadVideoButton 应该产生不同的 videoUrl , 但是每次下载都是第一个 videoUrl (软件不关闭情况下)。

后来看到了 工厂类的 getInstance() 方法:
public static M3u8Download getInstance(String downloadUrl) { if (m3u8Download == null) { synchronized (M3u8Download.class) { if (m3u8Download == null) m3u8Download = new M3u8Download(downloadUrl); } } return m3u8Download; }

当第二次点击 downloadVideoButton 时,m3u8Download 不为null 直接 return 了, 所以还是第一个的 videoUrl, 这就导致了每次下载只下载第一个链接。
建议不要把 downloadUrl 放在getInstance()参数里,增加 set get 方法。

How to use header?

How to download a video with request headers? Is there a way to headers for download request?

循环调用 线程出现问题

当我尝试循环调用的时候 出现了错误信息

下载网址:********* 已下载73个 一共34个 已完成214.71%

` public static void M3u8DownLoad(String m3U8URL,String path,String videoName){
M3u8DownloadFactory.M3u8Download m3u8Download = M3u8DownloadFactory.getInstance(m3U8URL);
//设置生成目录
m3u8Download.setDir(path);
//设置视频名称
m3u8Download.setFileName(videoName);
//设置线程数
m3u8Download.setThreadCount(100);
//设置重试次数
m3u8Download.setRetryCount(100);
//设置连接超时时间(单位:毫秒)
m3u8Download.setTimeoutMillisecond(10000L);
/*
设置日志级别
可选值:NONE INFO DEBUG ERROR
/
m3u8Download.setLogLevel(Constant.INFO);
//设置监听器间隔(单位:毫秒)
m3u8Download.setInterval(500L);
//添加额外请求头
/
Map<String, Object> headersMap = new HashMap<>();
headersMap.put("Content-Type", "text/html;charset=utf-8");
m3u8Download.addRequestHeaderMap(headersMap);*/
//添加监听器
m3u8Download.addListener(new DownloadListener() {
@OverRide
public void start() {
System.out.println("开始下载!");
}

        @Override
        public void process(String downloadUrl, int finished, int sum, float percent) {
            System.out.println("下载网址:" + downloadUrl + "\t已下载" + finished + "个\t一共" + sum + "个\t已完成" + percent + "%");
        }

        @Override
        public void speed(String speedPerSecond) {
            System.out.println("下载速度:" + speedPerSecond);
        }

        @Override
        public void end() {
            System.out.println("下载完毕");
        }
    });
    //开始下载
    m3u8Download.start();
}`

合并问题

你好 是否能加一个下载后不合并ts的方法呢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.