Java下载m3u8视频(含png、加密ts格式解决)

本文介绍了如何使用Java下载包含png和加密ts格式的m3u8视频,包括基本思路、核心代码展示,以及后续的优化计划,涉及到字符串处理、文件操作、多线程和解密技术。
摘要由CSDN通过智能技术生成

Java下载m3u8视频(含png、加密ts格式解决)

一 基本思路

  1. 获取到M3u8文件地址(懒了,通过浏览器插件获取)
  2. 下载分文件 下载后进行解密,判断是否PNG文件,处理转化成未解密的正常分文件
  3. 合并文件成最终视频格式

二 代码 (主要练习使用字符串截取、文件读写操作、多线程使用、解密知识)

重点是下载及解密

import org.apache.commons.lang3.StringUtils;
import org.apache.http.*;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 下载网络文件至本地
 */
public class HttpDownloadM3u8Util {
   

    public static final int cache = 10 * 1024;

    public static void main(String[] args) throws IOException {
   
        //String url = "https://sod.bunediy.com/20211206/SjSBLHRO/index.m3u8"; //测试m3u8文件地址 png 仅测试用
        String url = "https://iqiyi.sd-play.com/20220105/8egXXuSW/1200kb/hls/index.m3u8"; //测试 m3u8文件地址 加密 仅测试用
        String targetUrl = "F:\\1\\";//下载文件目录
         //偶遇到M3U8下载出错的情况下,可以使用手动下载的M3U8文件处理
        String backupM3u8 = "F:\\1\\index (4).png";//手动下载的M3U8文件,不要与下载的无效M3U8文件文件重名,随便命名
       
        String allFileName = "2.mp4"; //合并后的文件名
        String lastFileName = targetUrl + allFileName;
        int threamNum = 10;             //开启的下载线程数
        CountDownLatch countDownLatch = new CountDownLatch(threamNum); //线程完成计数器
        byte[] bytesKey = new byte[0];   //key
        String m3u8Name = HttpDownloadM3u8Util.download(url, targetUrl, bytesKey);
        ArrayList<String> fileListUrl = readFileByLineForM3u8(targetUrl + m3u8Name);

        //获取分文件列表
        if (fileListUrl.isEmpty()) {
   
            System.out.println("尝试读取手动下载的M3U8文件 : " + backupM3u8);
            fileListUrl = readFileByLineForM3u8(backupM3u8);
            if (fileListUrl.isEmpty()) {
   
                System.out.println("文件列表为空,请检查M38u文件是否正确,或手动下载MU8文件");
                return;
            }

        }
        int size = fileListUrl.size();

        if (size > 1) {
   
            if (fileListUrl.get(0).endsWith(".key")) {
         //判断是否存在key
                String keyName = HttpDownloadM3u8Util.download(fileListUrl.get(0), targetUrl, bytesKey);
                String keyNameDiskUrl = targetUrl + keyName;

                InputStream is = new FileInputStream(keyNameDiskUrl);
                int iAvail = is.available();
                bytesKey = new byte[iAvail];
                System.out.println(bytesKey.length);
                is.read(bytesKey);                          //获取key字节数组
                is.close();
                fileListUrl.remove(0);
            }
        }


        System.out.println("共有分片 " + (++size));
        ArrayList<String> fileList = new ArrayList<>(); //读取分文件列表
        for (String fileNameUrl : fileListUrl) {
   
            fileList.add(fileNameUrl.substring(fileNameUrl.lastIndexOf("/") + 1));
        }


        //单线程下载分文件
//        for (String fileNameUrl : fileListUrl) {
   
//
//           HttpDownloadUtil.download(fileNameUrl, targetUrl, bytesKey);
//            size = size - 1;
//            System.out.println("还剩 " + size + "个");
//        }
        //多线程下载分文件
        System.out.println("开启多线程下载 !");
        DownFileForM3u8 test = new DownFileForM3u8();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值