tsukinaha / tsukimi

A simple third-party Emby client
GNU General Public License v3.0
1.43k stars 36 forks source link

[Feature Request]: 支持弹幕匹配加载 #51

Open BakerBunker opened 6 months ago

BakerBunker commented 6 months ago

Current application version

0.4.7

Feature Request

参考现有的一些Emby弹幕实现,为播放器添加弹幕支持

References

tsukinaha commented 6 months ago

@BakerBunker 桌面端实现并不容易 但也许将来会做吧

BakerBunker commented 6 months ago

这里有个用cpp写的弹幕->ass的代码,可能比较好bind到rust上 https://github.com/HFrost0/danmakuC/blob/main/danmakuC/csrc/ass.cpp 这样是不是就可以

  1. 从弹弹play api搜到episodeID, 拿到弹幕
  2. 转换成ass文件,写到临时文件
  3. mpv加载文件播放
tsukinaha commented 6 months ago

@BakerBunker 后续不会使用裸 mpv 窗口 并且可能会引入 gst 如果你有能力在 gtkwindow 下实现 nested subcompositor 加入弹幕渲染层,欢迎随时 pr

BakerBunker commented 6 months ago

@tsukinaha 抱歉,这个确实超出能力范围了😂

baize0rzj2 commented 6 months ago

大佬,更新了0.49版本发现了一些问题,软件调用mpv播放器会缺失一些功能,比如没有全屏按键,没有进度条显示。 屏幕截图 2024-05-02 132218

ZBound commented 6 months ago

@baize0rzj2 把mpv文件夹完全删除,重新用新版本的覆盖

tsukinaha commented 6 months ago

@baize0rzj2 请不要占用别人的 issue

baize0rzj2 commented 6 months ago

@baize0rzj2 把mpv文件夹完全删除,重新用新版本的覆盖

感谢,已经解决了

baize0rzj2 commented 6 months ago

@baize0rzj2 请不要占用别人的 issue

好的,下次会注意

tsukinaha commented 2 months ago

说一下我的想法 现在的渲染画面由 GtkGLArea 呈现

因为后续我想使用 wid 在 x11 表面上渲染,所以不考虑在这个 GLArea 中合成弹幕。

在 MPV 中以字幕的方式挂载弹幕我觉得可操作空间有点小,所以我想在 Overlay 中再渲染一层 GLArea。

主要有以下两个问题

  1. 弹幕引擎没有现成的工具,需要从头手写
  2. 渲染视频内容的 GLArea 需要找到一种方法让他以匹配合成器帧率更新内容

目前其他功能都已经基本实现了,所以我想接下来考虑弹幕的问题。如果有想法的话请随意提出 PR。

lu0se commented 1 month ago

@tsukinaha 抱歉,这个确实超出能力范围了😂

可以试试我的mpv danmaku插件 ,按d根据视频标题来对弹幕进行匹配,需要对tsukimi项目进行一些修改,保证mpv的media-title设置正确,下面是修改:

diff --git a/src/ui/mpv/mpvglarea.rs b/src/ui/mpv/mpvglarea.rs
index c430854..18a9f6a 100644
--- a/src/ui/mpv/mpvglarea.rs
+++ b/src/ui/mpv/mpvglarea.rs
@@ -116,6 +116,10 @@ impl MPVGLArea {
         mpv.pause(false);
     }

+    pub fn set_media_title(&self, title: &str) {
+        self.imp().mpv.set_media_title(title)
+    }
+
     pub fn add_sub(&self, url: &str) {
         self.imp().mpv.add_sub(url)
     }
diff --git a/src/ui/mpv/page.rs b/src/ui/mpv/page.rs
index 9361af8..edabd71 100644
--- a/src/ui/mpv/page.rs
+++ b/src/ui/mpv/page.rs
@@ -265,6 +265,7 @@ impl MPVPage {
                 imp.suburl
                     .replace(suburi.map(|suburi| EMBY_CLIENT.get_streaming_url(&suburi)));
                 imp.video.play(&url, percentage);
+                imp.video.set_media_title(&name);
                 imp.back.replace(back);
                 obj.handle_callback(BackType::Start);
             }
diff --git a/src/ui/mpv/tsukimi_mpv.rs b/src/ui/mpv/tsukimi_mpv.rs
index 2f130c7..ab39425 100644
--- a/src/ui/mpv/tsukimi_mpv.rs
+++ b/src/ui/mpv/tsukimi_mpv.rs
@@ -164,6 +164,10 @@ impl TsukimiMPV {
         self.ctx.replace(Some(ctx));
     }

+    pub fn set_media_title(&self, value: &str) {
+        self.set_property("options/force-media-title", value);
+    }
+
     pub fn set_position(&self, value: f64) {
         self.set_property("time-pos", value);
     }

这是效果 图片