BiliLive — B 站直播观看工具项目深度解析

基于 Flutter 的哔哩哔哩直播观看 Android 客户端。从 Simple Live 项目 fork 后精简优化,专注 B 站直播体验,支持分区浏览、本地关注、直播间录音等特色功能。

BiliLive — B 站直播观看工具项目深度解析

项目: 基于 Flutter 的哔哩哔哩直播观看 Android 客户端 GitHub: BoooSAMA/dart_simple_live_bilibili 框架: Flutter 3.38 + Dart 原项目: xiaoyaocz/dart_simple_live (GPL-3.0) 许可证: GPL-3.0


目录

  1. 项目概述
  2. 技术栈
  3. 项目架构
  4. 功能详解
  5. 核心 API 与数据流
  6. v2.0 重构亮点
  7. v2.1 新增功能
  8. 本地开发与构建
  9. 与原项目的对比

1. 项目概述

一句话概括

BiliLive 是基于 Simple Live 精简优化而来的 Android 端哔哩哔哩直播观看工具,专注于提供纯净、高效的 B 站直播浏览体验。

项目背景

原项目 Simple Live 是一个支持多平台(Bilibili、虎牙、斗鱼、抖音等)的直播聚合客户端。本项目从原项目 fork 后进行了大幅精简和定制:

  • 移除了虎牙、斗鱼、抖音等多平台支持
  • 移除了账号登录、关注同步等需要服务端的非核心功能
  • 保留并优化了 B 站直播的核心观看体验
  • 新增了直播间录音、首页分区固定、本地关注等差异化功能

核心目标

  • 提供纯净的 B 站直播浏览体验
  • 零账号依赖——所有收藏、关注功能纯本地化存储
  • 直播间音频录制——将直播音频实时保存为 M4A 文件
  • 优化的分区浏览体系——支持子分区浏览与收藏
  • 海外用户友好——绕过对海外 IP 屏蔽的 API 接口

2. 技术栈

分类技术说明
框架Flutter 3.38跨平台 UI 框架(当前仅 Android)
语言Dart应用逻辑与 UI
直播接口Bilibili Live API房间信息、弹幕、播放流
本地存储Hive轻量级 NoSQL 本地数据库
FFmpegffmpeg_kit_flutter直播音频录制引擎
状态管理GetX响应式状态管理
平台通道MethodChannelFlutter ↔ 原生层通信

主要依赖

包名用途
ffmpeg_kit_flutter_new_https_gplFFmpeg 音频录制引擎
file_picker文件选择器(录音存储路径)
open_filex打开文件
share_plus文件分享
hive / hive_flutter本地数据持久化
get (GetX)状态管理与路由
wakelock_plus防止设备休眠

3. 项目架构

整体结构

dart_simple_live_bilibili/
├── simple_live_core/                # 核心库(仅保留B站相关 API)
│   ├── lib/src/
│   │   ├── bilibili/
│   │   │   ├── bilibili_site.dart         # 站点注册
│   │   │   ├── bilibili_live_api.dart     # B站直播 API 封装
│   │   │   ├── bilibili_message.dart      # 弹幕/消息协议
│   │   │   └── models/                    # 数据模型
│   │   └── base/                          # 抽象基类
│   └── pubspec.yaml

└── simple_live_app/                  # Flutter APP 客户端
    ├── lib/
    │   ├── main.dart                        # 应用入口
    │   ├── app.dart                         # App 组件
    │   ├── store/                           # GetX 状态管理
    │   ├── pages/
    │   │   ├── home/                        # 首页(推荐+固定分区 Tab)
    │   │   ├── live_room/                   # 直播间详情页
    │   │   ├── search/                      # 搜索页
    │   │   ├── follow/                      # 本地关注列表
    │   │   ├── history/                     # 观看历史
    │   │   └── settings/                    # 设置页(含音频设置)
    │   ├── widgets/                         # 可复用组件
    │   └── utils/                           # 工具函数
    ├── android/
    └── pubspec.yaml

架构分层

┌─────────────────────────────────────────────┐
│              UI 层(Flutter Widgets)         │
│   Pages / Widgets / GetX Controllers          │
│   • 首页推荐流 + 固定分区 Tab                │
│   • 直播间详情(播放器 + 弹幕 + 录音)        │
│   • 搜索 / 关注 / 历史 / 设置                │
└──────────────────┬──────────────────────────┘

