Kazumi icon indicating copy to clipboard operation
Kazumi copied to clipboard

可否增加批量下载功能

Open ChifeSy opened this issue 1 year ago • 17 comments

可否增加批量下载番剧功能

ChifeSy avatar Jul 02 '24 01:07 ChifeSy

这里有一个视频切片合成的问题,播放的视频流本质是分散的ts切片,我们需要将其合成为单个视频文件。

这个过程需要 ffmpeg 的介入,并且涉及原生互操作,需要为目前支持的五个平台单独编写代码,有许多复杂的细节需要处理,这个功能在计划中,但应该不会很快到来。

Predidit avatar Sep 28 '24 07:09 Predidit

感谢你找来了那么多的参考。

不过问题是这样的,使用现成的插件来实现切片下载与合并并不困难,但是会打包和视频播放器重复的ffmpeg二进制文件。

我们希望自己实现这一插件,调用已经存在的来自视频播放器的ffmpeg库。这样比较优雅。

这相对来说困难一些。

Predidit avatar Sep 28 '24 08:09 Predidit

如果直接借助 Dio 下载会是一个好的方案么?这样子就只是请求视频源了,应该不会把 ffmpeg 给打包了

aliferne avatar Oct 28 '25 03:10 aliferne

要处理 m3u8 视频分片下载和合并的问题

当然不希望打包 ffmpeg ,这样的话需要手动处理片段合并,有许多边缘情况要测试和考虑,很多视频片段不怎么标准

此外这些工作需要等待另一项重构的完成

也就是将当前的视频获取方式,重构为一个和 UI 无关的 videoProvider ,这里主要的阻碍是 HarmonyOS 无法在UI中没有 webview 组件的情况下执行脚本注入,我在考虑为 kazumiDialog 实现一个 overlay 功能来解决,我不知道 @ErBWs 怎么看待这一方案

@aliferne

如果你对这个问题感兴趣的话,可以尝试实现一个纯dart,不依赖ffmpeg的 mp4/m3u8 网络视频保存为单一视频文件的库,还可以尝试到发布到 pub.dev

Predidit avatar Oct 28 '25 04:10 Predidit

我有点没看懂什么是 为 kazumiDialog 实现一个 overlay 功能

应该不会把 ffmpeg 给打包了

在现在使用 media-kit 的情况下可以直接使用 mpv 工具将片段合并为一个完整的视频,不过据测试,性能不会很好,但是我觉得这可能是最简单的方案

ErBWs avatar Oct 28 '25 04:10 ErBWs

@ErBWs

让一个 widget 始终悬浮在应用其他组件和页面的上方,悬浮一个 1x1 大小的 webview ,虽然感觉很脏,但是好像没有其他太好的办法。

Predidit avatar Oct 28 '25 04:10 Predidit

看上去应该是可行的

ErBWs avatar Oct 28 '25 04:10 ErBWs

在现在使用 media-kit 的情况下可以直接使用 mpv 工具将片段合并为一个完整的视频,不过据测试,性能不会很好,但是我觉得这可能是最简单的方案

值得一试吧,此外就是这个项目有哪里用到过 Dio 吗,如果有的话也许集成起来会相对简单些, 我可以尝试写一个基于 Dio 的下载方案,直接请求 bangumi 的视频源进行打包下载。

aliferne avatar Oct 28 '25 04:10 aliferne

media-kit 方案要转码,在移动设备上实在是太慢了

基于 dio 的方案应该是创建一个独立的使用 dio 的视频下载库,并且实现基于 dart 的文件合并,只处理文件头并进行拼接,这很快,但是要处理一些边缘情况,我们应该只向这个库传入视频直链,库下载到指定位置

Predidit avatar Oct 28 '25 04:10 Predidit

我大概理解了,我有时间的话尝试一下

aliferne avatar Oct 28 '25 04:10 aliferne

貌似较难做到批量下载,目前的架构不太支持这一点, 要想下载就必须获取网页,而获取网页就意味着需要点到对应某一集去, 可以先做一个单集下载吗

此外我的想法是在这个窗口开一个下载的 TabBar 作为扩展, 我可能需要点时间研究一下 webkit 是怎么拿到视频 URI 的

Image

aliferne avatar Nov 01 '25 06:11 aliferne

就像我前面说的,如果可能的话,你只需要实现一个传入视频直链,可以进行下载和拼接的库就可以了

架构问题我会后来解决来合入这个库

Predidit avatar Nov 01 '25 06:11 Predidit

@Predidit m3u8 格式处理起来相对麻烦一些,如果可以的话我想先只提交 mp4 的 PR(作为 draft) 你可以测试一下效果如何 目前应该是基本支持 7sefun 源的视频下载了

aliferne avatar Nov 02 '25 11:11 aliferne

效果相当不错,但是太简单了,我们至少要完成m3u8相关功能才能将其标记为可供审核

Predidit avatar Nov 02 '25 14:11 Predidit

那可能需要等一阵子,实现解析并拼接 ts 文件似乎需要的时间会比较长

我在 pub.dev 中看到了相关的 m3u8 解析库,但使用人数都比较少,不太确定可靠性如何

现在这个用的 file_picker 还是我对比了几个方案才搞定的,Flutter 似乎没有多少库能做到全平台支持

我已经作为 draft 提交了,其他贡献者有时间的话也可以参与到贡献中

aliferne avatar Nov 02 '25 14:11 aliferne