news 2026/10/2 1:37:18

Simple Live:基于 Flutter 与 simple_live_core 的多平台直播聚合观看与弹幕方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Simple Live:基于 Flutter 与 simple_live_core 的多平台直播聚合观看与弹幕方案
  • 音视频
  • 直播

【免费下载链接】dart_simple_live

简简单单的看直播

项目地址:https://gitcode.com/GitHub_Trending/da/dart_simple_live
点击查看免费下载

Simple Live 是一个以“简简单单的看直播”为核心理念的开源直播聚合项目,通过统一的 Dart 核心库抽象虎牙、斗鱼、哔哩哔哩、抖音四家直播平台的信息获取与弹幕协议,并在此基础上派生出了 Flutter 手机客户端、Android TV 客户端与控制台调试程序。读完本文,你将掌握该仓库的四层项目结构、核心库的接口设计与数据模型、控制台程序的两种调试用法,以及各客户端的编译运行前提。

项目定位与总体形态

Simple Live 采用“一个核心库、多个客户端外壳”的架构思路:所有直播平台相关的网络请求、签名计算、弹幕解析逻辑都被收敛到独立的 Dart 包中,客户端只负责界面展示与用户交互。因此无论是手机端还是 TV 端,甚至命令行程序,都能复用同一套直播数据能力。

需要特别注意的是,仓库在 README.md 开头即声明:本项目不提供 Release 安装包,请自行编译后运行测试。这意味着使用本项目的唯一途径是从源码构建,所有平台产物都需要本地 Flutter 工具链支持。

支持平台矩阵

直播平台(数据源)

平台说明
虎牙直播基于 Tars 协议获取房间信息与播放地址,弹幕走 WebSocket
斗鱼直播需要本地签名脚本计算请求参数
哔哩哔哩直播涉及 WBI 签名、buvid 等 Cookie 构造,弹幕支持 Brotli 解压
抖音直播依赖签名脚本生成合法请求参数

运行平台(客户端)

平台状态
Android✅ 正式支持
iOS✅ 正式支持
Windows⚠️ BETA
MacOS⚠️ BETA
Linux⚠️ BETA
Android TV⚠️ BETA

其中手机端与 TV 端是两个独立的 Flutter 工程(simple_live_app与simple_live_tv_app),桌面三端则是同一套 Flutter 引擎在不同宿主上的运行形态,均处于 BETA 阶段,说明桌面端仍以验证功能为主。

项目界面截图(浅色/深色模式)可在仓库 assets/screenshot_light.jpg 与 assets/screenshot_dark.jpg 查看,README 中直接以这两张图展示应用的实际观感:

项目结构:四个子项目各司其职

仓库根目录下划分为四个相互独立又彼此依赖的 Dart 工程,README.md 给出了它们的分工:

目录定位说明
simple_live_core项目核心库实现获取各个网站的信息及弹幕
simple_live_console控制台程序基于 simple_live_core 的命令行调试工具
simple_live_appFlutter APP 客户端面向手机与桌面端的完整应用
simple_live_tv_appFlutter Android TV 客户端面向电视遥控交互的专用界面

依赖方向是单向的:console、app、tv_app都依赖core,而core不依赖任何客户端代码。这种分层让平台接入逻辑可以被测试、被复用、被多端共享。

simple_live_core 的核心依赖

在 simple_live_core/pubspec.yaml 层面,核心库还内置了一个自研的 tars_dart 包(位于simple_live_core/packages/tars_dart),用于虎牙直播的 Tars 编解码协议——包括tars_input_stream、tars_output_stream、tup协议报文等完整实现,这也是仓库中唯一以源码形式内置的第三方协议库。

核心库深入:simple_live_core 的接口抽象

simple_live_core/lib/simple_live_core.dart 是核心库的统一出口,它一次性导出了两类内容:平台接口与数据模型。平台接入层全部实现两个接口,数据层则统一使用一套跨平台模型。

