解析网页m3u8文件地址

Posted xybz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析网页m3u8文件地址相关的知识,希望对你有一定的参考价值。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class text{    
static String 二级m3u8地址;
static String 解析的url文件地址;
public static String getIndexFile(String urlpath){
    try{
        URL url = new URL(urlpath);
        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;
    }catch (Exception e){
        e.printStackTrace();
    }
    return null;
    }
public static List analysisIndex(String content){
    String prePath = 二级m3u8地址.substring(0,二级m3u8地址.lastIndexOf("/")+1);
    Pattern pattern = Pattern.compile(".*ts");
    Matcher ma = pattern.matcher(content);

    List<String> list = new ArrayList<String>();
    FileOutputStream fs;
    try {
        fs = new FileOutputStream(new File(解析的url文件地址));
        PrintStream p = new PrintStream(fs);
        while(ma.find()){
            String latePath = ma.group();
            list.add(latePath);
            p.println(prePath+latePath);
            System.out.println(prePath+latePath);
        }
        p.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return list;
    }

public static void openXunlei(){
    final Runtime runtime = Runtime.getRuntime();  
    Process process = null;
    final String cmd = "rundll32 url.dll FileProtocolHandler "+解析的url文件地址;//要打开的文件路径。
    try {  
        process = runtime.exec(cmd);  
    } catch (final Exception e) {  
        System.out.println("Error exec!");  
    } 
    }
}

class Main{
    public static void main(String[] args){
        String urlPath = "https://kbzy.zxziyuan-yun.com/ppvod/3DAFCB3DCFC52A80A5BBD7C57FC28907.m3u8";
        text.二级m3u8地址=urlPath;
        text.解析的url文件地址="C:\\Users\\xianyu\\Desktop\\temp.downlist";
        //改成下载器相应的格式就能直接打开下载页面
        String indexStr = text.getIndexFile(urlPath);
        text.analysisIndex(indexStr);
        text.openXunlei();
    }
}

getIndexFile类用来下载网页视频m3u8文件
analysisIndex类用来解析m3u8文件,改写成url的形式

openXunlei类是根据解析好的url地址打开迅雷下载

前两个类没什么好说的,第三个类实现原理是把analysisIndex类生成的url存成文本,直接命名为.downlist文件。
.downlist是迅雷存下载地址的文件,存好后用runtime调cmd,直接打开这个文件,就能进下载页面了。
所以,没有安装迅雷,第三不就不会执行,不过程序还是能生成一个解析好的url文件的。按需要改相应的参数。
主类中
urlPath是二级m3u8文件,注意,一级m3u8文件是不行的,因为一级里面是一些适配码率的代码,没有真正的视频地址文件。

text.解析的url文件地址是m3u8文件解析好的url地址文件,按那个地址下就行了
另外,上面代码也有一些问题,下载下来的视频全部都是.ts切片文件,下载后需要把他们合成一个整视频
我一般用cmd合成
copy /b 要合成的.ts文件路径\*.ts 生成文件路径\new.mp4
*是通配符,具体参见百度
还有一个问题,就是代码会在生成url的时候还会在控制台输出,而一旦输出过多,前面一部分就会丢失,所以不要用控制台生成的地址去下载
靠谱的还是去生成文件里面去找,因为那样不会溢出。
现在遇到的问题是有的视频很长切片太多,而我的迅雷一次最多添加1000个链接,我的想法是每生成1000个url后就重新生成一个文件,然后分开下载。
还有一个待解决的问题,就是有些网站会对他的地址进行AES加密,
表示暂时看见了没办法。
实现好了随缘跟新吧。
 
 

以上是关于解析网页m3u8文件地址的主要内容,如果未能解决你的问题,请参考以下文章

edge浏览器怎么下载m3u8

m3u8文件格式讲解,Python解析m3u8文件,并获取在线地址

m3u8文件格式讲解,Python解析m3u8文件,并获取在线地址

学Python爬虫,不看看m3u8文件如何加密?i春秋 m3u8 文件加密解析

学Python爬虫,不看看m3u8文件如何加密?i春秋 m3u8 文件加密解析

m3u8解析转码下载合并