Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[内容修正] 格式手册中关于 APNG 更详细的指导 #3573

Open
kLiHz opened this issue Sep 26, 2021 · 12 comments
Open

[内容修正] 格式手册中关于 APNG 更详细的指导 #3573

kLiHz opened this issue Sep 26, 2021 · 12 comments
Labels
Content Bug / 页面内容有误 Something isn't working Discussion / 需要讨论 Further discussion is welcome help wanted / 需要帮助 Extra attention is needed

Comments

@kLiHz
Copy link
Contributor

kLiHz commented Sep 26, 2021

我遇到的问题是

#3422 之后,格式手册添加了关于 APNG 的推荐,以及一个使用 ffmpeg 将现有视频转换为 APNG 的方法。这个命令类似如下:

ffmpeg -i in.mp4 out.apng

但今天使用时发现 ffmpeg 从视频转换出来的 APNG 体积十分硕大。根据查找到的资料,似乎 ffmpeg 不会对视频进行压缩。

我希望能有这样的解决方案

更多情况可以参见:将视频转换为小体积 APNG - SegmentFault

目前发现 ezgif.com 这个网站可以从视频转换到 APNG,并且得到的 APNG 大小可以接受,但是尚未进行更多评测。

此外,上述的 博客 中提到可以使用 apngasm,或者 macOS 上的图形前端 APNGb。但是这些软件似乎仅支持输入 PNG 序列,因此目前看来从现有视频转换到 APNG 的方法只有用 ezgif.com 这个网站了。

同理,对于不支持原生导出 APNG 的应用来说,使用 PNG 序列作为导出的中间文件就会占用巨大的空间,以时长 20s 秒帧率 60 的视频来说的话,如果一张 PNG 占 1 MB,那么总共就要占用 1 GB 的空间,因此也许只有导出 H.264 等视频格式作为中间产物比较适合。

因此,是否可以考虑:

  • 强调“使用 ScreenToGif 等软件进行屏幕录制时需要设置为 APNG 格式”的表述;
  • 修改现有的(使用 ffmpeg)将视频转换为 APNG 的方法。

也许,可能还需要寻找/开发一款支持压缩的、将视频转换为 APNG 的软件。

我也会继续留意是否有更好的解决方案,并更新在这个 issue 里面。

致谢

感谢 @aventador J 遇到转换 APNG 的问题,并向我求助,进而发现了 ffmpeg 的问题,也感谢 @CoelacanthusHex 的热心帮助。

@kLiHz kLiHz changed the title [功能请求] 希望新增有关 APNG 更详细的指导 [功能请求] 格式手册中关于 APNG 更详细的指导 Sep 26, 2021
@CoelacanthusHex CoelacanthusHex changed the title [功能请求] 格式手册中关于 APNG 更详细的指导 [内容修正] 格式手册中关于 APNG 更详细的指导 Nov 22, 2021
@kLiHz
Copy link
Contributor Author

kLiHz commented Nov 22, 2021

我使用 Microsoft PowerPoint 制作了一个时长约 3s 的动画,分辨率为 1920 × 1080,帧率约为 30fps。可以 点击这里下载这个 mp4 文件

使用 MSYS2 MinGW64 中提供的 ffmpeg 直接进行转码,得到的结果如下:

$ ffmpeg -i ppt-1080p.mp4 ppt-1080p.apng
ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11.2.0 (Rev1, Built by MSYS2 project)
  configuration: --prefix=/mingw64 --target-os=mingw32 --arch=x86_64 --disable-debug
--enable-amf --enable-dxva2 --enable-d3d11va --enable-fontconfig --enable-gnutls 
--enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libcaca 
--enable-libcelt --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmfx 
--enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb 
--enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp 
--enable-libsoxr --enable-libspeex --enable-libsrt --enable-libtheora --enable-libvorbis 
--enable-libx264 --enable-libx265 --enable-libxvid --enable-libvpx --enable-libwebp 
--enable-libxml2 --enable-nvenc --enable-openal --enable-pic --enable-postproc 
--enable-runtime-cpudetect --enable-swresample --enable-version3 --enable-vulkan 
--enable-zlib --disable-doc --enable-frei0r --logfile=config.log --enable-shared
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ppt-1080p.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp41isom
    creation_time   : 2021-11-22T09:55:22.000000Z
  Duration: 00:00:03.17, start: 0.000000, bitrate: 2550 kb/s
  Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2547 kb/s, 30.30 fps, 30.30 tbr, 30k tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2021-11-22T09:55:22.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : AVC Coding
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> apng (native))
Press [q] to stop, [?] for help
Output #0, apng, to 'ppt-1080p.apng':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp41isom
    encoder         : Lavf58.76.100
  Stream #0:0(und): Video: apng, rgb24(pc, gbr/unknown/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 30.30 fps, 30.30 tbn (default)
    Metadata:
      creation_time   : 2021-11-22T09:55:22.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc58.134.100 apng
