DINKIssTyle (14.♡.7.140)
2025년 3월 6일 PM 09:29

ㄷㄷ 간단하게 변환툴만 만들려고 했는데 이런거 저런거 추가했더니...
그 아까운 o1을 10번 정도 물어본거 같네요 ㅠㅠ 아~ 피 같은 내 o1!!
그나저나 WebP 애니메이션에 살짝 기대했던 것 중 하나가 (최적화 된)GIF 같은 잔상 안생기길 바란 것이었는데
잔상이 생기네요......
Animated WebP에서 특정 프레임이 다음 프레임으로 넘어가도 이전 프레임의 일부(‘잔상’)가 남아 보이는 경우는 주로 ‘프레임 간 합성(Disposal Method) 문제’ 또는 알파(투명) 채널의 ‘불완전’ 때문에 발생합니다. GIF 애니메이션에서도 비슷하게 disposal method(배경 지우기/이전 프레임 유지 등)가 원인으로 잔상이 남는 현상이 생길 수 있는데, WebP도 내부적으로 비슷한 메커니즘을 가집니다.
아래에서 왜 이런 일이 일어나는지, 그리고 어떤 식으로 해결할 수 있는지 자세히 살펴보겠습니다.
1. 왜 잔상이 생기는가?
1) Animated WebP의 Disposal(합성) 방식 문제
Animated WebP는 각각의 프레임을 “완전히 덮어쓰기”할 수도 있고, “이전 프레임 위에 덧그리기”할 수도 있습니다.
만약 ffmpeg가 각 프레임을 부분 합성(partial update)하도록 인코딩했다면, 프레임에 포함되지 않는(= 투명으로 보이는) 영역이 그대로 이전 프레임의 픽셀을 “남겨” 두게 됩니다. 이때 다음 프레임이 불투명하게 그 영역을 덮어주지 않으면 이전 프레임의 이미지가 비쳐 보이면서 ‘잔상’처럼 느껴지는 것입니다.
2) 알파 채널이 불완전하거나, 배경이 100% 투명으로 클리어되지 않는 경우
투명 채널(알파)이 있는 영상이라고 해도, 실제로는
완전한 투명(Alpha=0)
반투명(Alpha 0~255 사이)
불투명(Alpha=255)
등의 복합적인 픽셀이 존재합니다. 예를 들어 어떤 프레임에서 일부가 ‘반투명’ 상태로 남아 있다면, 다음 프레임에서 덮이지 않는 영역은 그대로 누적되어 “잔상” 비슷하게 보일 수 있습니다.
특히 녹색 배경(Green Screen) 키잉 혹은 컬러 키를 사용하여 알파를 생성한 경우, 키가 완벽하지 않다면 주변 픽셀에 잔여 값이 남아 있을 수 있습니다.
2. ffmpeg를 이용한 Animated WebP의 Disposal 설정
GIF 애니메이션이라면 -dispose 2(Background) 등을 통해 “이전 프레임 배경을 지우고 다음 프레임을 덮어쓴다” 같은 모드를 쉽게 지정합니다.
문제는 WebP를 다루는 ffmpeg의 libwebp는 GIF처럼 명시적인 Disposal 옵션을(현재) 직접 지원하지 않는다는 점입니다. (버전에 따라 달라질 수 있지만, 대부분의 ffmpeg/libwebp 조합에서는 GIF에 한정된 -dispose 옵션만 존재)
그렇기 때문에, 단순히 -dispose background나 -dispose 2 같은 옵션을 주어도 WebP에는 적용되지 않는 경우가 많습니다.
3. 해결 또는 완화 방법
방법 A) 모든 프레임을 “완전 덮어쓰기” 형태로 인코딩
**각 프레임을 전부 RGBA(알파 포함) ‘전체 이미지’**로 만들고
프레임 간에 “이전 프레임과의 합성” 없이 **‘프레임 하나가 화면을 전부 덮어씌운다’**는 식으로 인코딩하면, 잔상 문제를 줄일 수 있습니다.
이를 위해선 ffmpeg를 호출할 때, 보통 아래와 같은 전략을 씁니다.
프레임 추출 & 재조합
ffmpeg로 동영상을 PNG(또는 RGBA) 시퀀스(예: frame0001.png, frame0002.png, …)로 추출
추출 과정에서 이미지를 모두 동일 크기로(투명 바탕은 전부 알파=0으로) 만들고, 알파가 실제로 필요한 부분만 남긴다.
이 때, 각 프레임이 “배경(화면 전체)”를 온전히 그릴 수 있게 해야 한다.
이미지 → Animated WebP
ffmpeg -i frame%04d.png -plays 0 output.webp (또는 -loop 0)
이렇게 하면 대부분 “프레임 전체를 매번 갱신”하는 형태로 인코딩되어 잔상 문제가 줄어듭니다.
하지만 이 방법은 빠른 one-liner ffmpeg 변환보다 번거롭고, 디스크에 임시 파일이 많이 생길 수 있습니다. 다만, 프레임 단위로 명확히 알파를 입혀버리면 잔상 문제가 해결될 확률이 높습니다.
방법 B) 알파 채널 정리(Thresholding/Filtering) 후 인코딩
만약 반투명 영역이 오히려 잔상의 원인이라면, 알파값이 일정 임계값 이하인 픽셀을 전부 0(완전투명)으로 만드는 등 전처리를 해줄 수 있습니다.
OpenCV나 ffmpeg의 -vf 필터에서 alphaextract, alphamerge, curves, lut 등을 사용해 알파를 깔끔하게 보정할 수도 있습니다.
그래서 추가 옵션으로 모든 프레임을 프레임 프레임 덮어 씌웠지만서도...
결과는 아래와 같습니다. 흑흑...
물론 영상툴에서는 프레임 블렌딩 옵션을 다 끄고도 내보내보고 했지만..
이런... 예술(?)괴물이 탄생했습니다.


댓글 (2)
-
니니파
25.03.06 · 116.♡.6.99
인터넷 사이트에 파일 업로드하고 변환해주는데 많지 않나요? -
DDINKIssTyle
→ 니파 작성자
25.03.06 · 14.♡.7.140
품질이 좋지는 않더라구요, https://damoang.net/laboratory/534
댓글을 작성하려면 이 필요합니다.