使用java线程池批量下载m3u8合并mp4.
看了线程池的demo,然后就想下载文件试试。
代码未必规范,多多建议。
大家可以自行修改,满足自己的需求。
还需要深入学习一下线程池。
给俺个星星⭐,可好 = =
m3u8 链接下载
下载m3u8文件,找到内部的链接
下载内部的m3u8,提取所有的ts链接
线程池批量下载。
当前针对于 ok、zuida 资源 进行下载测试。
运行步骤:
将ffmpeg 和 当前代码放在同一目录
更换M3U8_URL的地址(下载啥就放啥)
文件路径
然后直接运行就ok 了。
M3u8Download.java
package cn.lacknb.test.threaddownload;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.*;
/**
* @description: 下载 ok 资源网、最大资源网的 m3u8连接
* home.php?mod=space&uid=686208 gitsilence
* home.php?mod=space&uid=1248337 1.0
* home.php?mod=space&uid=686237 2020/12/11 14:59
*/
public class M3u8Download {
/*
* m3u8地址
* */
private static final String M3U8_URL = "https://yuledy.helanzuida.com/20201204/15904_c1fcf83a/index.m3u8";
/*
* 视频的下载路径
* */
public static final String DOWNLOAD_PATH = "G:\\work\\video\\";
/*
* m3u8文件的路径
* */
private static final String FILE_PATH = DOWNLOAD_PATH + "tmp.m3u8";
/*
* 临时文件的文件名
* */
private static final String TMP_NAME = "tmp.txt";
public static void main(String[] args) {
try {
// 创建父级文件夹
createParentDirs();
// 下载外层m3u8 url
downloadFile(M3U8_URL);
String content = readFile(FILE_PATH);
System.out.println(content);
String realUrl = M3U8_URL.split("index")[0] + content;
System.out.println("realUrl: " + realUrl);
// 下载内层m3u8 url
downloadFile(realUrl);
content = readFile(FILE_PATH);
// 获取所有的ts, 并合并 url
List urls = mergeUrl(content, realUrl);
// 生成tmp.txt, 用于合并视频
createMergeVideoTmp(content);
// urls.forEach(System.out::println);
ExecutorService executorService = Executors.newFixedThreadPool(12);
urls.forEach( url -> {
executorService.execute(new TsDownload(url));
});
// // 关闭线程池,等待任务结束。
executorService.shutdown();
while (!executorService.isTerminated()) {
System.out.println("任务下载中");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 任务下载完毕后
mergeVideo(content, UUID.randomUUID().toString());
// 删除ts文件
deleteTsFile(content);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* corePoolSize:核心池的大小;当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中 =10
* maximumPoolSize:线程池最大线程数 &#