frame=    1 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=   
frame=    8 fps=0.0 q=-0.0 size=     186kB time=00:00:00.23 bitrate=6612.8kbits/s
frame=   16 fps= 14 q=-0.0 size=     187kB time=00:00:00.49 bitrate=3094.5kbits/s
frame=   23 fps= 14 q=-0.0 size=     187kB time=00:00:00.72 bitrate=2115.0kbits/s
frame=   30 fps= 13 q=-0.0 size=     256kB time=00:00:00.95 bitrate=2191.4kbits/s
[此处省略若干行]
frame=   50 fps= 11 q=-0.0 size=    2560kB time=00:00:01.61 bitrate=12969.4kbits/s
frame=   55 fps= 11 q=-0.0 size=    3072kB time=00:00:01.78 bitrate=14122.2kbits/s
frame=   59 fps= 11 q=-0.0 size=    3584kB time=00:00:01.91 bitrate=15339.7kbits/s
frame=   63 fps= 10 q=-0.0 size=    4096kB time=00:00:02.04 bitrate=16400.0kbits/s
frame=   67 fps= 10 q=-0.0 size=    4608kB time=00:00:02.17 bitrate=17331.8kbits/s
[此处省略若干行]
frame=   87 fps=9.5 q=-0.0 size=    7680kB time=00:00:02.83 bitrate=22168.6kbits/s
frame=   92 fps=9.5 q=-0.0 size=    8192kB time=00:00:03.00 bitrate=22347.3kbits/s
frame=   96 fps=9.6 q=-0.0 Lsize=    8518kB time=00:00:03.16 bitrate=22025.9kbits/s speed=0.317x
video:8518kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000986%

最终得到的 APNG 格式有 8 MB 之多。

注意,可以看到我这里的 ffmpeg 构建选项中没有 --enable-apng 选项。

@kLiHz
Copy link
Contributor Author

kLiHz commented Nov 22, 2021

之后,尝试使用 apngasm 进行压缩。Windows 上使用 MSYS2 MinGW64 环境编译后运行时出现找不到 libstdc++-6.dll 的问题,遂作罢。

首先使用 ffmpeg 将上述的视频转为 PNG 序列,得到的文件总大小 13627 KB。

$ ffmpeg -i ppt-1080p.mp4 -r 30 ppt-1080p/out-1080p-%04d.png

APNGb 这个项目给出了两个项目—— APNG Assembler 和 APNG Disassembler,APNG Assembler 中又给出一个 apngopt。尝试使用它们在 Windows 下图形化的工具对生成的 PNG 序列进行压缩,效果不甚如意。

尝试在 WSL Ubuntu 下构建并使用 apngasm,压缩效果也不明显。

$ apngasm -o out.apng ppt-1080p/*.png

@kLiHz
Copy link
Contributor Author

kLiHz commented Nov 22, 2021

根据 @CoelacanthusHex 的建议,事实上,因为各个平台都有直接生成 APNG 的录屏软件,所以由 mp4 转换到 APNG 的场景并不是那么常见;不过,这也为我们解决问题提供了一个思路,比如参考相应开源软件最初添加 APNG 支持的 issue 或 PR。

这里尝试 在 peek 的 commits 中寻找 "apng" 关键字,发现似乎和启用 ffmpeg 的 --enable-apng 的选项有关。

@kLiHz
Copy link
Contributor Author

kLiHz commented Nov 22, 2021

折腾了这么久发现好像和分辨率有关,降低分辨率后能轻松获得较小的体积。

$ ffmpeg -i input.mp4 -plays 0 -r 20 -vf scale=500:-1 output.apng

@CoelacanthusHex
Copy link
Member

CoelacanthusHex commented Nov 22, 2021

@tsagaanbar (此处有图,请tg查看)

@CoelacanthusHex
Copy link
Member

CoelacanthusHex commented Nov 22, 2021

你可以使用 https://github.com/jsummers/tweakpng 软件查看 APNG 的 fdAT 帧数据块与 PNG 序列里对应图片的 IDAT 图像数据块的大小,以此判断 ffmpeg 生成的 APNG 是否使用了帧间编码

GitHub
A low-level PNG image file manipulation utility for Windows - GitHub - jsummers/tweakpng: A low-level PNG image file manipulation utility for Windows

@kLiHz
Copy link
Contributor Author

kLiHz commented Nov 22, 2021

我用了 相同的 4 张 103 KB 的 PNG,得到的结果是 103 KB,说明应该是有帧间压缩

$ ffmpeg -i seq-%04d.png out.apng

@kLiHz
Copy link
Contributor Author

kLiHz commented Nov 22, 2021

@CoelacanthusHex 我这边看到的情况大概是,缩小分辨率情况下输出的 APNG 帧间 delta 貌似更小也更少。

@CoelacanthusHex
Copy link
Member

@tsagaanbar 考虑发起一个 PR 修改格式手册中的例子,对帧率和分辨率做适当限制

@wanghaisheng
Copy link

我建议对输入视频先使用pyscenedetect来处理 然后根据得到唯一帧来生成最后的apng 应该会小很多

@Great-designer
Copy link
Contributor

这个对新手不友好。已移除相关标签

@kLiHz
Copy link
Contributor Author

kLiHz commented Aug 5, 2022

我是大鸽子,鸽了这么久;我最近抽时间开个 PR 吧……

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Content Bug / 页面内容有误 Something isn't working Discussion / 需要讨论 Further discussion is welcome help wanted / 需要帮助 Extra attention is needed
Projects
None yet
Development

No branches or pull requests

4 participants