前言
现在直播平台由于弹幕的存在,主播与观众可以更轻松地进行互动,非常受年轻群众的欢迎。斗鱼TV就是一款非常流行的直播平台,弹幕更是非常火爆。看到有不少主播接入 弹幕语音播报器、 弹幕点歌等模块,这都需要首先连接斗鱼弹幕。
经常看到其它编程语言的开发者,分享了他们斗鱼弹幕客户端的代码。.NET当然也能做,还能做得更好(只是不知为何很少见人分享😂)。
本文将包含以下内容:我将使用斗鱼TV官方公开的弹幕PDF文档,使用 Socket/ TcpClient连续斗鱼弹幕;
分析如何利用 .NET强大的 ValueTask特性,在保持代码简洁的同时,轻松享受高性能异步代码的快乐;
然后将使用 ReactiveExtensions( RX),演示如何将一系列复杂的弹幕接入操作,就像写 HelloWorld一般容易;
用我自制的“准游戏引擎” FlysEngine,只需少量代码,即可将斗鱼TV的弹幕显示左右飞过的效果;
本文内容可能比较多,因此分上、下两篇阐述,上篇将具体聊聊第1、2点,第3、4点将在下篇进行,整篇完成后,最终效果如下:
斗鱼直播API
现在网上可以轻松找到 斗鱼弹幕服务器第三方接入协议v1.6.2.pdf(网上搜索该关键字即可找到)。文档提到,第三方接入弹幕服务的服务器为 openbarrage.douyutv.com:8601,我们可以使用 TcpClient来方便连接:
using (var client = new TcpClient())
{
client.ConnectAsync('openbarrage.douyutv.com', 8601).Wait();
Stream stream = client.GetStream();
// do other works
}
该文档中提到所有数据包格式如下:
注意前两个4字节的消息长度是完全一样的,可以使用 Debug.Assert进行断言。
其中所有数字都为小端整数,刚好 .NET的 BinaryWriter类默认都以小端整数进行转换。可以利用起来。
因此,读取一个消息包的完整代码如下:using (var reader = new BinaryReader(stream, Encoding.UTF8, true))
{
var fullMsgLength = reader.ReadInt32();
var fullMsgLength2 = reader.ReadInt32();
Debug.Assert(fullMsgLength == fullMsgLength2);
var length = fullMsgLength - 1 - 4