【B站API】视频二压与网页播放器API行为的联系
头图来源:pid 63756446 侵删
投稿视频未被B站二压和被二压似乎在网页api回复上好像有点不一样,看完这个可能是奇怪的知识增加了。本文做为B站api学习笔记。
感兴趣的就跟我体验发现规律验证规律的乐趣吧~~~

起因

之前写了篇调查B站新4K视频码率的文章CV5778825,起初只下载了AVC格式的原视频(通过手机缓存),后来发现B站是有HEVC格式的视频的(目前确定UWP客户端可以在线播放),奈何当时UWP有点bug下载403forbidden(此文写作时已修复但仍不能下载HEVC视频),虽然播放器能看码率,但我更相信下载后读取的MediaInfo的数值,所以就寻找其他下载方法,百度获悉you-get可以获取HEVC,起初版本没有更新4K支持,于是又学习了抓API获取下载链接的方法。
虽然最后我的目的通过将you-get更新到测试中的developer分支得到解决,但其间我用其下载我自己上传的视频BV1qt4y1y7EJ和BV1FK411j7A5,通过给you-get加入火狐的cookies已达到大会员身份使用“-i”指令获取不同画质的信息时,前面的视频只能获取到1080p非会员等级,而后一个却能获取到从“1080p60”开始的所有画质。之后通过“--debug”选项了解到you-get是通过解析api来获取下载链接的,这两个视频在请求api得到的回应肯定有不同,而作为上传者我自己很清楚两个视频的区别:前一个做了防二压上传前控制了码率,后一个是自己偷懒直传了高码率的视频被B站二压了。

于是有了接下来的探究。

抓取API发现端倪

抓取环境:Microsoft Edge Chromium Beta
首先看前一个视频BV1qt4y1y7EJ,F12开发者模式
切换至1080p60画质。
找到playerurl?cid=……这条网页播放器请求视频链接的记录。展开data->dash->video。可看到其中只有一条0号记录id116代表1080p60,其中有视频链接,视频长宽,编码格式级别。
(codec: "avc1.640032"代表AVC编码级别High@L5 32是50的十六进制,这个之后还有讨论先记住)

再看第二个BV1FK411j7A5
同样操作。

是不是video面多了好几个,每个对应的是每种画质的视频流信息内容与上面展开的大致一样。
再获取一下前一个的1080p画质的回复:

没有回复1080p60和720p60的视频流信息
再看720p60回复:

嗯,只有一个。
这是60帧视频,那非60帧1080p+非二压的视频呢?我也上传了范例。BV1Ap4y1y77p


好了,破案了,被二压的视频B站的api回复会把所有画质的视频流信息一起回复,没二压的api会在请求非大会员画质时回复所有非大会员画质视频流,大会员画质每个单独回复。
至于这个区别跟you-get无法下载我的非二压视频的60帧大会员画质有什么关系,我并不清楚,因为它请求时也请求api时也有qn=112(代表1080p+画质),可能与其他参数有关,不作继续讨论。

继续联想

还记得之前提到的视频流信息里的编码级别吗
(codec: "avc1.640032"代表AVC编码级别High@L5 32是50的十六进制)
这个我就很熟悉了,之前研究防B站二压中从@人在火星-刚下飞船 的专栏CV4461542,学到一个通过看“播放统计信息”快速判断视频是否二压的方法。

被二压的视频都是avc1.64001E与视频实际不匹配,实际api回复中1080p60的信息是:

avc1.64001E在哪儿呢?
这是360p的编码级别。

而360p是这些获取到的视频流信息的最后一个,所以猜测网页播放器的统计信息中的这段avc1.6400XX 是取自api回复的所有视频流信息的最后一个。
之前得出未被二压视频的大会员画质的api回复只会回复当前的视频流信息,那么1080p60的统计信息就会是实际的值。720p60画质即使是被二压后的视频应该也会显示实际值。
那么来验证一下。还是我的未被二压视频(BV1qt4y1y7EJ)


看来猜测可以得到验证了。
网页播放器为什么会错误显示编码等级信息,这我就不知道了,只是得出一个规律。

结

感觉好像到头来是没用的知识+1哈。
仅供学习参考用。
api中qn(video id)值对应画质:
4K 120
1080p60 116
1080p+ 112
720p60 74
1080p 80
720p 64
480p 32
360p 16
——ZHY

引用

判断二压方法来源:

备注:以上的api仅在具有大会员画质的视频中触发,且只发生于大会员画质间切换,大会员画质与非大会员画质之间切换,非大会员画质间切换不会触发。没有大会员画质的视频浏览器没有抓取到不代表没有这个请求,仍可以通过在https://api.bilibili.com/x/player/playurl?后手动输入bid、cid、qn等参数获取到响应的回复。