平台接口 LiveSite

simple_live_core/lib/src/interface/live_site.dart 定义了所有平台站点必须实现的能力集合,包括:

  • id/name:站点唯一标识与展示名称;
  • getDanmaku():返回该站点的弹幕处理器实例;
  • getCategores():读取网站直播分类树;
  • searchRooms(keyword, page)/searchAnchors(keyword, page):搜索直播间与主播;
  • getCategoryRooms(category, page)/getRecommendRooms(page):读取类目下房间与推荐房间;
  • getRoomDetail(roomId):获取房间详情;
  • getPlayQualites(detail):获取可选清晰度列表;
  • getPlayUrls(detail, quality):获取实际播放链接;
  • getLiveStatus(roomId):查询直播状态;
  • getSuperChatMessage(roomId):读取指定房间的醒目留言(SC)。

该接口使用 Dart 的隐式接口特性,各站点通过implements LiveSite实现。以 simple_live_core/lib/src/bilibili_site.dart 为例,BiliBiliSite将id固定为"bilibili"、name固定为"哔哩哔哩直播",并维护了cookie、userId、buvid3、buvid4等会话状态:

  • getHeader()会先请求 bilibili 的 buvid 信息(b_3/b_4),把buvid3、buvid4拼进 Cookie;如果用户配置了完整 Cookie 且已含 buvid 则直接沿用,同时统一附加默认 User-Agent 与https://live.bilibili.com/的 Referer;
  • getCategores()请求https://api.live.bilibili.com/room/v1/Area/getList拉取分类树,并把子分类图标拼接@100w.png缩略图后缀;
  • getCategoryRooms()走https://api.live.bilibili.com/xlive/web-interface/v1/second/getList,且调用了getWbiSign()对请求进行 WBI 签名,同时附带w_webid参数——这体现了 bilibili 接口的反爬签名要求。

弹幕接口 LiveDanmaku

simple_live_core/lib/src/interface/live_danmaku.dart 定义了弹幕生命周期,核心成员如下:

  • 回调:onMessage(收到一条弹幕消息)、onClose(连接关闭/重连提示)、onReady(连接就绪);
  • 状态:heartbeatTime心跳间隔(毫秒);
  • 方法:heartbeat()(发送心跳)、start(args)(开始接收)、stop()(停止接收)。

各站点在start中接收平台专属的参数对象。例如 bilibili 的 simple_live_core/lib/src/danmaku/bilibili_danmaku.dart 定义了BiliBiliDanmakuArgs,包含roomId、token、buvid、serverHost、uid、cookie六个字段;连接地址是wss://{serverHost}/sub,heartbeatTime为 60 秒(60 * 1000毫秒),收到服务器数据后使用 Brotli 解压再解析弹幕帧,断线时通过onClose通知“与服务器断开连接,正在尝试重连”。斗鱼、虎牙、抖音的弹幕实现分别位于同目录下的 douyu_danmaku.dart、huya_danmaku.dart、douyin_danmaku.dart。

统一数据模型

跨平台数据被收敛为若干模型类,客户端不感知平台差异:

  • LiveRoomDetail:房间详情,含roomId、title、cover、userName、userAvatar、online、introduction、notice、status(直播中/未开播)、isRecord(是否录播)、showTime、url等字段;额外提供data与danmakuData两个动态字段,用于携带各平台私有数据而不破坏统一模型。
  • LivePlayUrl:播放地址,urls为可用的播放链接列表,headers为拉流时需要的请求头(例如 Referer/Cookie),播放器拿到该对象即可直接拉流。
  • LiveMessage:统一弹幕消息,type为枚举(chat聊天、gift礼物、online在线人数、superChat醒目留言),并附userName、message、data与color;LiveMessageColor负责把平台返回的整数颜色值解析为 RGB,并在toString中输出#rrggbb格式,供客户端直接渲染弹幕颜色。
  • 其余模型还包括LiveCategory/LiveSubCategory/LiveCategoryResult、LiveRoomItem、LiveSearchResult、LiveAnchorItem、LivePlayQuality,共同覆盖“分类 → 房间列表 → 房间详情 → 清晰度 → 播放地址 → 弹幕流”的完整链路。

