V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fish47
V2EX  ›  编程

安利一下自己写的基于 mpv 的弹幕加载插件

  •  
  •   fish47 · 2016-05-05 22:51:15 +08:00 · 5289 次点击
    这是一个创建于 2909 天前的主题,其中的信息可能已经有所发展或是发生改变。

    MPVDanmakuLoader

    ScreenShot

    screenshot

    Features

    • ACFun / BiliBili / DanDanPlay 弹幕解释
    • 多弹幕源同屏显示
    • 分 P 弹幕源合并
    • 离线弹幕源管理

    Requirements

    • mpv
    • lua 5.2+
    • coreutils
    • zenity
    • curl
    • enca

    Installation

    下载源码并安装脚本

    _PROJECT_PATH=/tmp/MPVDanmakuLoader
    git clone https://github.com/fish47/MPVDanmakuLoader.git "$_PROJECT_PATH"
    
    pushd "$_PROJECT_PATH"
    mkdir -p  ~/.config/mpv/scripts/
    lua tool/mergefiles.lua > ~/.config/mpv/scripts/mpvdanmakuloader.lua
    popd
    

    建议通过~/.config/mpv/input.conf来修改快捷键,例如

    Ctrl+d script-binding mpvdanmakuloader/load
    

    SearchSyntax

    • 输入视频网址,目前只支持 ACFun / BiliBili
    • 根据视频 ID 搜索,如 acfun:acXXX acfun:vidXXX bili:avXXX bili:cidXXX
    • 根据关键字搜索,如 ddp:XXX

    Configuration

    配置文件是视频目录下的.mpvdanmakuloader/cfg.lua,如果没有需要自行创建,下面是例子

    local cfg = ...
    
    -- 其他字段详见 MPVDanmakuLoaderApp._initConfiguration()@src/shell/application.lua
    cfg.danmakuReservedBottomHeight = 30
    cfg.subtitleReservedBottomHeight = 10
    
    -- 修改或过滤弹幕,参数类型是 DanmakuData@src/core/danmaku.lua ,返回 true 过滤此弹幕
    cfg.modifyDanmakuDataHook = function(danmakuData)
        if danmakuData.text:match("小埋色")
        then
            return true
        end
    end
    
    -- 修改弹幕样式,样式定义详见 _ASS_PAIRS_STYLE_DEFINITIONS@src/base/_ass.lua
    cfg.modifyDanmakuStyleHook = function(styleData)
        styleData["Underline"] = true
    end
    
    -- 比较弹幕来源是否相同,参数类型是 DanmakuSourceID@src/core/danmaku.lua
    cfg.compareSourceIDHook = function(sourceID1, sourceID2)
        -- 例如某个目录下,保存了不同时期的弹幕 xml 文件,为了去除重复弹幕,可以认为弹幕来源是相同的
        local dir1, fileName1 = mp.utils.split_path(sourceID1.filePath)
        local dir2, fileName2 = mp.utils.split_path(sourceID2.filePath)
        if dir1 == dir2 and fileName1 and fileName2
        then
            return fileName1:match(".*%.xml") and fileName2:match(".*%.xml")
        end
    end
    

    KnownIssues

    • mkv 自带字幕不能和弹幕共存,貌似 mpv 对 --secondary-sid 支持不好,连基本的 SRT + ASS 播放也不正确
    • io.popen() 不支持读写方式,官方邮件列表甚至有解释过。项目中有这样的用例,但暂时没发现死锁
    3 条回复    2022-06-27 19:15:01 +08:00
    yicun
        1
    yicun  
       2016-05-11 13:46:03 +08:00
    会开发 win 可用的吗?
    fish47
        2
    fish47  
    OP
       2016-05-11 17:14:01 +08:00
    @yicun 如果要移植,我会用 python 重写那些外部命令,然而我懒囧。其实在 win 下有同类型的软件叫 弹弹 Play 。
    yuhangch
        3
    yuhangch  
       2022-06-27 19:15:01 +08:00
    2022 年也有了做个类似东西的想法。。先看看楼主的还能不能用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5483 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:01 · PVG 16:01 · LAX 01:01 · JFK 04:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.