┌──────────────────▼──────────────────────────┐
│            业务逻辑层(Store / Service)       │
│  • LiveRoomStore — 直播间状态管理              │
│  • FollowStore — 本地关注存储                  │
│  • HistoryStore — 观看历史                     │
│  • RecordingService — FFmpeg 录音管理          │
│  • SettingsStore — 外观/音频配置               │
└──────────────────┬──────────────────────────┘

┌──────────────────▼──────────────────────────┐
│  simple_live_core(B站 API 封装层)            │
│  • 房间信息 API(base info / stream URL)     │
│  • 推荐流 API(recommend / area rooms)        │
│  • 弹幕 WebSocket 协议                        │
│  • 搜索 API                                   │
└──────────────────┬──────────────────────────┘

┌──────────────────▼──────────────────────────┐
│           原生层 / 外部服务                    │
│  • FFmpeg(音频录制引擎)                     │
│  • Bilibili Live API(HTTP + WebSocket)      │
│  • Hive(本地持久化)                         │
│  • Platform Channel 通信                      │
└──────────────────────────────────────────────┘

4. 功能详解

4.1 直播间浏览

功能说明
推荐流首页推荐 Tab,启动时立即加载首屏数据
分区浏览顶部分区下拉菜单,展开查看所有父分区下的子分区
子分区详情点击子分区进入独立详情页,按 area_id 拉取房间列表
分区收藏星标收藏常用子分区,显示在分区选择器底部”我的收藏”
固定分区到首页将常用子分区固定为首页独立 Tab,启动即加载
搜索搜索直播间和主播
个人主页查看主播信息和直播间列表

4.2 直播播放

  • 多清晰度:支持 B 站提供的各清晰度选项
  • 弹幕显示:WebSocket 实时弹幕,支持关键词屏蔽
  • 播放控制:播放/暂停、全屏切换

4.3 本地化功能(无账号)

所有个性化数据存储在本地,无需 B 站账号:

功能存储方式
关注/收藏直播间Hive 本地数据库
观看历史Hive 本地数据库
分区收藏Hive JSON 序列化
固定分区配置Hive 持久化
外观设置Hive / SharedPreferences
音频设置Hive / 文件系统

4.4 直播间录音

详见 v2.1 新增功能

4.5 定时关闭

  • 支持设置定时关闭计时器
  • 到达设定时间后自动退出应用或停止播放

5. 核心 API 与数据流

5.1 API 接口

API端点用途
推荐流webMain/getMoreRecList首页推荐直播间列表
分区房间列表room/v1/area/getRoomList按 area_id 获取子分区房间
房间信息room/v1/Room/get_info获取直播间基本信息
播放流地址room/v1/Room/playUrl获取直播流播放地址
搜索live/v1/room/search搜索直播间
弹幕 WebSocketbroadcastlv.chat.bilibili.com弹幕实时推送

5.2 API 升级(v2.0)

v2.0 中进行了重要的 API 迁移:

  • 推荐流:从 second/getListsecond/getListByArea 迁移至 webMain/getMoreRecList(对海外 IP 屏蔽更少)
  • 分区房间:新增 getAreaRoomsroom/v1/area/getRoomList),无需 WBI 签名,全球可用,每页 30 间
  • 分区匹配:三级匹配策略(精确父分区名 → 模糊父分区名 → 模糊子分区名),提高首页分区过滤准确率