核心库还内置了请求与日志基础设施:http_client.dart、custom_interceptor.dart、core_log.dart,以及供弹幕使用的 web_socket_util.dart 和 binary_writer.dart。

控制台程序:simple_live_console 的两种调试用法

simple_live_console/README.md 说明了这个命令行工具的核心用途:在不启动图形界面的前提下验证核心库的能力,非常适合接口调试与协议研究。

用法一:输入直播间播放直链获取信息及播放地址

simple_live.exe -i [URL]

-i参数接收一个直播间的页面直链(例如某平台的房间 URL),程序会解析出房间信息与可用的播放地址,可用于验证getRoomDetail/getPlayQualites/getPlayUrls整条链路。

用法二:输入直播间链接获取弹幕

simple_live.exe -d [URL]

-d参数同样接收直播间链接,但行为是建立弹幕连接并打印实时弹幕消息,可用于验证对应平台的LiveDanmaku实现是否正常收发。控制台程序的核心逻辑位于 simple_live_console/test/all_live_console_test.dart,在 Windows 下编译后即为simple_live.exe;在其他桌面平台上可编译为对应原生可执行文件后使用同样的参数。

Flutter 客户端:simple_live_app 的功能构成

simple_live_app 是面向日常使用的完整客户端。从其 lib/modules 目录结构可以推断出主要功能模块:

  • 首页 / 分类 / 关注:home、category(含分类详情category/detail)、follow_user模块提供直播浏览主路径;
  • 搜索:search模块同时支持房间搜索与主播搜索,其中抖音搜索有独立实现(search/douyin);
  • 直播间与播放器:live_room模块内含player子模块(播放器控制器与播放控件),承担播放、清晰度切换与弹幕展示;
  • 我的 / 账号 / 历史 / 解析:mine模块下包含 bilibili 的扫码登录与网页登录(mine/account/bilibili)、观看历史(mine/history)以及一个“解析”功能(mine/parse);
  • 设置:settings模块提供弹幕屏蔽(danmu_shield)、弹幕设置、播放设置、关注设置、自动退出、App 样式等丰富配置;
  • 同步:sync模块支持本地局域网同步(local_sync,含设备发现与扫码)和基于 WebDAV 的远程同步(remote_sync/webdav),用于在多设备间同步关注、历史等数据。

数据持久化层位于 simple_live_app/lib/models/db,包含follow_user、follow_user_tag、history三张表及其*.g.dart生成代码;账户与网络层则由 simple_live_app/lib/services 下的bilibili_account_service、signalr_service、sync_service等支撑。Android 入口为 simple_live_app/android/app/src/main/kotlin/com/xycz/simple_live/MainActivity.kt。

Android TV 客户端:simple_live_tv_app

simple_live_tv_app 是面向遥控器场景的 TV 版本,目录结构与手机端有明显差异:界面组件集中在 lib/widgets/button(highlight_button、highlight_list_tile、home_big_button)与 lib/widgets/card,并提供了 highlight_widget.dart、app_focus_node.dart、base_focus_model.dart 等焦点管理基础设施——电视端必须依赖方向键焦点导航而非触摸,这是 TV 版与手机版最本质的差异。功能上保留了首页、分类、关注、历史、热门直播(hot_live)、房间搜索/主播搜索、设置与同步等核心路径。

环境要求与编译运行

