本文使用的工具有vlc+ffmpeg+phantomjs
一般视频网站的视频地址暴露的方式有两种:
1、html直接暴露
2、通过ajax异步返回。
A站使用的方式是第二种。针对第一种方式,直接使用jsoup就可以解析出视频地址,但是大部分网站都不会采取这种方式,而是选择第二种。
进入浏览器按下f12(这里我使用firefox)
可以看到,传输的ts分片。这些分片是一块块小视频,大概只有几秒左右,但是这些视频能够拼接成一个完整的视频地址。而这些视频地址的地址其实被存放在一个m3u8的文件中,但通过浏览器没办法直接看到m3u8文件,因此这里使用phantomjs。
这是一款没有界面的模拟浏览器,可以模拟浏览器获取ajax请求,通过分析,可以看到返回结果中有m3u8文件。
因此,我们可以拿到m3u8文件,然后使用vlc就可以进行播放,也可以使用ffmpeg将m3u8文件转换成mp4文件。
播放器效果如上。
ffmpeg合并m3u8文件命令为
String exec = rootPath + "/ffmpeg.exe -i \"" + url + "\" -vcodec copy -acodec copy -absf aac_adtstoasc " + output;
这两款软件我都是使用java代码调用exe执行的。
phantomjs核心代码如下:
//phantomjs模拟请求
public List<String> getVideoUrls(String url) {
List<String> ans = new ArrayList<String>();
System.out.println("==============================开始解析网页==============================");
try {
Runtime rt = Runtime.getRuntime();
String exec = rootPath + "/phantomjs.exe " + rootPath + "/code.js " + url;
Process p = rt.exec(exec);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
String urls = sbf.substring(sbf.indexOf("cdnUrls"));
urls = urls.substring(0,urls.indexOf("playUrls"));
urls = urls.substring(urls.indexOf("[")+1,urls.lastIndexOf("]"));
String[] paths = urls.split(",");
for (String path : paths) {
if(path.contains("url")){
ans.add(path.substring(path.indexOf(":")+2,path.length()-1));
}
}
System.out.println("==============================结束解析网页==============================");
System.out.println("播放地址为:");
for (String an : ans) {
System.out.println(an);
}
}catch (Exception e){
System.out.println("ERROR!"+e);
}
return ans;
}
这里,还需要配置一个js代码
system = require('system')
address = system.args[1];
var page = require('webpage').create();
page.settings.userAgent= 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR2.0.50727)';
var url = address;
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('Unable to post!');
} else {
window.setTimeout(function () {
page.render("test1.png");
console.log(page.content);
phantom.exit();
}, 5000);
}
});
写文章不容易,转载请注明出处,git源码:https://github.com/GethinWang/VideoCrawler ,觉得好给个star吧~