用 Dart 一套代码聚合四大直播平台:3 个关键决策 + 3 个协议坑
2026/9/11 11:23:49 网站建设 项目流程

用 Dart 一套代码聚合四大直播平台:3 个关键决策 + 3 个协议坑

【免费下载链接】dart_simple_live简简单单的看直播项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live

Simple Live(仓库名 dart_simple_live)是一个基于 Flutter 的直播聚合工具:虎牙、斗鱼、B站、抖音四个平台的房间信息、播放直链、实时弹幕,用同一个核心库读出来,不用各平台开各的网页,也不用自己研究各家的私有协议。

一图看懂:四个入口、一个核心库

这节用一张图讲清仓库里四个子工程的关系,建立整体认知。

图里最关键的是simple_live_core:app、TV、控制台三个入口全部只依赖它,四个平台的接口请求、签名、弹幕包差异全被封在各自的LiveSite实现类里。

快速跑通:从 clone 到看到直链、弹幕

这节给你从拿到代码到看到效果的最短路径,原理放到下一节。

  1. 准备 Flutter 3.38 以上环境(Dart SDK 3.10+)。
  2. 克隆代码并先跑控制台验证核心库,它不依赖手机和模拟器:
git clone https://gitcode.com/GitHub_Trending/da/dart_simple_live cd dart_simple_live/simple_live_console dart pub get dart run -i "https://live.bilibili.com/1" # 房间信息+清晰度+播放直链 dart run -d "https://live.bilibili.com/1" # 持续输出弹幕
  1. 控制台能看到房间信息、弹幕滚动后,说明核心库已经通了。
  2. 手机或模拟器上跑完整应用:进入simple_live_app目录执行flutter pub get && flutter run
  3. 想跑电视端,同样步骤进simple_live_tv_app目录即可。

三个关键决策:核心库跨平台怎么做的

这节讲清三个当初差点选错的技术点,都发生在simple_live_core层。

统一 LiveSite 接口,而不是各平台各写一套爬虫

四个平台被收敛成同一套方法签名,上层业务完全不感知当前在看虎牙还是 B 站。理由是平台差异只集中在"怎么请求、怎么签名、怎么解弹幕包"这三件事上,接口统一后,新增一个平台等于新增一个实现类,app 一行代码都不用动。

class LiveSite { String name = ""; LiveDanmaku getDanmaku(); // 核心逻辑:各平台弹幕连接实现 Future<LiveRoomDetail> getRoomDetail({required String roomId}); Future<LivePlayUrl> getPlayUrls({required LiveRoomDetail detail, required LivePlayQuality quality}); // 核心逻辑:解析播放直链 }

完整接口定义在 simple_live_core/lib/src/interface/live_site.dart,四个平台的对应实现在 simple_live_core/lib/src/ 下。

播放器为什么用 MediaKit 而不用 VideoPlayer

官方 VideoPlayer 对直播直链常用的 flv/m3u8 覆盖不全,解码器和缓冲策略可调项少。MediaKit 底层是 ffmpeg,核心库能解析出的直播流基本都能放,还支持硬解和延迟控制,播放端代码在 simple_live_app/lib/modules/live_room/player/。

抖音签名为什么用 QuickJS 跑而不是自己实现

抖音接口的校验参数由官方 JS 代码算出,把算法翻译成 Dart 硬编码,站点一更新就挂。项目用 dart_quickjs 内嵌 JS 引擎直接跑签名脚本,算法更新只换脚本,入口在 simple_live_core/lib/src/scripts/douyin_sign.dart。

踩坑与对策:三个协议坑最容易卡半天

这节列三个高频坑,每个按"现象 → 原因 → 解法"说。

  • 抖音弹幕当 JSON 解全是乱码。现象是 WebSocket 收到的消息体直接 jsonDecode 报错或出乱码。原因是抖音弹幕协议的数据包是 protobuf 二进制,不是文本。解法是写好 .proto 后编译生成 Dart 代码,项目里已经生成好了,直接参考 simple_live_core/lib/src/danmaku/proto/ 目录下的 douyin.pb.dart。
  • 虎牙弹幕连接被服务端断连。现象是手动拼包发请求后立刻被断开。原因是虎牙用的是 Tars 二进制序列化协议,包头结构和普通 HTTP JSON 完全不是一回事,手写字节拼装极易错。解法是用项目内置的 simple_live_core/packages/tars_dart/ 子包,它专门负责 Tars 包的拆包组包。
  • 播放链接放两三分钟就断流。现象是开始播放正常,几分钟后画面卡死。原因是直播平台的直链按时间片签发,都带有效期,过期即失效。解法是断流后重新调用getPlayUrls拉一条新链接热替换,app 的播放控制器里就是这个逻辑。

能力边界:现在能做什么、还做不到什么

这节坦率列出当前的边界,避免踩空。

能做的:

  • 四个平台的房间信息、分类、搜索、全清晰度直链读取
  • 四个平台的弹幕实时接收与展示
  • Android、iOS 正式支持,Windows、macOS、Linux 处于 BETA

做不到的:

  • 官方不提供 Release 安装包,所有平台都需要自行编译
  • iOS 端播放存在已知问题(simple_live_app的 TODO 里标注着)
  • 没有手表等穿戴形态适配,也没有弹幕发送能力

下一步

跑通控制台的-i命令看到直链后,把播放源换成自己的 URL 在 app 里验证 MediaKit 播放,然后照着LiveDanmaku的写法接上你自己要看的平台弹幕协议,每一步对应的参考代码都在仓库里。

【免费下载链接】dart_simple_live简简单单的看直播项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询