B站视频解析如何实现?PHP 视频解析 API 三步拿到播放直链
B站视频解析如何实现?PHP 视频解析 API 三步拿到播放直链
【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse
有没有过这种经历:在 B 站刷到一个讲解特别通透的教学视频,想下载下来在地铁里接着看,或者想把这段内容嵌进自己的学习平台,结果右键没有下载入口,网页源码翻到底也只看到一堆加密字段?你眼前的是"播放器页面",而真正能保存、能二次使用的,是藏在这套页面背后的"播放直链"。bilibili-parse 就是来解决这道坎的开源 PHP 视频解析 API:给它一个视频编号,它替你把直链取回来。
一、一个真实的困扰:网页能播,文件却"够不着"
先说一个发生在我身边的场景。朋友负责公司内部的技能培训平台,领导提了个需求:把几段优秀的 B 站公开教程整合进平台,让新员工不用跳转外部站点就能看完。
他一开始走了两条弯路。第一条是直接 iframe 嵌入视频页,结果页面上广告、推荐流、登录弹窗全跟着进来了,体验一塌糊涂;第二条是想办法抓取视频文件,翻遍浏览器开发者工具,看到的是分片地址、加密参数、还有一串过期时间,手动拼根本拼不出来。卡了两天,差点用录屏软件去录。
问题到底出在哪?把视频网页想象成餐厅的"菜单",把真实存在的视频文件想象成后厨已经做好的"菜"。菜单给你看的是介绍,不是菜本身。B 站的视频播放页就是菜单,而真正可下载、可嵌入、可离线缓存的播放直链,是后厨那道菜。这两者之间隔着点菜、下单、传菜的全过程,而 bilibili-parse 扮演的正是那个"传菜窗口"——你把菜名递过去,它把做好的菜端到你面前。
二、五分钟认识它:它到底帮你做了什么
一句话概括:bilibili-parse 接收视频编号,返回真实可用的播放地址。它内部替你完成了三步脏活累活:
- 认编号——支持
av号(旧编号)、bv号(新编号)和ep剧集号三种身份标识,你给哪种它都能认。 - 发请求——模拟一个正常浏览器的身份(UA、Referer、Cookie 都替你伪装好了)向 B 站接口发起请求,拿到原始视频数据。
- 取直链——从返回数据中解析出带时效的播放地址,按你指定的格式吐出来。
它的输出方式很灵活,适合不同用途:
| 参数名 | 含义 | 默认值 | 可选值 | 说明 |
|---|---|---|---|---|
| av / bv / ep | 视频标识 | 无 | 三者至少给一个 | 定位你要解析哪个视频 |
| p | 分集页码 | 1 | ≥1 | 多 P 视频选第几集 |
| q | 清晰度 | 32 | 16 / 32 / 64 / 80 | 等级越高画质越好 |
| type | 视频类型 | video | video / bangumi | 普通视频还是番剧 |
| format | 视频格式 | flv | flv / dash / mp4 | 影响返回的链接结构 |
| otype | 输出形式 | json | json / url / dplayer | 程序用还是浏览器用 |
参数的逻辑很直白:identify(告诉它是谁)+ configure(告诉它要什么质量)+ output(告诉它结果怎么给)。没有复杂的配置项,每一个参数单独看都能猜出含义。
三、第一次亲手搞定:三步完成部署并跑通第一个请求
部署成本低到可以忽略,前提是服务器上已有 PHP 环境(要求 PHP 5.4 及以上,并安装 Curl 和 OpenSSL 扩展)。
第一步,获取项目代码:
git clone https://gitcode.com/gh_mirrors/bi/bilibili-parse第二步,把项目目录放到支持 PHP 的站点下(比如 Nginx 或 Apache 的 web 根目录),保持目录结构不动:index.php是访问入口,src/Bilibili.php是核心解析类。
第三步,浏览器打开入口页面验证环境:不带任何参数访问index.php时,页面会展示默认说明文档;带参数访问时,它才开始干活。试试下面这个请求:
你的域名/index.php?av=14661594&p=1&q=64&otype=json这段 URL 的意思是:解析av14661594这个视频的第一集,清晰度要 64,结果以 JSON 格式返回。你会收到类似这样的数据:
{ "code": 0, "quality": 64, "accept_quality": [127, 125, 120, 116, 112, 80, 64, 32, 16], "url": "https://upos-sz-mirror..../xxx.flv?t=..." }code为 0 表示成功,url就是可以直接用于下载或播放的直链。从克隆代码到拿到第一个结果,全程不超过五分钟。
如果想在自己的 PHP 程序里调用,代码同样非常简洁:
<?php require 'src/Bilibili.php'; use Injahow\Bilibili; $bp = new Bilibili('video'); // 普通视频 $bp->bvid('BV1xx4y1x7zz') // 指定视频 BV 号 ->page(1) // 第一集 ->quality(64) // 目标清晰度 ->format('mp4'); // 要 mp4 格式 echo $bp->result(); // 输出 JSON 结果这段代码做的事情和刚才的 URL 完全一致,区别在于它适合写进你自己的项目里反复调用——比如循环处理一个视频列表,把返回的直链批量存入数据库。
四、把它用进日常:三类用户各有各的玩法
工具只有一个,用的人不同,用法也完全不同。
面向学习者:一分钟拿到离线视频
只想下载某个视频离线看,不需要写任何代码。用浏览器直接访问 URL 形式接口,把otype换成url,接口会直接吐出纯文本的直链:
你的域名/index.php?av=14661594&p=2&q=32&otype=url把这个链接粘贴到下载工具里即可保存。清晰度选 32 比较稳妥——兼顾画质与文件体积,移动设备上完全够用。
面向开发者:把它当成一个视频数据中间层
如果你在搭建自己的学习平台、资料站或工具站,把 bilibili-parse 当作一层"视频地址网关"最合适:前端收集用户提交的 av/bv 号,后端调用类方法解析,把结果 JSON 返回给前端播放器。注意给这个入口加上访问频率限制,避免被滥用拖垮接口。
面向进阶玩家:解析番剧与付费课程
src/Bilibili.php中除了video,还内置了bangumi(番剧)和cheese(B 站课堂课程)两种类型。解析番剧时把 type 设为bangumi,并用ep剧集号定位;部分会员内容需要在实例上设置cookie()或access_key()才能通过权限校验,这一点在源码注释里有明确说明。
五、你可能踩过的坑:现象、原因、解法
实践中最常遇到的几个问题,按"现象 → 原因 → 解法"整理如下:
| 现象 | 原因 | 解法 |
|---|---|---|
| 返回"无访问权限" | 目标视频是会员专享或需要登录 | 为实例设置有效cookie后重试;确实无权访问就换视频 |
| 返回 "unknown cid" | 视频编号填错,或 av/bv 互转时抄漏了字符 | 回到视频页核对编号,bv号注意大小写与完整长度 |
| 能解析但链接打不开 | 直链带时效,保存太久已过期 | 尽量在解析后立即使用;程序化场景改为实时解析并配合缓存 |
| 请求的清晰度没生效 | 该视频未提供那么高的码率,工具会自动向下修正 | 这是正常保护逻辑,参考返回的accept_quality列表取值 |
| 请求频繁后被限速 | 触发了频率限制 | 开启缓存减少重复请求,或增加请求间隔 |
六、让工具更好用:三个值得深入研究的能力
第一次跑通只是开始,把下面三处吃透,这套工具才算真正成为你工具箱里顺手的那一件。
1. 缓存机制,一劳永逸地降低请求压力。src/Bilibili.php内置了文件缓存和 APCu 内存缓存两种方案,默认一小时有效期:
$bp->cache(true) // 开启文件缓存 ->cache_time(3600); // 缓存 1 小时 // 内存充足时也可以换用 APCu: $bp->cache(true, 'apcu')->cache_time(3600);开启后,同一视频的重复请求会直接命中缓存,对批量处理场景帮助极大。注意使用文件缓存时需要预先在项目下创建cache/cid目录。
2. dash 格式,拿到音画分离的高质量流。把format设为dash,返回结果不再是单个 URL,而是video与audio两个独立地址。这是 B 站高清视频的真实存储形态,画质上限更高;如果后续要做离线合流,可以配合 ffmpeg 之类的工具把音视频合并,适合对清晰度有执念的玩家。
3. 清晰度的"自动向下修正"逻辑。你请求 64 清晰度,但该视频最高只提供 32,工具不会报错,而是自动降档返回 32 并如实标注quality字段。这让接口在对接真实世界时足够宽容,不需要调用方自己去猜每个视频支持到什么码率。
七、写在最后
回到开头那个"够不着视频文件"的困扰:现在你应该已经看清,问题不在于视频不存在,而在于缺少一条把它从页面里"取"出来的通道。bilibili-parse 就是这样一条通道——普通用户用它下载离线视频,开发者用它搭建视频数据接口,进阶玩家研究它的请求与解析逻辑来理解流媒体分发机制。本项目代码量不大,核心逻辑集中在src/Bilibili.php一个文件里,配合public/dplayer.html的播放器演示和public/readme.html的说明文档,学习成本相当友好。
最后提醒一句:技术本身是中性的,请把这类解析工具用在个人学习、研究或平台整合的正当场景中,尊重创作者版权,遵守视频平台的服务条款。先从解析一个自己熟悉的视频开始,跑通流程后再尝试批量场景,动手比空想更能建立手感。
【免费下载链接】bilibili-parsebilibili Video API项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
