Opened 7 years ago
Last modified 2 years ago
#7941 reopened defect
Transparency broken when encoding animated webp
| Reported by: | Nirel d | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | undetermined |
| Version: | git-master | Keywords: | webp alpha |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
ffmpeg -i test.gif animation.webp
How can I convert animated gif (with Alpha channel) to animated webp?
I stuck with transparent background, I can't figure out how to convert gif with transparent background to webP with transparent background, Its keep a 'trail' of the images,
ffmpeg -i test.gif animation.webp
For example, I want to convert this gif - https://imgur.com/tCSn2No to webP,
The output for now is - https://media.giphy.com/media/UqevOuKr66xO04zRBa/giphy.gif
how can I achieve that using ffmpeg?
ffmpeg version N-93933-geae251ead9 built with gcc 8.3.1
Attachments (3)
Change History (24)
comment:4 by , 7 years ago
| Component: | ffmpeg → undetermined |
|---|---|
| Keywords: | gif alpha webp animated removed |
| Priority: | important → normal |
| Resolution: | → needs_more_info |
| Status: | open → closed |
To make this a valid bug report, please provide the command line you tested together with the complete, uncut console output.
comment:5 by , 7 years ago
| Priority: | normal → important |
|---|---|
| Resolution: | needs_more_info |
| Status: | closed → reopened |
ffmpeg -i test.gif animation.webp
ffmpeg version N-93933-geae251ead9 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 8.3.1 (GCC) 20190414
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 28.100 / 56. 28.100
libavcodec 58. 52.102 / 58. 52.102
libavformat 58. 27.103 / 58. 27.103
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 54.101 / 7. 54.101
libswscale 5. 4.101 / 5. 4.101
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Input #0, gif, from 'test.gif':
Duration: 00:00:02.00, start: 0.000000, bitrate: 70 kb/s
Stream #0:0: Video: gif, bgra, 150x150, 18.42 fps, 20 tbr, 100 tbn, 100 tbc
Stream mapping:
Stream #0:0 -> #0:0 (gif (native) -> webp (libwebp))
Press [q] to stop, [?] for help
Output #0, webp, to 'animation.webp':
Metadata:
encoder : Lavf58.27.103
Stream #0:0: Video: webp (libwebp), bgra, 150x150, q=2-31, 200 kb/s, 20 fps, 1k tbn, 20 tbc
Metadata:
encoder : Lavc58.52.102 libwebp
[libwebp @ 000001aacbb6a9c0] Using libwebp for RGB-to-YUV conversion. You may want to consider passing in YUV instead for lossy encoding.
frame= 37 fps=0.0 q=-0.0 Lsize= 41kB time=00:00:01.80 bitrate= 187.6kbits/s speed=14.4x
video:41kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
comment:7 by , 7 years ago
Not sure, as this functionality already exists for Gifs as you can see here(https://trac.ffmpeg.org/ticket/6813), but webp animation frames still overlapping
comment:8 by , 7 years ago
| Status: | reopened → open |
|---|
comment:11 by , 7 years ago
| Owner: | removed |
|---|
by , 6 years ago
| Attachment: | tCSn2No.gif added |
|---|
by , 6 years ago
| Attachment: | webp_anim_lossless.webp added |
|---|
comment:12 by , 6 years ago
| Resolution: | → worksforme |
|---|---|
| Status: | open → closed |
Works ok for me with this
ffmpeg -i tCSn2No.gif -loop 0 -c:v libwebp_anim -lossless 1 webp_anim_lossless.webp
follow-up: 15 comment:13 by , 6 years ago
| Keywords: | webp alpha added |
|---|
If there ever was an issue, it is still reproducible (depends on the playback application), using the default encoder or libwebp_anim makes no difference.
comment:14 by , 6 years ago
| Resolution: | worksforme |
|---|---|
| Status: | closed → reopened |
comment:15 by , 6 years ago
Replying to cehoyos:
If there ever was an issue, it is still reproducible (depends on the playback application), using the default encoder or libwebp_anim makes no difference.
This ticket deals with encoding animated webp with transparency
What application are you using to test playback ?
This plays back in firefox, chrome properly for me
If some specific playback application does not work, is that an ffmpeg problem?
comment:16 by , 6 years ago
| Resolution: | → worksforme |
|---|---|
| Status: | reopened → closed |
Attached is the animated webp produced from gif2webp, from the official google libwebp. It plays the same way in Chrome, Firefox, there is no "trail" of images
If you examine both webp's with the official vwebp viewer , both playback the same way there too. You can hit "d" to toggle the disposal method.
I fail to see how this is a ffmpeg issue
by , 6 years ago
| Attachment: | gif2webp.webp added |
|---|
follow-up: 18 comment:17 by , 6 years ago
| Resolution: | worksforme → invalid |
|---|
So you are saying the format is broken?
comment:18 by , 6 years ago
Replying to cehoyos:
So you are saying the format is broken?
What player are you using? Perhaps that is broken
Eitherway it's not a ffmpeg issue
follow-up: 21 comment:19 by , 4 years ago
I've encountered the bug as well. It is indeed an FFmpeg issue (latest git-master) and can be reproduced by encoding a webm file with transparent background to an animated webp file file via e.g.
❯ ./ffmpeg -c:v libvpx-vp9 -i in.webm -c:v libwebp -loop 0 out.webp
ffmpeg version N-105642-g538be75a69 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.30)
configuration: --pkg-config-flags=--static --disable-ffplay --disable-ffprobe --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-libxcb --disable-lzma --disable-sdl2 --enable-libvpx --enable-libwebp
libavutil 57. 21.100 / 57. 21.100
libavcodec 59. 21.100 / 59. 21.100
libavformat 59. 17.101 / 59. 17.101
libavdevice 59. 5.100 / 59. 5.100
libavfilter 8. 27.100 / 8. 27.100
libswscale 6. 5.100 / 6. 5.100
libswresample 4. 4.100 / 4. 4.100
[libvpx-vp9 @ 0x7f8e19412980] v1.11.0
Last message repeated 1 times
Input #0, matroska,webm, from 'out.webm':
Metadata:
ENCODER : Lavf59.17.101
Duration: 00:00:00.84, start: 0.000000, bitrate: 2777 kb/s
Stream #0:0: Video: vp9 (Profile 0), yuva420p(tv, progressive), 511x699, SAR 1:1 DAR 511:699, 25 fps, 25 tbr, 1k tbn
Metadata:
alpha_mode : 1
ENCODER : Lavc59.21.100 libvpx-vp9
DURATION : 00:00:00.840000000
File 'out.webp' already exists. Overwrite? [y/N] y
[libvpx-vp9 @ 0x7f8e197043c0] v1.11.0
Stream mapping:
Stream #0:0 -> #0:0 (vp9 (libvpx-vp9) -> webp (libwebp))
Press [q] to stop, [?] for help
[libvpx-vp9 @ 0x7f8e197043c0] v1.11.0
Output #0, webp, to 'out.webp':
Metadata:
encoder : Lavf59.17.101
Stream #0:0: Video: webp, yuva420p(tv, progressive), 511x699 [SAR 1:1 DAR 511:699], q=2-31, 200 kb/s, 25 fps, 1k tbn
Metadata:
alpha_mode : 1
DURATION : 00:00:00.840000000
encoder : Lavc59.21.100 libwebp
frame= 21 fps=0.0 q=-0.0 Lsize= 775kB time=00:00:00.80 bitrate=7927.0kbits/s speed=0.848x
video:775kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
You can find the input webm file here: https://marioslab.io/dump/in.webm
The bug is located in line 137 in webpenc.c. This sets the disposal method of the ANMF chunk to 0, which means the previous canvas contents are retained. For transparent frames, that is incorrect. See the specs here: https://developers.google.com/speed/webp/docs/riff_container#animation
The simplest fix is to set the disposal method to 1, like this:
git patch --- a/libavformat/webpenc.c
+++ b/libavformat/webpenc.c
@@ -134,7 +134,7 @@ static int flush(AVFormatContext *s, int trailer, int64_t pts)
avio_wl24(s->pb, pts - w->last_pkt->pts);
} else
avio_wl24(s->pb, w->last_pkt->duration);
- avio_w8(s->pb, 0);
+ avio_w8(s->pb, 0x1);
}
avio_write(s->pb, w->last_pkt->data + skip, w->last_pkt->size - skip);
av_packet_unref(w->last_pkt);
This fixes the issue, but may lead to bigger webp files in case of non-transparent input frames.
comment:20 by , 4 years ago
| Resolution: | invalid |
|---|---|
| Status: | closed → reopened |
comment:21 by , 2 years ago
Replying to Mario Zechner:
+ avio_w8(s->pb, 0x1);
I can confirm that the change that Mario suggests works, but it adds more bytes to the result.
Can we have it added as an option so we can decide which disposal method to use? For transparent animated images we need this.



Still didnt get an answer