【B站API】視頻二壓與網(wǎng)頁(yè)播放器API行為的聯(lián)系

頭圖來源:pid?63756446?侵刪
投稿視頻未被B站二壓和被二壓似乎在網(wǎng)頁(yè)api回復(fù)上好像有點(diǎn)不一樣,看完這個(gè)可能是奇怪的知識(shí)增加了。本文做為B站api學(xué)習(xí)筆記。
感興趣的就跟我體驗(yàn)發(fā)現(xiàn)規(guī)律驗(yàn)證規(guī)律的樂趣吧~~~

起因

之前寫了篇調(diào)查B站新4K視頻碼率的文章CV5778825,起初只下載了AVC格式的原視頻(通過手機(jī)緩存),后來發(fā)現(xiàn)B站是有HEVC格式的視頻的(目前確定UWP客戶端可以在線播放),奈何當(dāng)時(shí)UWP有點(diǎn)bug下載403forbidden(此文寫作時(shí)已修復(fù)但仍不能下載HEVC視頻),雖然播放器能看碼率,但我更相信下載后讀取的MediaInfo的數(shù)值,所以就尋找其他下載方法,百度獲悉you-get可以獲取HEVC,起初版本沒有更新4K支持,于是又學(xué)習(xí)了抓API獲取下載鏈接的方法。
雖然最后我的目的通過將you-get更新到測(cè)試中的developer分支得到解決,但其間我用其下載我自己上傳的視頻BV1qt4y1y7EJ和BV1FK411j7A5,通過給you-get加入火狐的cookies已達(dá)到大會(huì)員身份使用“-i”指令獲取不同畫質(zhì)的信息時(shí),前面的視頻只能獲取到1080p非會(huì)員等級(jí),而后一個(gè)卻能獲取到從“1080p60”開始的所有畫質(zhì)。之后通過“--debug”選項(xiàng)了解到y(tǒng)ou-get是通過解析api來獲取下載鏈接的,這兩個(gè)視頻在請(qǐng)求api得到的回應(yīng)肯定有不同,而作為上傳者我自己很清楚兩個(gè)視頻的區(qū)別:前一個(gè)做了防二壓上傳前控制了碼率,后一個(gè)是自己偷懶直傳了高碼率的視頻被B站二壓了。

于是有了接下來的探究。

抓取API發(fā)現(xiàn)端倪

抓取環(huán)境:Microsoft?Edge?Chromium?Beta
首先看前一個(gè)視頻BV1qt4y1y7EJ,F(xiàn)12開發(fā)者模式
切換至1080p60畫質(zhì)。
找到playerurl?cid=……這條網(wǎng)頁(yè)播放器請(qǐng)求視頻鏈接的記錄。展開data->dash->video??煽吹狡渲兄挥幸粭l0號(hào)記錄id116代表1080p60,其中有視頻鏈接,視頻長(zhǎng)寬,編碼格式級(jí)別。
(codec: "avc1.640032"代表AVC編碼級(jí)別High@L5 32是50的十六進(jìn)制,這個(gè)之后還有討論先記?。?/p>
再看第二個(gè)BV1FK411j7A5
同樣操作。

是不是video面多了好幾個(gè),每個(gè)對(duì)應(yīng)的是每種畫質(zhì)的視頻流信息內(nèi)容與上面展開的大致一樣。
再獲取一下前一個(gè)的1080p畫質(zhì)的回復(fù):

沒有回復(fù)1080p60和720p60的視頻流信息
再看720p60回復(fù):

嗯,只有一個(gè)。
這是60幀視頻,那非60幀1080p+非二壓的視頻呢?我也上傳了范例。BV1Ap4y1y77p


好了,破案了,被二壓的視頻B站的api回復(fù)會(huì)把所有畫質(zhì)的視頻流信息一起回復(fù),沒二壓的api會(huì)在請(qǐng)求非大會(huì)員畫質(zhì)時(shí)回復(fù)所有非大會(huì)員畫質(zhì)視頻流,大會(huì)員畫質(zhì)每個(gè)單獨(dú)回復(fù)。
至于這個(gè)區(qū)別跟you-get無法下載我的非二壓視頻的60幀大會(huì)員畫質(zhì)有什么關(guān)系,我并不清楚,因?yàn)樗?qǐng)求時(shí)也請(qǐng)求api時(shí)也有qn=112(代表1080p+畫質(zhì)),可能與其他參數(shù)有關(guān),不作繼續(xù)討論。

繼續(xù)聯(lián)想

還記得之前提到的視頻流信息里的編碼級(jí)別嗎?
(codec: "avc1.640032"代表AVC編碼級(jí)別High@L5 32是50的十六進(jìn)制)
這個(gè)我就很熟悉了,之前研究防B站二壓中從@人在火星-剛下飛船?的專欄CV4461542,學(xué)到一個(gè)通過看“播放統(tǒng)計(jì)信息”快速判斷視頻是否二壓的方法。

被二壓的視頻都是avc1.64001E與視頻實(shí)際不匹配,實(shí)際api回復(fù)中1080p60的信息是:

avc1.64001E在哪兒呢?
這是360p的編碼級(jí)別。

而360p是這些獲取到的視頻流信息的最后一個(gè),所以猜測(cè)網(wǎng)頁(yè)播放器的統(tǒng)計(jì)信息中的這段avc1.6400XX?是取自api回復(fù)的所有視頻流信息的最后一個(gè)。
之前得出未被二壓視頻的大會(huì)員畫質(zhì)的api回復(fù)只會(huì)回復(fù)當(dāng)前的視頻流信息,那么1080p60的統(tǒng)計(jì)信息就會(huì)是實(shí)際的值。720p60畫質(zhì)即使是被二壓后的視頻應(yīng)該也會(huì)顯示實(shí)際值。
那么來驗(yàn)證一下。還是我的未被二壓視頻(BV1qt4y1y7EJ)


看來猜測(cè)可以得到驗(yàn)證了。
網(wǎng)頁(yè)播放器為什么會(huì)錯(cuò)誤顯示編碼等級(jí)信息,這我就不知道了,只是得出一個(gè)規(guī)律。

結(jié)

感覺好像到頭來是沒用的知識(shí)+1哈。
僅供學(xué)習(xí)參考用。
api中qn(video?id)值對(duì)應(yīng)畫質(zhì):
4K????????????? 120
1080p60????116
1080p+????? 112
720p60????? ?74
1080p???????? 80
720p????????? ?64
480p????????? ?32
360p????????? ?16
——ZHY

引用

判斷二壓方法來源:

備注:以上的api僅在具有大會(huì)員畫質(zhì)的視頻中觸發(fā),且只發(fā)生于大會(huì)員畫質(zhì)間切換,大會(huì)員畫質(zhì)與非大會(huì)員畫質(zhì)之間切換,非大會(huì)員畫質(zhì)間切換不會(huì)觸發(fā)。沒有大會(huì)員畫質(zhì)的視頻瀏覽器沒有抓取到不代表沒有這個(gè)請(qǐng)求,仍可以通過在https://api.bilibili.com/x/player/playurl?后手動(dòng)輸入bid、cid、qn等參數(shù)獲取到響應(yīng)的回復(fù)。