找回密码
 立即注册
查看: 7908|回复: 15

一个自动加载b站弹幕的mpv脚本

1

主题

13

回帖

0

VC币

中级会员

Rank: 3Rank: 3

积分
3655
scad 发表于 2022-11-20 20:16:24 | 显示全部楼层 |阅读模式
本帖最后由 scad 于 2025-3-6 11:19 编辑

以 github.com/itKelis/MPV-Play-BiliBili-Comments 为基础,修改得到自动加载bilibili弹幕的脚本,放在这里分享给大家。

由于yt-dlp无法下载b站某些视频的弹幕,所以在脚本里有一个备用的下载方法,但是不会实现自动替代,只能暂且用键绑定(shift+b),希望有会代码的大佬指点迷津。备用方法也有一个问题,遇到播放列表会下载所有视频的弹幕,所以目前只作为备用
ps. 感谢 @shadows 的帮助,已经可以自动切换到备用方法了

依赖python3,yt-dlp,BBDown,niconvert
niconvert作为备用弹幕转换方式,如有需要请到github自行下载脚本,将niconvert目录放到python的lib\site-packages里面

使用方法
1.将文件解压带目录一起放在mpv配置目录(默认是%appdata%\mpv\scripts)里
2.将yt-dlp放在mpv.exe同一目录
3.下载安装python3(如embeddable版,解压所有文件放在mpv.exe同一目录)
4.因为yt-dlp已经修复了不能下载某些弹幕的问题,可以不用配置bbdown和niconvert
5.用mpv打开bilibili链接

221214更新:bilidown参数变化
231231更新:用bbdown替换bilidown下载弹幕
240616更新:根据屏幕刷新率设置弹幕fps
250306更新:解决在较慢设备上首次播放无法设置vf滤镜的问题

danmaku250306.zip (11.33 KB, 下载次数: 335)




评分

参与人数 1活跃度 +3200 收起 理由
Finn + 3200 赞一个!

查看全部评分

回复

使用道具 举报

3

主题

406

回帖

42

VC币

至尊会员

Rank: 16Rank: 16Rank: 16Rank: 16

积分
205625

活跃达人

shadows 发表于 2022-11-20 21:26:18 | 显示全部楼层
本帖最后由 shadows 于 2022-11-20 21:41 编辑

我个人想法哈,还没实践,纯属空谈
整个加载分为下载和显示2部分,可能的失败在于下载部分
所以要想办法获取下载的状态结果,按理来说应该可以。mp.command_native_async可以把结果告诉回调函数
  1. mp.command_native_async(table [,fn])
  2. Like mp.command_native(), but the command is ran asynchronously (as far as possible), and upon completion, fn is called. fn has three arguments: fn(success, result, error)
复制代码

可以写一个负责处理的回调函数,通过参数得知下载成功了没有,没成功就调用方法2再次下载

------
可能加这一行就行了??主要还得看前面失败了能不能好好返回错误
或者检查一下下载的文件存不存在,不存在肯定是失败了
Snipaste_2022-11-20_21-29-10.png
回复

使用道具 举报

8

主题

151

回帖

765

VC币

荣誉会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
104874

崭露头角

sillonae 发表于 2022-11-20 21:32:43 | 显示全部楼层
有一个问题,b站番剧由于删减导致时长不一致结果弹幕错位这种情况怎么办呢
回复

使用道具 举报

3

主题

406

回帖

42

VC币

至尊会员

Rank: 16Rank: 16Rank: 16Rank: 16

积分
205625

活跃达人

shadows 发表于 2022-11-20 21:34:51 | 显示全部楼层
本帖最后由 shadows 于 2022-11-20 21:44 编辑
sillonae 发表于 2022-11-20 21:32
有一个问题,b站番剧由于删减导致时长不一致结果弹幕错位这种情况怎么办呢 ...

