Waifu2x-Extension-GUI icon indicating copy to clipboard operation
Waifu2x-Extension-GUI copied to clipboard

Gif & Animated Webp & Apng variable frame rate support and dedup

Open Rongronggg9 opened this issue 2 years ago • 12 comments

  • [ ] Gif variable frame rate
  • [ ] gif dedup
  • [ ] apng variable frame rate
  • [ ] apng deduplication
  • [x] Webp VFR
  • [ ] Webp Dedup

建议描述 典型(LINE 贴图)的 APNG 存在重复帧。由于 APNG 为无损压缩,拆分后可以直接计算各帧的 hash 来去重,升采样时就没有必要重复处理重复帧。已经在实际的 LINE 贴图上验证过这是可行且高效的。

您设想的解决方案

  1. APNG 拆分
  2. 计算各帧 hash,建立实际帧(存在重复)到逻辑帧(无重复)之间的映射
  3. 升采样所有逻辑帧
  4. 从先前建立的映射,将升采样后的逻辑帧恢复为实际帧
  5. 组装 APNG

补充内容 图像完全相同即可视为重复帧,而它们的持续时间则不一定是相同的。

Rongronggg9 avatar Jan 31 '22 23:01 Rongronggg9

好, 以后会做, 先加到待办列表里了 顺便问一下, 能提供张line贴图给我做测试吗? 我不用LINE

AaronFeng753 avatar Feb 01 '22 08:02 AaronFeng753

顺便问一下, 能提供张line贴图给我做测试吗? 我不用LINE

为了避免版权上的争议,直接给贴图不是太合适。从 [REDACTED] 下载吧: 这里随便选了一个动态贴图集: [REDACTED] ,animation@2x 目录里为动态贴图。 比如 <REDACTED>[email protected] 是一张帧重复率比较高的贴图。而 <REDACTED>[email protected] 则是另一种代表:由于 LINE 贴图似乎有时长必须为整数秒的限制,所以这张贴图是 3 个有效帧重复出现 6 次,且持续时间也一致;另外这张贴图的帧率是非标准的 18fps(非标准的帧率在 LINE 贴图中不少见),被 W2xEX 处理后就变成 20fps 了,不知道能不能解决这个问题。(对于这种贴图也许 APNG 优化的时候也许可以优化成只剩 3 帧?不过这是另一个话题了。)

EDIT: 为了避免版权上的争议,在您下载到后,抹去了相关内容。

Rongronggg9 avatar Feb 01 '22 12:02 Rongronggg9

好的, 下载到贴图了, 谢谢

AaronFeng753 avatar Feb 02 '22 02:02 AaronFeng753

另外这张贴图的帧率是非标准的 18fps(非标准的帧率在 LINE 贴图中不少见),被 W2xEX 处理后就变成 20fps 了

还发现一个问题:有些贴图不同帧的持续时间是不同的,存在一些帧的持续时间会更长。被 W2xEX 处理后,所有帧的持续时间都变成帧率的倒数了。

Rongronggg9 avatar Feb 03 '22 18:02 Rongronggg9

另外这张贴图的帧率是非标准的 18fps(非标准的帧率在 LINE 贴图中不少见),被 W2xEX 处理后就变成 20fps 了

还发现一个问题:有些贴图不同帧的持续时间是不同的,存在一些帧的持续时间会更长。被 W2xEX 处理后,所有帧的持续时间都变成帧率的倒数了。

目前不支持可变帧率, 为了保证正常播放会统一所有帧的播放时长(统一帧率)

AaronFeng753 avatar Feb 04 '22 02:02 AaronFeng753

另外这张贴图的帧率是非标准的 18fps(非标准的帧率在 LINE 贴图中不少见),被 W2xEX 处理后就变成 20fps 了

还发现一个问题:有些贴图不同帧的持续时间是不同的,存在一些帧的持续时间会更长。被 W2xEX 处理后,所有帧的持续时间都变成帧率的倒数了。

目前不支持可变帧率, 为了保证正常播放会统一所有帧的播放时长(统一帧率)

应该是因为 apngasm 不支持为每帧指定持续时间?但 W2xEX 只是将每帧的帧率都统一,而不是创造重复帧来契合时轴。LINE 贴图里,甚至会有贴图存在一帧占据的时间就达到贴图的一半时长的状况,这种情况下统一帧率而不创造重复帧的观感就非常奇怪了。

除了创造重复帧可以解决这个问题以外,我搜寻了一些资料,发现通过 ffmpeg (测试使用的版本为 5.0) 的 concat 可以创建可变帧率的 APNG。(我猜测这就是 LINE 创造贴图的方式) 像这样写一个 concat file:

file 01.png
duration 0.1
file 02.png
duration 0.3
file 03.png
duration 0.5
file 04.png
duration 1
file 01.png
duration 0.3
file 02.png
duration 0.1
file 03.png
duration 0.1
file 04.png
duration 0.7
ffmpeg -f concat -i concat.txt -y variable_framerate.apng  # 不要指定帧率,否则 ffmpeg 会创造重复帧来契合时轴

即可得到一个可变帧率的 APNG。 另外也不难留意到,这种方式非常便于在 APNG 升采样前进行帧去重,因为升采样后直接把从逻辑帧反映射出实际帧的结果写到 concat file 里就行了,不必创建实际帧的文件。

Rongronggg9 avatar Feb 04 '22 18:02 Rongronggg9

谢谢,我没在用apngasm,目前用的就是ffmpeg,我只是没细研究apng罢了

AaronFeng753 avatar Feb 04 '22 23:02 AaronFeng753

问题是怎么批量获取每一帧的 duration 呢? 我一直觉得比较麻烦就没细研究.

AaronFeng753 avatar Feb 04 '22 23:02 AaronFeng753

毕竟apng和GIF都大不到哪去, 只要你的电脑不是特别垃圾, 重复帧不会造成多少时间损失

AaronFeng753 avatar Feb 04 '22 23:02 AaronFeng753

QQ上联系你了

AaronFeng753 avatar Feb 05 '22 00:02 AaronFeng753

一年过去了我才想起来这个, 现在软件要开始支持动态webp了, 我便一起把可以通用的"可变帧率"模块写出来了, 先给动态webp用, 后面apng和gif都会支持上 就是有些太晚了....

AaronFeng753 avatar Aug 10 '23 16:08 AaronFeng753

2023-08-11_00-24-03

AaronFeng753 avatar Aug 10 '23 16:08 AaronFeng753