码迷,mamicode.com
首页 > Web开发 > 详细

解析网页m3u8文件地址

时间:2019-05-11 09:20:22      阅读:727      评论:0      收藏:0      [点我收藏+]

标签:compile   .com   red   roc   copy   out   .net   rac   添加   

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文件地址

标签:compile   .com   red   roc   copy   out   .net   rac   添加   

原文地址:https://www.cnblogs.com/xybz/p/10847566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!