这种问题估计只能人工解决,自己去核对删减时间,目前没有现成的数据,程序没办法知道哪里被删减了(至少只依靠mpv脚本做这个估计费劲)
我设想的可能方法,下载B站的音频与现有的音频比对(用外部程序完成),然后得出删减的区间,再处理弹幕/ass文件(可能又需要一个外部程序?)
回复

使用道具 举报

1

主题

13

回帖

0

VC币

中级会员

Rank: 3Rank: 3

积分
3655
scad  楼主| 发表于 2022-11-20 21:51:52 | 显示全部楼层
本帖最后由 scad 于 2022-11-20 21:53 编辑
shadows 发表于 2022-11-20 21:26
我个人想法哈,还没实践,纯属空谈
整个加载分为下载和显示2部分,可能的失败在于下载部分
所以要想办法获 ...

是的,之前我就在else后面直接写的第二种mp.command_native_async,但是只要前面的yt-dlp下载失败以后,这个loadsub function内,之后的程序似乎就不再执行了。试过在 if biliurl:lower():match("bili") ~= nil 这个 if 后面再写 if 语句(判断是否有ass文件)也不会执行。
回复

使用道具 举报

1

主题

13

回帖

0

VC币

中级会员

Rank: 3Rank: 3

积分
3655
scad  楼主| 发表于 2022-11-20 22:03:47 | 显示全部楼层
大佬有兴趣的话可以用这个视频测试 www .bilibili. com/video/BV1SW411u7Go
回复

使用道具 举报

3

主题

406

回帖

42

VC币

至尊会员

Rank: 16Rank: 16Rank: 16Rank: 16

积分
205625

活跃达人

shadows 发表于 2022-11-20 22:47:51 | 显示全部楼层
scad 发表于 2022-11-20 21:51
是的,之前我就在else后面直接写的第二种mp.command_native_async,但是只要前面的yt-dlp下载失败以后,这 ...

想起2个最重要的问题,函数在使用前需要先定义,所以loadsub2要在louadsub1前面;判断成功也应该用回调的第一个参数,而不是error,那个是错误的原因,出错了也有可能是空的。
不过,最大的问题还是这个判断是不是可靠,可以学习官方脚本ytdl_hook.lua,先试试能不能得到弹幕信息(-J, --dump-single-json),能得到再下载


我先溜了,我也没有在mpv看B站的需求
回复

使用道具 举报

1

主题

13

回帖

0

VC币

中级会员

Rank: 3Rank: 3

积分
3655
scad  楼主| 发表于 2022-11-21 15:05:19 | 显示全部楼层
shadows 发表于 2022-11-20 22:47
想起2个最重要的问题,函数在使用前需要先定义,所以loadsub2要在louadsub1前面;判断成功也应该用回调的 ...

感谢,确实是结果判断上的问题,不管yt-dlp是否出错返回的err都是nil,要用result表里面的status判断,这下解决了
回复

使用道具 举报

2

主题

89

回帖

26

VC币

至尊会员

Rank: 16Rank: 16Rank: 16Rank: 16

积分
268850
马可solo 发表于 2022-12-9 14:56:06 | 显示全部楼层
两个都没有用过,想问一下,链接里的也是自动加载弹幕啊,这个修改版区别在哪呢
Le vent se leve, il faut tenter de vivre.
回复

使用道具 举报

1

主题

13

回帖

0

VC币

中级会员

Rank: 3Rank: 3

积分
3655
scad  楼主| 发表于 2022-12-14 21:23:41 | 显示全部楼层
马可solo 发表于 2022-12-9 14:56
两个都没有用过,想问一下,链接里的也是自动加载弹幕啊,这个修改版区别在哪呢 ...

原版需要搭配Play-With-MPV脚本,从网页上解析视频地址用mpv播放
修改版是在mpv里输入b站链接,调用yt-dlp解析播放,不必先打开网页

评分

参与人数 1活跃度 +6 收起 理由
马可solo + 6 6

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表