xfangfang / wiliwili

第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上
https://xfangfang.github.io/wiliwili
GNU General Public License v3.0
3.18k stars 146 forks source link

add basic live danmuku function #125

Closed lanytcc closed 1 year ago

lanytcc commented 1 year ago
xfangfang commented 1 year ago

@maye174 您好,我今天在使用直播弹幕的功能的时候遇到了程序闪退的问题。

看debug内容,是因为 DNS timeout 导致的 mongoose 报错退出,在 LiveDanmaku::disconnect() 的 mongoose_thread.join(); 出现了错误。

我最近有更新 mongoose 库,不过只是和主分支同步了一下,应该不是这个导致的问题,同时我也试了之前的版本同样存在这个问题。

有两个小问题:

  1. 不知道你那边会不会出现 DNS timeout 的问题 (这个有可能和我的网络环境有关)。
  2. 在出现任何 mongoose 的内部错误的情况下,为什么 LiveDanmaku::disconnect() 会出错

我最近在做跨平台支持的部分,暂时还没有太多时间研究这个问题,如果您有时间看一看的话是非常感谢滴~

lanytcc commented 1 year ago

@xfangfang 我在win上测试你说的dns超时没遇到,第二个问题我也摸不着头脑,唯一的可能就是mongoose_thread提前中止了,你试一下这个链接🔗

xfangfang commented 1 year ago

@maye174 很遗憾,和之前一样,直播打开后过一两秒的样子,软件就闪退掉。

lanytcc commented 1 year ago

@xfangfang

  1. 确定是LiveDanmaku的问题吗,你尝试注释掉connect()就不会闪退了吗?
  2. 是在什么设备进行的测试,我现在手边只有win,我在win上是没有问题的,我也做了断网测试(不严谨,最新的dev分支),是不会出现闪退现象的
  3. 如果确定是LiveDanmaku的问题,且问题出现在mongoose_thread.join();,希望能提供debug信息
  4. mongoose 的内部错误一般是不会导致崩溃的,我有几个猜测,但在此之前,请尝试这个
  5. 暂时也不能完全排除mongoose的问题,也可能是我输入的参数某个情况下会不合法。
xfangfang commented 1 year ago

确定是 LiveDanmaku 的问题,注释掉就不会闪退了。 我正在使用的是 macOS,如果断网加载也有相似的问题出现。

能看到是 mongoose_event_handler 遇到了 ev == MG_EV_ERROR,然后调用的 liveDanmaku->disconnect(); 在其内报错的。

我今晚先研究一下这个看看吧,你那边没办法复现确实不太好琢磨这个问题。

xfangfang commented 1 year ago

刚刚看了一下,为什么在我这边 dns timeout 我还不是很清楚,但是这个应该和我电脑相关,不是一个大问题。(尝试修改了 dns timeout的时间和服务器地址都没有效果,这个我再持续研究看看)

报错闪退的原因找到了,我感觉可以直接把 mongoose_thread.join(); 删掉来解决。

原因是在 mongoose 线程里更新事件 -> 发生错误 -> mongoose_event_handler 进入 MG_EV_ERROR 分支 -> 调用 liveDanmaku->disconnect() -> 调用 mongoose_thread.join();

就导致了 一个线程自己调用 join 的问题。

lanytcc commented 1 year ago

@xfangfang 那应该修改mongoose_event_handler即可,我昨晚在win上也复现了断网闪退的问题,但是通常会坚持更长时间触发,以至于我第一次尝试没发现。 我待会会测试新代码是否起作用,等我的好消息

lanytcc commented 1 year ago

应该没问题了,你试一下。 就是我这个延时可能会导致退出直播间时卡顿,我要不要缩短重试时间?链接