使用 alpha 将透明 PNG 转换为 WEBM:ffmpeg 不会清除前一帧的像素,这些像素在下一帧中是透明的
Converting transparent PNGs to WEBM with alpha: ffmpeg doesn't clear pixels from previous frames which are transparent in in next frames
当我尝试转换一堆带有 alpha 的 PNG 时,转换工作正常,但存在这种奇怪的行为,即前一帧的像素没有被清除并显示在下一帧中,而下一帧应该是背景完全透明。它看起来与您在彼此之上绘制框架而没有清除中间的整个 canvas 完全相同。
我在猜测会发生什么,但我认为给定一个像素为 RGBA (1, 0, 0, 1) 的帧 N 和一个像素为 (0, 0, 0, 0) 的帧 N+1 ,当我想要 (0, 0, 0, 0) 时,ffmped 将第二帧生成为 (1, 0, 0, 1)。
有什么方法可以强制 ffmpeg 在编码新帧之前尝试清除最后一帧的所有像素?
我使用的命令:
ffmpeg -vb 20MB -i %04d.png output.webm
ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 5.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, image2, from 'mika_%04d.png':
Duration: 00:00:20.00, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgba(pc), 1080x1920 [SAR 1:1 DAR 9:16], 25 fps, 25 tbr, 25 tbn, 25 tbc
[libvpx-vp9 @ 04ef83e0] v1.5.0
Output #0, webm, to 'output.webm':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: vp9 (libvpx-vp9), yuv444p, 1080x1920 [SAR 1:1 DAR 9:16], q=-1--1, 200 kb/s, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc56.60.100 libvpx-vp9
我只需要升级到 ffmpeg 4.4,现在可以正常工作了。
当我尝试转换一堆带有 alpha 的 PNG 时,转换工作正常,但存在这种奇怪的行为,即前一帧的像素没有被清除并显示在下一帧中,而下一帧应该是背景完全透明。它看起来与您在彼此之上绘制框架而没有清除中间的整个 canvas 完全相同。
我在猜测会发生什么,但我认为给定一个像素为 RGBA (1, 0, 0, 1) 的帧 N 和一个像素为 (0, 0, 0, 0) 的帧 N+1 ,当我想要 (0, 0, 0, 0) 时,ffmped 将第二帧生成为 (1, 0, 0, 1)。
有什么方法可以强制 ffmpeg 在编码新帧之前尝试清除最后一帧的所有像素?
我使用的命令:
ffmpeg -vb 20MB -i %04d.png output.webm
ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 5.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, image2, from 'mika_%04d.png':
Duration: 00:00:20.00, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgba(pc), 1080x1920 [SAR 1:1 DAR 9:16], 25 fps, 25 tbr, 25 tbn, 25 tbc
[libvpx-vp9 @ 04ef83e0] v1.5.0
Output #0, webm, to 'output.webm':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: vp9 (libvpx-vp9), yuv444p, 1080x1920 [SAR 1:1 DAR 9:16], q=-1--1, 200 kb/s, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc56.60.100 libvpx-vp9
我只需要升级到 ffmpeg 4.4,现在可以正常工作了。