用 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 到看到直链、弹幕
这节给你从拿到代码到看到效果的最短路径,原理放到下一节。
- 准备 Flutter 3.38 以上环境(Dart SDK 3.10+)。
- 克隆代码并先跑控制台验证核心库,它不依赖手机和模拟器:
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" # 持续输出弹幕- 控制台能看到房间信息、弹幕滚动后,说明核心库已经通了。
- 手机或模拟器上跑完整应用:进入
simple_live_app目录执行flutter pub get && flutter run。 - 想跑电视端,同样步骤进
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),仅供参考