bilibili(嗶哩嗶哩) 视频源地址获取原理及源码 续

本文距发布已经过去多年, 故不再更新正文.

这是bilibili(嗶哩嗶哩) 视频源地址获取原理及源码的续文,上篇文章中获取的视频大多为hlv格式,对于某些情况来说是不太实用的.

所以这篇文章就从另外一个角度入手,获取视频的源地址,最终得到的是mp4格式的视频.

简单粗暴的原理

首先要明白一个概念,视频网站为了照顾iOS系统的用户,不得不使用HTML5的video标签来完成播放视频的重任.

所以像sina啊,youku啊这些视频网站,都有相应的HTML5版本.

然而HTML5的video标签受到例如版权,协议等等限制,只能使用mp4格式的视频(浏览器大多数支持,兼容方便).

正因如此,我们可以直接从B站为iOS用户准备的页面中得到视频的源地址.

方法依然是抓包,监视network.

比如http://www.bilibili.tv/video/av383069/这个视频,修改浏览器UA为iOS之后进入就会显示相应的HTML5页面.

有这样一条XHR:

Request URL:http://www.bilibili.tv/m/html5?aid=383069&page=1  
Request Method:GET  
Status Code:200 OK  

直接在浏览器里打开http://www.bilibili.tv/m/html5?aid=383069&page=1,返回以下内容:

{"cid":"http://comment.bilibili.tv/588745.xml","src":"http://v.iask.com/v_play_ipad.php?vid=88724755"}

其中src便是我们需要的视频源地址.

那么接下来就是code时间了.

代码示例

var http = require('http'),  
    url = require('url');

function getMp4(pageUrl, cb) {  
    var id = /av(\d+)/.exec(pageUrl)[1];
    var options = url.parse('http://www.bilibili.tv/m/html5?aid=' + id);
    http.get(options, function(res) {
        res.setEncoding('utf8');

        var json_string = '';

        res.on('data', function(data) {
            json_string += data;
        });

        res.on('end', function() {
            cb(JSON.parse(json_string).src);
        });

        res.on('error', function(err) {
            cb(err);
        });

    });
}

getMp4('http://www.bilibili.tv/video/av385750/', function(result) {  
    console.log(result);
});

主要缺陷

低质量,没错,质量非常低.

av383069这个视频的hlv文件有44.51MB,而mp4文件只有8.38mp4,播放时视频的分辨率缩水了不止2倍.

这与HTML5标准未推广以及相应设备未能跟进有关,所以暂时只能获取到低质量的视频,高质量不但要求客户端的解码能力,还要求视频网站的带宽支持.

博主目前还不知道sina,youku是否有分段的高清mp4.