@无名啊,可以负载均衡啊,一个直播间对应一个弹幕服务器就行了。
减少弹幕数量和屏蔽的功能都可以在前端实现,字幕轨只是用于提取弹幕内容。
@老虎会游泳,那个收弹幕的中心服务器,性能一定很强吧,要接收全国这么多用户的弹幕。。
说来也是,直播的数据量比聊天、弹幕大多了,基本也都全送达了
直播弹幕嵌在视频里,这想法挺新奇啊。
就是设置 全屏/半屏/四分之一屏弹幕、弹幕关键字屏蔽 等功能会不会不方便了。。
gta5适合电脑玩,现在自己组一台900块钱的电脑都能畅玩
会不会和后面的阻塞函数有关,这是后面部分的
server := &http.Server{ Addr: register.ListenAddr, Handler: handleServer, } var startError error if register.TLS { startError = server.ListenAndServeTLS("server.crt", "server.key") } else { startError = server.ListenAndServe() } if startError != nil { return startError } //正常exit return nil
go version go1.20.4 darwin/arm64
package main import ( "bytes" "fmt" "log" ) type reg struct { Name string ListenAddr string } func main() { register := reg{ Name: "123", ListenAddr: "127.0.0.1", } flag := false if flag { startInfo := bytes.Buffer{} startInfo.WriteByte('[') startInfo.WriteString(register.Name) startInfo.WriteString("] Starting server at -> ") startInfo.WriteString(register.ListenAddr) startInfo.WriteString(" ;Listening...") fmt.Println("ok1") log.Println(startInfo.Bytes()) fmt.Println("ok2") } else { startInfo := bytes.Buffer{} startInfo.WriteByte('[') startInfo.WriteString(register.Name) startInfo.WriteString("] Starting server at -> ") startInfo.WriteString(register.ListenAddr) startInfo.WriteString(" ;Listening...") fmt.Println("ok1") log.Println(startInfo.String()) fmt.Println("ok2") } }
@胡椒舰长 复现不了,没发现阻塞
~~~
低端方案
最便宜的tplink ac+ap 方案,5ap+1ac 大约是2500左右。我使用的是这套方案,Ax3000的AP面板,但是我说下缺点:
Ac控制器(POE)发热 容易死机 (AC+路由器大约8瓦;目前我在弱电箱放了风扇解决了散热)
AP面板发热大约在65-70度左右(单个Ap大约6瓦功率,设置无线发射功率为最小)此外,6000起步的华三 捷锐等
中等方案
也发热严重+功耗大。
此外,吸顶AP大功率 除非是别墅那种顶, 听说容易秃头当然可以是mesh方案,这样大约是300-600左右,功耗大约10瓦,因为我买的水星路由器5G+2.4也才4瓦
@hui214,我上传了美化后的文件,你可以试试
@旧人,我用爱特文管
顺便一提直播弹幕,我觉得最有趣的方法是直接把弹幕嵌在视频流的字幕轨里,这样只要前端加个字幕轨提取代码就行了。视频编码器那边,加字幕的工作交给切片服务器就行了,切片是很简单的工作,顺便混合一下字幕不会有什么额外开销。唯一的问题是审核,想删掉嵌入视频的弹幕比较困难
@卷心菜,我与老虎讨论,老虎给我出了一个接近90%完美方案,还有10%是因为没有经过大规模实践不确定因素。
大致就是: 微信私我,给你发我总结的原理截图
@森森,你的我好像看到过,用的zui,不过好像不太符合我的审美
嘿嘿,我原来也美化过![]()
@老虎会游泳,群聊风暴的问题,我是使用了group_id赋予群的内部编号,这样系统逻辑需要推送的时候,只要解析这个id就知道具体的分布式中的目标gateway的ip:port,这样就不会造成群惊了,
,
@老虎会游泳,可以用这,我买过,没用几次,手感不咋地但可以给joycon充电,十几块![]()
目前发现,只要有- 或者> 就会这样,去掉就正常,
用strconv.Quote()解决,因为特殊符号被转义为实体动作了,或者用log.printf(“%s”,str)解决
我问了一下gpt4,以下是gpt4的回复,从你的描述看,这个问题可能并不是一个 bug,而是因为
log.Println()
和fmt.Println()
对待参数的方式有所不同。
log.Println()
函数会为每个参数调用fmt.Sprint()
来生成输出的字符串。在你的第一个例子中,你传递给log.Println()
的是一个字节切片(startInfo.Bytes()
),fmt.Sprint()
会将这个字节切片转换为一个字符串,其中每个字节都被转换为其对应的十进制数值,这就是为什么你看到一串数字的原因。在你的第二个例子中,你传递给
log.Println()
的是一个字符串(startInfo.String()
)。这个字符串应该能正常打印出来,但是你说结果卡住了。这可能是因为你的环境或者终端有些问题,或者是因为register.ListenAddr
中包含了一些非打印字符,导致在终端上看起来像是卡住了。你提到你已经设置了
log.SetOutput(file)
,并且在文件中的记录是正常的,这说明log.Println()
是正常工作的。你可以尝试在不同的终端或者环境下运行你的程序,看看是否还会出现同样的问题。如果使用
fmt.Println()
没有问题,那么在这种情况下,你可以继续使用fmt.Println()
来打印日志。如果你需要的是将日志写入文件,那么你可能需要使用log
包,因为fmt
包并没有提供设置输出的功能。另外,你也可以尝试一下
log.Printf()
函数,这个函数允许你指定一个格式字符串,可以更精确地控制输出的格式。例如:log.Printf("[%s] Starting server at -> %s ;Listening...\n", register.Name, register.ListenAddr)
这样,你就不需要使用
bytes.Buffer
来手动构建字符串了。
QQ客户端和服务器之间有心跳机制,客户端通过周期性心跳上报,可知道什么时候需要
拉消息
或服务器知道什么时候推消息
~~~
@无名啊,直播间弹幕甚至可以像直播本身一样通过无状态HTTP服务器分发,按时间切片放在不同的json文件里,然后由一个列表(类似m3u8)不断列出最新的json文件名,由播放器自行下载展示。这样就能用分发直播视频流的渠道分发弹幕了。
@无名啊,直播弹幕和群聊的不同点:
- 历史记录:如果对方发消息时你不在线,群聊允许你稍后接收消息,但直播就直接错过了。
- 连接数量:为每个直播间建立一个TCP连接是可接受的,但为每个群建立一个TCP连接似乎不可接受(你可能加入了几百个群)。所以群聊必须由服务器合并你收到的消息,但直播间不需要合并。
- 消息可达性:未收到某个群消息是不可接受的,但未收到某些弹幕完全可以。很多人气很高的直播间弹幕一屏根本放不下,都是裁剪后显示的,每个人都只收到了部分弹幕。