5.3 图片加载优化

  • 封面图片解码分辨率限制(cacheWidth: 400px
  • 大幅减少内存占用,修复列表滚动卡顿

6. v2.0 重构亮点

6.1 分区浏览体系

旧版问题:分区分类不够细,无法直接浏览子分区内容。

新版方案

  1. 顶部显示当前分区名称,点击弹出分区选择器
  2. 分区选择器支持展开/收起父分区,查看所有子分区
  3. 点击子分区进入独立详情页,使用 getAreaRooms API 拉取房间列表
  4. 子分区支持星标收藏,收藏后出现在”我的收藏”区域

6.2 本地关注功能

旧版问题:原项目移除了关注功能,需要登录账号才能使用。

新版方案

  1. 纯本地关注/收藏,使用 Hive 持久化
  2. 底部导航栏恢复”关注”标签页
  3. 直播间详情页恢复”关注/取消关注”按钮
  4. 关注列表支持筛选(全部 / 直播中 / 未开播)
  5. 优化封面图片加载,减少内存占用

6.3 性能优化

  • 并发控制:修复 loadData 并发调用导致的 ConcurrentModificationError
  • 异步安全:使用代次计数器(generation)防止异步竞态导致数据错乱
  • 图片解码:封面图 cacheWidth 限制为 400px,大幅减少内存
  • Kotlin 升级:升级至 2.3.21 以兼容 screen_brightness_android 插件

7. v2.1 新增功能

7.1 首页默认分区固定(Pin)

  • 固定子分区到首页:在分区选择菜单中为任意子分区添加图钉标记,将其固定为首页独立 Tab
  • 独立加载:固定的子分区自动加载内容,底部菜单显示图钉图标
  • 持久化:固定信息通过 JSON 序列化保存至 Hive,重启自动恢复
  • 取消固定:通过底部菜单或设置页清除

7.2 直播间录音功能

直播音频实时录制为 M4A 文件:

特性说明
音频格式M4A(AAC 编码)
录制引擎FFmpeg -c:a copy 流拷贝,零编码损耗
录制控制开始/停止,状态栏显示录制时长
防误触首次录音弹出确认对话框,支持”不再显示”
断线重连FFmpeg -reconnect 参数自动重连
保存路径文件选择器自定义目录,支持目录可写性验证
文件管理查看已录制文件列表、分享、打开文件夹
生命周期切换直播间或退出时自动停止录制
防止休眠录制期间 Wakelock 保持设备唤醒

7.3 首页加载优化

  • 启动立即加载_initDefaultControlleronInit 中立即触发首屏数据请求
  • 加载进度百分比:刷新按钮显示当前加载进度百分比(如 42%
  • 自定义 Tab 预加载:固定子分区参与启动预加载,错开 500ms 避免高并发

8. 本地开发与构建

8.1 环境要求

  • Flutter SDK: 3.38
  • Dart SDK: 随 Flutter 安装

8.2 构建运行

# 克隆仓库
git clone https://github.com/BoooSAMA/dart_simple_live_bilibili.git
cd dart_simple_live_bilibili

# 获取依赖
flutter pub get

# 运行(需连接 Android 设备或启动模拟器)
flutter run

# 构建 APK
flutter build apk --release

注意:本项目不提供 Release 安装包,需自行编译后运行。

8.3 项目结构说明

simple_live_core/          # 核心库
  lib/src/bilibili/
    bilibili_site.dart         # 站点注册与配置
    bilibili_live_api.dart     # B站直播 API 封装
    bilibili_message.dart      # 弹幕 WebSocket 协议

simple_live_app/           # Flutter APP
  lib/
    store/                     # GetX 状态管理
    pages/                     # 页面
    widgets/                   # 组件
    utils/                     # 工具

9. 与原项目的对比

维度原项目 (xiaoyaocz/dart_simple_live)本项目 (BoooSAMA/dart_simple_live_bilibili)
平台支持B站 + 虎牙 + 斗鱼 + 抖音等仅 B 站
账号系统需要登录纯本地,无需登录
关注/收藏服务端同步Hive 本地存储
分区浏览基础分区子分区详情 + 分区收藏 + 首页固定
录音功能v2.1 新增 FFmpeg 录音
代码复杂度高(多平台适配)精简(仅 B 站)
海外兼容部分 API 被屏蔽使用替代 API,全球可用
性能优化基础v2.0 大幅优化图片加载与并发

Fork 后的主要修改

  1. 删除多平台代码:仅保留 B 站相关代码
  2. 删除账号相关功能:移除登录、关注同步等
  3. 新增本地关注:Hive 存储的纯本地关注功能
  4. 分区体系重构:子分区浏览 + 收藏 + 首页固定
  5. API 迁移:使用对海外友好的新 API 接口
  6. 录音功能:FFmpeg 音频录制

附录:关键文件索引

文件用途
simple_live_core/lib/src/bilibili/bilibili_live_api.dartB 站直播 API 封装
simple_live_core/lib/src/bilibili/bilibili_message.dart弹幕 WebSocket 协议
simple_live_app/lib/pages/live_room/直播间详情页(播放器 + 弹幕 + 录音)
simple_live_app/lib/pages/home/首页(推荐流 + 固定分区 Tab)
simple_live_app/lib/pages/follow/本地关注列表
simple_live_app/lib/store/GetX 状态管理
92%
Flutter Dart Bilibili 直播 FFmpeg Android