README.md 明确要求Flutter 3.38。四个子项目均以此为基准,各端编译方式与标准 Flutter 工程一致:

  • 手机/桌面端:在 simple_live_app 目录执行flutter pub get后,按目标平台运行flutter run -d <device>;
  • TV 端:在 simple_live_tv_app 目录使用 Android TV 设备或模拟器运行;
  • 控制台:在 simple_live_console 目录编译后按前述-i/-d参数使用;
  • 桌面端打包配置也已就绪,例如 Windows 的 MSIX 打包(simple_live_app/windows/packaging/msix/make_config.yaml)、Linux 的 deb 打包(simple_live_app/linux/packaging/deb/make_config.yaml)以及 MacOS 的 dmg 打包(simple_live_app/macos/packaging/dmg/make_config.yaml)。

由于仓库不提供预编译安装包,首次构建需要完整拉取 Flutter 3.38 工具链并等待依赖编译;桌面三端处于 BETA 状态,遇到兼容性问题时可参考 simple_live_app/README.md 与 simple_live_tv_app/README.md 中的说明。

技术参考与合规声明

README.md 末尾列出了本项目的技术参考来源,这些资料决定了协议层实现的走向:

  • AllLive:本项目的 C# 版前身,项目结构与思路的源头;
  • dart_tars_protocol:Tars 协议的 Dart 移植参考,对应核心库内置的 tars_dart 包;
  • wbt5/real-url与Bilibili-Live-API:直播播放地址解析与 bilibili 弹幕 WebSocket 协议文档参考;
  • danmaku与huya-danmu:弹幕解析实现参考;
  • TarsCloud/Tars:虎牙使用 Tars 协议的官方规范来源;
  • douyin-live与Tiktok_Signature:抖音直播协议与签名算法参考。

在合规层面,README 的“声明”部分明确了两点:其一,项目所有功能均基于互联网公开资料开发,无任何破解、逆向工程等行为;其二,项目仅用于学习交流编程技术,严禁用于商业目的,如存在侵犯合法权益的情况可联系开发者删除相关内容。这既是项目自身的技术边界,也是使用者应当遵守的约束——尤其是抖音、bilibili 等平台持续更新签名与风控策略时,任何依赖都应以公开接口为限。

小结

Simple Live 的价值在于把“四个平台 + 四种弹幕协议 + 多个客户端形态”收敛为一套可维护的 Dart 代码:simple_live_core提供统一接口与模型,simple_live_console提供无界面的验证入口,simple_live_app与simple_live_tv_app分别承载触摸与遥控两种交互。如果你需要研究直播平台接入、弹幕 WebSocket 解析或 Flutter 多端复用架构,从 simple_live_core/lib/src/interface/live_site.dart 与 simple_live_core/lib/src/bilibili_site.dart 入手是最直接的路径。

  • 音视频
  • 直播

【免费下载链接】dart_simple_live

简简单单的看直播

项目地址:https://gitcode.com/GitHub_Trending/da/dart_simple_live
点击查看免费下载

相关推荐

上一篇:EasyFloat多浮窗管理技巧:标签系统与生命周期控制
下一篇:Mastra × E2B Desktop:在云端 Linux 桌面沙箱中构建可操控桌面的 Agent Workspace

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 1:36:16

ApkTool电脑版反编译实战:从资源解码到回编译签名

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 1:35:37

魔兽RPG地图逆向实战:破解三国列传武将招募限制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 1:34:48

359张街景车辆图数据集:YOLO训练实战与避坑指南

简介&#xff1a;面向YOLO系列目标检测实战的车辆检测数据集&#xff0c;聚焦城市街道场景中的公交车、轿车、卡车、面包车四类目标&#xff0c;适用于目标检测算法训练与效果验证&#xff0c;适合入门至进阶的计算机视觉开发者直接使用。压缩包共1088个文件&#xff0c;包含36…

作者头像 李华
网站建设 2026/10/2 1:33:12

Multisim仿真24秒倒计时电路:555秒源与74LS192预置设计全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 1:33:09

真值表到SOP/POS:数字逻辑设计核心化简与HDLBits实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华