Java 下載 HLS (m3u8) 視頻


下載索引文件

public String getIndexFile() throws Exception{
	URL url = new URL(originUrlpath);
	//下載資源
	BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));

	String content = "" ;
	String line;
	while ((line = in.readLine()) != null) {
		content += line + "\n";
	}
	in.close();

	return content;
}

解析索引文件

public List analysisIndex(String content) throws Exception{
	Pattern pattern = Pattern.compile(".*ts");
	Matcher ma = pattern.matcher(content);

	List<String> list = new ArrayList<String>();

	while(ma.find()){
		list.add(ma.group());
	}

	return list;
}

下載視頻片段

同步下載

public HashMap downLoadIndexFile(List<String> urlList){
	HashMap<Integer,String> keyFileMap = new HashMap<>();

	for(int i =0;i<urlList.size();i++){
		String subUrlPath = urlList.get(i);
		String fileOutPath = folderPath + File.separator + i + ".ts";
		keyFileMap.put(i, fileOutPath);
		try{
			downloadNet(preUrlPath + subUrlPath, fileOutPath);

			System.out.println("成功:"+ (i + 1) +"/" + urlList.size());
		}catch (Exception e){
			System.err.println("失敗:"+ (i + 1) +"/" + urlList.size());
		}
	}

	return  keyFileMap;
}

private void downloadNet(String fullUrlPath, String fileOutPath) throws Exception {

	//int bytesum = 0;
	int byteread = 0;

	URL url = new URL(fullUrlPath);
	URLConnection conn = url.openConnection();
	InputStream inStream = conn.getInputStream();
	FileOutputStream fs = new FileOutputStream(fileOutPath);

	byte[] buffer = new byte[1204];
	while ((byteread = inStream.read(buffer)) != -1) {
		//bytesum += byteread;
		fs.write(buffer, 0, byteread);
	}
}

多線程下載

public void downLoadIndexFileAsync(List<String> urlList, HashMap<Integer,String> keyFileMap) throws Exception{
	int downloadForEveryThread = (urlList.size() + threadQuantity - 1)/threadQuantity;
	if(downloadForEveryThread == 0) downloadForEveryThread = urlList.size();

	for(int i=0; i<urlList.size();i+=downloadForEveryThread){
		int startIndex = i;
		int endIndex = i + downloadForEveryThread - 1;
		if(endIndex >= urlList.size())
			endIndex = urlList.size() - 1;

		new DownloadThread(urlList, startIndex, endIndex, keyFileMap).start();
	}
}

class DownloadThread extends Thread{
	private List<String> urlList;
	private int startIndex;
	private int endIndex;
	private HashMap<Integer,String> keyFileMap;

	public DownloadThread(List<String> urlList, int startIndex, int endIndex, HashMap<Integer,String> keyFileMap){
		this.urlList = urlList;
		this.startIndex = startIndex;
		this.endIndex = endIndex;
		this.keyFileMap = keyFileMap;
	}
	@Override
	public void run(){
		for(int i=startIndex;i<=endIndex;i++){
			String subUrlPath = urlList.get(i);
			String fileOutPath = folderPath + File.separator + i + ".ts";
			keyFileMap.put(i, fileOutPath);
			String message = "%s: 線程 " + (startIndex/(endIndex - startIndex) + 1)
					+ ", "+ (i + 1) +"/" + urlList.size() +", 合計: %d";
			try{
				downloadNet(preUrlPath + subUrlPath, fileOutPath);

				System.out.println(String.format(message, "成功", keyFileMap.size()));
			}catch (Exception e){
				System.err.println(String.format(message, "失敗", keyFileMap.size()));
			}
		}
	}
}

視頻片段合成

public String composeFile(HashMap<Integer,String> keyFileMap) throws Exception{

	if(keyFileMap.isEmpty()) return null;

	String fileOutPath = rootPath + File.separator + fileName;
	FileOutputStream fileOutputStream = new FileOutputStream(new File(fileOutPath));
	byte[] bytes = new byte[1024];
	int length = 0;
	for(int i=0; i<keyFileMap.size(); i++){
		String nodePath = keyFileMap.get(i);
		File file = new File(nodePath);
		if(!file.exists())  continue;

		FileInputStream fis = new FileInputStream(file);
		while ((length = fis.read(bytes)) != -1) {
			fileOutputStream.write(bytes, 0, length);
		}
	}

	return fileName;
}

開源地址:hlsdownloader

參考:M3U8在線視頻文件下載合成MP4視頻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM