XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/bilibili-API-collect

增加了关于番剧播放&下载地址(视频流)的文档 (#402)

* 增加了关于番剧视频url的文档 * 在readme.md中增加相应的链接

8fb57b4
Rerange <78526012+Quandong-Zhang@users.noreply.github.com>
提交于

代码差异

2 个文件 +331 -0
Modified README.md +1 -0
@@ -86,6 +86,7 @@ PS:所有 rest api 均可使用 https,文档中为了统一写作`http`,
86 86 - [x] [视频在线人数](video/online.md)
87 87 - [ ] [剧集(番剧、影视)](bangumi)
88 88 - [ ] [基本信息](bangumi/info.md)
89 - [ ] [播放&下载地址(视频流)](bangumi/videostream_url.md)
89 90 - [ ] [时间轴](bangumi/timeline.md)
90 91 - [ ] 状态数
91 92 - [ ] 操作
Added bangumi/videostream_url.md +330 -0
@@ -0,0 +1,330 @@
1 # 视频流URL
2
3 <img src="/imgs/download.svg" width="100" height="100"/>
4
5 B站的番剧视频为http流媒体,需要对应的api以视频id获取取流url,并进行取流
6
7 - [qn视频清晰度标识](#qn视频清晰度标识)
8 - [fnver视频流版本标识](#fnver视频流版本标识)
9 - [fnval视频流格式标识](#fnval视频流格式标识)
10 - [视频伴音音质代码](#视频伴音音质代码)
11 - [获取番剧视频流URL](#获取番剧视频流URL)
12 - [视频的取流(web端及APP端)](#视频的取流(web端及APP端))
13
14 ---
15
16 ## qn视频清晰度标识
17
18 **注:该值在dash模式且非下载模式时无效**
19
20 | 值 | 含义 | 备注 |
21 | ---- | -------------- | ------------------------------------------------------------ |
22 | 6 | 240P 极速 | 仅mp4方式支持 |
23 | 16 | 360P 流畅 | |
24 | 32 | 480P 清晰 | |
25 | 64 | 720P 高清 | web端默认值<br />B站前端需要登录才能选择,但是直接发送请求可以不登录就拿到720P的取流地址<br />**无720P时则为720P60** |
26 | 74 | 720P60 高帧率 | 需要认证登录账号 |
27 | 80 | 1080P 高清 | TV端与APP端默认值<br />需要认证登录账号 |
28 | 112 | 1080P+ 高码率 | 大多情况需求认证大会员账号 |
29 | 116 | 1080P60 高帧率 | 大多情况需求认证大会员账号 |
30 | 120 | 4K 超清 | 需要`fnver&128=128`且`fourk=1`<br />大多情况需求认证大会员账号 |
31 | 125 | HDR 真彩色 | 仅支持dash方式<br />需要`fnver&64=64`<br />大多情况需求认证大会员账号 |
32 | 126 | 杜比视界 | 仅支持dash方式<br />需要`fnver&512=512`<br />大多情况需求认证大会员账号 |
33 | 127 | 8K 超高清 | 仅支持dash方式<br />需要`fnver&1024=1024`<br />大多情况需求认证大会员账号 |
34
35 例如:请求1080P+的视频,则`qn=112`
36
37 ## fnver视频流版本标识
38
39 目前该值恒为0,即`fnver=0`
40
41 ## fnval视频流格式标识
42
43 该代码为二进制属性位,如需组合功能需要使用`OR`运算结合一下数值
44
45 | 值 | 含义 | 备注 |
46 | ---- | ------------------ | ------------------------------------------------------------ |
47 | 0 | flv格式 | 仅H.264编码<br />部分老视频存在分段现象<br />与mp4格式及dash格式互斥 |
48 | 1 | mp4格式 | 仅H.264编码<br />不存在视频分段<br />与flv格式及dash格式互斥 |
49 | 16 | dash格式 | H.264编码或H.265编码<br />部分老视频的清晰度上限低于flv格式<br />与mp4格式及flv格式互斥 |
50 | 64 | 是否需求 HDR 视频 | 必须为dash格式<br />需要`qn=125`<br />大多情况需求认证大会员账号 |
51 | 128 | 是否需求 4K 分辨率 | 该值与`fourk`字段协同作用<br />需要`qn=120`<br />大多情况需求认证大会员账号 |
52 | 256 | 是否需求杜比音频 | 必须为dash格式<br />大多情况需求认证大会员账号 |
53 | 512 | 是否需求杜比视界 | 必须为dash格式<br />大多情况需求认证大会员账号 |
54 | 1024 | 是否需求 8K 分辨率 | 必须为dash格式<br />需要`qn=127`<br />大多情况需求认证大会员账号 |
55 | 2048 | 是否需求 av1 编码 | 必须为dash格式 |
56
57 例如:请求dash格式且需要HDR的视频流,则`fnval=16|64=80`
58
59 ## 视频伴音音质代码
60
61 | 值 | 含义 |
62 | ----- | ---- |
63 | 30216 | 64K |
64 | 30232 | 132K |
65 | 30280 | 192K |
66
67 ## 获取番剧视频流URL
68
69 > https://api.bilibili.com/pgc/player/web/playurl
70
71 *请求方式:GET*
72
73 认证方式:Cookie(SESSDATA)
74
75 ---
76
77 关于视频流会员鉴权:
78
79 - 获取480P及以上清晰度视频时需要登录(Cookie)
80
81 - 获取高帧率(1080P60)/高码率(1080P+)视频时需要有大会员的账号登录(Cookie)
82
83 - 获取会员专属番剧视频时需要登录(Cookie)
84
85 ---
86
87 获取的url有效时间为120min,超时失效需要重新获取
88
89 **部分视频**会有**分段**,需要特别注意
90
91 若视频有分P,仅为单P的视频的url,换P则需更换cid重新获取
92
93 **url参数:**
94
95 | 参数名 | 类型 | 内容 | 必要性 | 备注 |
96 | ------ | ---- | ---------------- | ------------ | ------------------------------------------------------------ |
97 | avid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 |
98 | bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 |
99 | epid | str | | 稿件epid | 必要 |
100 | cid | num | 视频cid | 必要 | |
101 | qn | num | 视频清晰度选择 | 非必要 | 未登录默认32(480P)<br />登录默认64(720P)<br />**值含义见上表**<br />注:dash方式无效 |
102 | fnval | num | 视频获取方式选择 | 非必要 | 默认为0<br />0 2:flv方式(可能会有分段)<br />1:低清mp4方式(仅240P与360P,且限速65K/s)<br />16 80:dash方式(音视频分流,支持H.265) |
103 | fnver | num | 0 | 非必要 | 固定为0 |
104 | fourk | num | 是否允许4K视频 | 非必要 | 默认为0<br />画质最高1080P:0<br />画质最高4K:1 |
105 | session | str | | 非必要 | 从视频播放页的网页源码中获取 |
106
107
108
109 **json回复:**
110
111 根对象:
112
113 | 字段 | 类型 | 内容 | 备注 |
114 | ------- | ----------------------------- | -------- | ---------------------------------------------- |
115 | code | num | 返回值 | 0:成功 <br />-400:请求错误<br />-404:无视频 |
116 | message | str | 错误信息 | 成功为success |
117 | result | 有效时:obj<br />无效时:null | 数据本体 | |
118
119 `result`对象:
120
121 | 字段 | 类型 | 内容 | 备注 |
122 | ------------------ | ------ | ------------------------ | ---------------------------------------- |
123 | from | str | local | 作用尚不明确 |
124 | result | str | suee | 作用尚不明确 |
125 | message | str | 空 | 作用尚不明确 |
126 | quality | num | 当前的视频分辨率代码 | **值含义见上表** |
127 | format | str | 视频格式 | |
128 | timelength | num | 视频长度 | 单位为毫秒<br />不同分辨率/格式可能有略微差异 |
129 | accept_format | str | 视频支持的全部格式 | 每项用`,`分隔 |
130 | accept_description | array | 视频支持的分辨率列表 | |
131 | accept_quality | array | 视频支持的分辨率代码列表 | **值含义见上表** |
132 | video_codecid | num | 固定值:7 | 作用尚不明确 |
133 | seek_param | str | 固定值:start | 作用尚不明确 |
134 | seek_type | str | 固定值:offset | 作用尚不明确 |
135 | durl | array | 视频分段 | **注:仅flv/mp4存在此项** |
136 | dash | obj | dash音视频流信息 | **注:仅dash存在此项** |
137 | support_formats | array | 支持格式的详细信息 | |
138
139 `result`中的`accept_description`数组:
140
141 | 项 | 类型 | 内容 | 备注 |
142 | ---- | ---- | --------------- | ---- |
143 | 0 | str | 分辨率名称1 | |
144 | n | str | 分辨率名称(n+1) | |
145 | …… | str | …… | |
146
147 `result`中的`accept_quality`数组:
148
149 | 项 | 类型 | 内容 | 备注 |
150 | ---- | ---- | --------------- | ---- |
151 | 0 | str | 分辨率代码1 | |
152 | n | str | 分辨率代码(n+1) | |
153 | …… | str | …… | |
154
155 `result`中的`support_formats`数组:
156
157 | 项 | 类型 | 内容 | 备注 |
158 | ---- | ---- | --------------- | ---- |
159 | 0 | obj | 播放格式详细信息1 | |
160 | n | obj | 播放格式详细信息(n+1) | |
161 | …… | obj | …… | |
162
163 `support_formats`数组中的对象:
164
165 | 字段 | 类型 | 内容 | 备注 |
166 | ---------- | ------ | ------------ | ---------------------------------- |
167 | quality | num | 视频清晰度代码 | |
168 | format | str | 视频格式 | |
169 | new_description | str | 格式描述 | |
170 | display_desc | str | 格式描述 | |
171 | superscript | str | (?) | |
172 | codecs | array | (?) | |
173
174 `support_formats`中的`codecs`数组:
175
176 | 项 | 类型 | 内容 | 备注 |
177 | ---- | ---- | --------------- | ---- |
178 | 0 | str | (?) | |
179 | 1 | str | (?) | |
180
181
182 ---
183
184 **flv/mp4方式:**
185
186 `result`中的`durl`数组:
187
188 | 项 | 类型 | 内容 | 备注 |
189 | ---- | ---- | ----------------- | ------------------------- |
190 | 0 | obj | 视频分段1信息 | **注:仅flv方式具有分段** |
191 | n | obj | 视频分段(n+1)信息 | |
192 | …… | obj | …… | |
193
194 `durl`数组中的对象:
195
196 | 字段 | 类型 | 内容 | 备注 |
197 | ---------- | ------ | ------------ | ---------------------------------- |
198 | order | num | 视频分段序号 | 某些视频会分为多个片段(从1顺序增长) |
199 | length | num | 视频长度 | 单位为毫秒 |
200 | size | num | 视频大小 | 单位为Byte |
201 | vhead | str | 空 | 作用尚不明确 |
202 | url | str | 视频流url | **注:url内容存在转义符**<br />有效时间为120min |
203 | backup_url | array | 备用视频流 | |
204
205 `durl`数组中的对象中的`backup_url`数组:
206
207 | 项 | 类型 | 内容 | 备注 |
208 | ---- | ---- | ------------------- | ----------------------------------------------- |
209 | 0 | str | 备用视频流url 1 | **注:url内容存在转义符**<br />有效时间为120min |
210 | n | str | 备用视频流url (n+1) | |
211 | …… | str | …… | |
212
213 **示例:**
214
215 **视频无分段时:**
216
217 获取视频`ep85046`/`av2325306`中的1P(cid=`3629601`)的视频流url,清晰度为480p,使用flv方式获取
218
219 avid/epid方式:
220
221 ```shell
222 curl -G 'https://api.bilibili.com/pgc/player/web/playurl' \
223 --data-urlencode 'avid=2325306' \
224 --data-urlencode 'cid=3629601' \
225 --data-urlencode 'ep_id=85046' \
226 -b 'SESSDATA=xxx'
227 ```
228 https://api.bilibili.com/pgc/player/web/playurl?avid=2325306&cid=3629601&ep_id=85046
229
230 <details>
231 <summary>查看响应示例:</summary>
232
233 ```json
234 {
235 "code": 0,
236 "message": "success",
237 "result": {
238 "accept_format": "flv480,mp4",
239 "code": 0,
240 "seek_param": "start",
241 "is_preview": 0,
242 "fnval": 0,
243 "video_project": true,
244 "fnver": 0,
245 "type": "FLV",
246 "bp": 0,
247 "result": "suee",
248 "seek_type": "offset",
249 "from": "local",
250 "video_codecid": 7,
251 "record_info": {
252 "record_icon": "",
253 "record": ""
254 },
255 "durl": [
256 {
257 "size": 111138876,
258 "ahead": "",
259 "length": 1394090,
260 "vhead": "",
261 "backup_url": [
262 "https://upos-sz-mirrorcoso1.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=coso1bv&oi=2946990771&trid=a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=878be08cc0e6bdea705952529e7e6785&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&agrr=1&bw=79726&logo=40000000",
263 "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=cosbv&oi=2946990771&trid=a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=8c31064c84d8e981704815992cfe315c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=2,3&agrr=1&bw=79726&logo=40000000"
264 ],
265 "url": "https://cn-lnsy-cu-v-02.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=bcache&oi=2946990771&trid=0000a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=7a5c4f25b9056359127191390a73bedc&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&cdnid=3281&bvc=vod&nettype=0&orderid=0,3&agrr=1&bw=79726&logo=80000000",
266 "order": 1,
267 "md5": ""
268 }
269 ],
270 "no_rexcode": 0,
271 "format": "flv480",
272 "support_formats": [
273 {
274 "display_desc": "480P",
275 "superscript": "",
276 "codecs": [ ],
277 "format": "flv480",
278 "description": "清晰 480P",
279 "quality": 32,
280 "new_description": "480P 清晰"
281 },
282 {
283 "display_desc": "360P",
284 "superscript": "",
285 "codecs": [ ],
286 "format": "mp4",
287 "description": "流畅 360P",
288 "quality": 16,
289 "new_description": "360P 流畅"
290 }
291 ],
292 "message": "",
293 "accept_quality": [
294 32,
295 16
296 ],
297 "quality": 32,
298 "timelength": 1394090,
299 "has_paid": false,
300 "clip_info_list": [ ],
301 "accept_description": [
302 "清晰 480P",
303 "流畅 360P"
304 ],
305 "status": 2
306 }
307 }
308 ```
309
310 </details>
311
312 ## 视频的取流(web端及APP端)
313
314 **注意:**
315
316 1. 如flv模式则可能产生分段情况,将`$.data.durl[1-n].url`或`$.data.durl[1-n].backup_url[0]`中的内容作为url进行GET操作, 如果有多个视频, 需要手动合并处理
317 2. 如mp4模式则需要获取对应的视频流(方法同上)
318 3. 如dash模式则需要同时获取对应的视频流和伴音流(方法同上)
319 4. web端取流需要验证防盗链,即`referer`为 `.bilibili.com`域名下且UA不能为空;app端也需要验证防盗链,即UA需要含有`Mozilla/5.0 BiliDroid/*.*.* (bbcallen@gmail.com)`(*为版本);如`referer`或UA错误的情况会被判定为盗链,返回403 Forbidden故无法取流
320 5. **注意unicode转义符**
321
322 以上述视频流url为例:
323
324 ```shell
325 wget 'https://upos-sz-mirrorhwo1.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098026&gen=playurlv2&os=hwo1bv&oi=0&trid=f0a1d2d854264369803462f3dd524154p&mid=0&platform=pc&upsig=76c1438153942fda51fbf4eb07e6e5a1&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=0,2&agrr=1&bw=79726&logo=80000000' \
326 --referer 'https://www.bilibili.com' \
327 -O 'Download_video.flv'
328 ```
329
330 响应正文将返回一个flv文件