哔哩喵 (Bili-Mux) 是一个Chrome 扩展,在 B站视频页注入下载面板,支持封面下载、DASH 音视频流分离保存、浏览器内 ffmpeg.wasm 合成 MP4、FLV 合并与分P批量下载。
https://chromewebstore.google.com/detail/bnphpkhlcebimdiafgakooibmhdmeaem
English | 中文
📄 隐私政策
- 打开 Chrome,地址栏输入
chrome://extensions/并开启右上角「开发者模式」。 - 将下载的
Bili-Mux-v1.2.3.crx文件拖入页面,点击「添加扩展程序」。 - 打开任意 B站视频页(需已登录),工具栏末尾出现粉色「保存」按钮即安装成功。
一个 Manifest V3 Chrome 扩展,在 B站视频页注入下载面板,支持封面下载、DASH 音视频流分离保存、浏览器内 ffmpeg.wasm 合成 MP4、FLV 合并下载。
支持的页面:普通视频页 /video/BVxxx、/video/av123,「稍后再看」/「收藏夹」/「播单」等 /list/* 播放页(这类页面的视频 ID 在 URL 参数里,切换下一集时会自动重新解析),番剧/影视页 /bangumi/play/ss109700、/bangumi/play/ep321808,以及课程页 /cheese/play/ss20821、/cheese/play/ep712007。
番剧走 PGC 接口(
pgc/view/web/season+pgc/player/web/v2/playurl),课程走 PUGV 接口,二者面板都会多出一个「选集 / 课程目录」下拉。会员专享剧集、付费课程都需要账号本身有对应权益,下载器只能拿到当前账号能播放的那一路。
仅供个人学习留存使用,请勿用于批量搬运或二次分发。
| 功能 | 说明 |
|---|---|
| 封面下载 | 静态直链,chrome.downloads 直接落地 |
| DASH 视频流 | 视频流 .m4s 单独保存(可选画质至 4K) |
| DASH 音频流 | 音频流 .m4s 单独保存 |
| 浏览器内合成 MP4 | 拉取音视频流后用 ffmpeg.wasm(Offscreen Document)封装为单个 MP4,无需本机安装 ffmpeg |
| FLV 合并下载 | 旧版 HTTP-FLV 分段二进制拼接,低码率、体积小(番剧一般不提供,此时该按钮会自动隐藏) |
| 番剧选集 | 番剧页列出全部剧集,下拉切换后自动重新取该集直链 |
| 实时资源占用 | 面板显示本扩展内存占用与网络下载速率 |
- 下载本项目到本地。
- 打开 Chrome,进入
chrome://extensions/。 - 开启右上角「开发者模式」。
- 点击「加载已解压的扩展程序」,选择项目根目录。
- 打开任意
bilibili.com/video/页面(需已登录),视频工具栏末尾会出现粉色「保存」按钮。
环境要求:Chrome 116+(浏览器内合成依赖 Offscreen Document API)。
- 在 B站视频页点击工具栏的粉色「保存」按钮,展开面板。
- 合成 MP4:选择清晰度 → 点击「合成 MP4(浏览器内)」→ 进度条完成后自动下载。
- 分离下载:点击「下载视频流」/「下载音频流」,分别得到
.m4s文件,可用本地 ffmpeg 合并:ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4
- FLV 合并:点击「FLV 合并下载(低码率)」,直接得到可播放的
.flv文件。
bili-downloader/
├── manifest.json # MV3 清单:权限、content_scripts、offscreen、CSP
├── content.js # 注入 B站视频页的 content script(解析 + 面板 UI + 下载)
├── background.js # Service Worker:chrome.downloads 落地 + Offscreen 生命周期管理
├── offscreen.js # Offscreen Document:承载 ffmpeg.wasm 合成 MP4
├── offscreen.html # Offscreen 页面(加载 ffmpeg.min.js + offscreen.js)
├── popup.html / .js / .css # 扩展弹窗:版本号、使用说明、快捷入口
├── rules.json # declarativeNetRequest 规则:为 CDN 请求注入 Referer 头
├── lib/ffmpeg/ # @ffmpeg/ffmpeg 0.11 + @ffmpeg/core-st(单线程 wasm)
├── icons/ # 扩展图标
└── tools/gen-icons.js # 图标生成脚本
B站 playurl 接口需要 WBI 签名。扩展内置 MIXIN_TAB 混淆表,从 nav 接口获取 img_url / sub_url 提取密钥,按位重排后截取 32 位,对请求参数排序拼接后 MD5 签名。密钥缓存 10 分钟。
- DASH:视频与音频分离为独立流(
.m4s),可拿到原画画质乃至 4K。合成 MP4 需用 ffmpeg 封装。 - FLV:旧版 HTTP-FLV 将音视频封装在同一容器,多个分段可直接二进制拼接为可播放文件,码率较低。
使用 @ffmpeg/ffmpeg 0.11 + @ffmpeg/core-st(单线程 core),在 MV3 Offscreen Document 中运行:
- 单线程 core 不依赖
SharedArrayBuffer,无需 COOP/COEP 响应头。 - 跨进程二进制载荷(content → SW → offscreen)一律 base64 编码,因为
chrome.runtime.sendMessage不支持 ArrayBuffer 序列化。 - 合成后实例保留复用(
FFMPEG_END已复位 running 标志),仅失败时销毁重建。 - 进度回调从
{ratio, time}对象中提取数值,过滤 NaN 后转发。
B站媒体 CDN(bilivideo.com 等)校验 Referer。chrome.downloads 发起的下载无来源页面、不携带 Referer,会返回 403。解决方案:
- 流式下载(合成 MP4 / 分离下载):在 content script 内
fetch(浏览器自动带 Referer)→ Blob 落地。 - declarativeNetRequest(
rules.json):为bilivideo域名的media/xmlhttprequest请求注入Referer: https://www.bilibili.com。
每个合成请求带唯一 requestId,background.js 维护 requestId → tabId 映射,合成结果按 requestId 定向 chrome.tabs.sendMessage 转发,避免多标签串台或重复下载。
权限说明
| 权限 | 用途 |
|---|---|
downloads |
调用 chrome.downloads.download 落地文件 |
declarativeNetRequestWithHostAccess |
注入 Referer 规则 |
offscreen |
创建 Offscreen Document 跑 ffmpeg.wasm |
host_permissions(bilibili.com / bilivideo.com / hdslb.com) |
携带登录态 fetch API + 拉取媒体流 |
from https://github.com/c-yyy/bili-mux

No comments:
Post a Comment