2. FFmpeg로 동영상을 고화질 GIF로 만드는 법

git commit -m “궁극의 GIF 만들기 여정 2”

동영상을 GIF로 변환하는 여정이 영화라면, 이번 포스팅에서는 주인공 친구급인 FFmpeg에 대해 알아보고 FFmpeg를 사용해 GIF 파일을 생성해봅니다.

FFmpeg란?

Fast Forward MPEG

FFmpeg는 영상과 음성 데이터를 자유자재로 다룰 수 있는 오픈소스 멀티미디어 프레임워크입니다.

MP4, MOV, MKV, AVI, WebM, HLS 등 거의 모든 포맷을 읽고 쓰며, 변환, 추출, 인코딩, 디코딩, 자르기, 필터, 스트리밍까지 모두 가능한 만능 도구예요.

실제로 유튜브, 인스타그램, 넷플릭스 등의 글로벌 서비스들도 내부 시스템에서 FFmpeg 또는 FFmpeg 기반 도구를 적극적으로 활용하고 있습니다.

FFmpeg가 지원하는 기능

기능 설명
인코딩 동영상을 다른 형식으로 압축하거나 변환 (예: mp4 → webm)
디코딩 인코딩된 영상을 원래대로 재생할 수 있도록 해석
프레임 추출 비디오에서 이미지(Frame)를 뽑아냄
자르기/합치기 영상이나 오디오를 자르거나 붙임
필터 적용 밝기 조절, 자막 삽입, 회전, 색공간 변환 등
스트리밍 라이브 영상 스트리밍 서버 구축 가능 (HLS, RTMP 등)

일단 FFmpeg를 사용해서 MP4 영상을 GIF로 변환해 봅시다.

FFmpeg 사용해보기

FFmpeg 공식 홈페이지에서 다운로드 받을 수도 있지만, 저는 맥북에서 Homebrew로 받았습니다.

맥북 FFmpeg 설치 방법

brew install ffmpeg

FFmpeg로 GIF 생성해보기

FFmpeg로 GIF 생성하는 방법은 여러 가지가 있습니다. 저는 총 4가지 방법을 사용해서 GIF를 만들어봤는데, 결과가 다 달라서 재밌었어요.

방법 1) 기본 변환: MP4 영상을 GIF로

ffmpeg -i input.mp4 output.gif

위 명령어를 입력해서 기본 GIF를 생성합니다. 가장 노멀한 방법이에요.

결과: 83.6MB 83.6MB

이런 83.6MB 크기의 GIF가 만들어졌습니다.

왼쪽 원본 영상 vs 오른쪽 결과물

근데 딱 봐도 원본 영상과 색감 차이가 좀 심하죠? 오른쪽도 나름 예쁘긴 하지만 ㅋ 최대한 영상과 비슷한 색감의 GIF를 만드는 것이 목표입니다.

다음은 두 단계로 GIF를 생성해 봤습니다.

방법 2-1) PNG 추출 후 GIF 생성

ffmpeg -i input.mp4 -vf "zscale=primaries=bt709:m=bt709:range=full" -pix_fmt rgb24 frame%04d.png

이 명령어는 FFmpeg를 사용해 원본 비디오에서 프레임을 이미지(PNG)로 추출하면서 색공간을 변환합니다.

위 명령어를 간단히 설명하자면:

  1. 색상 정확도를 위해 zscale 필터 사용 및 풀레인지 색상 보존
  2. MP4 영상을 RGB 24비트 TrueColor PNG로 프레임 단위 추출

이미지 파일이 엄청 생성됩니다..

⚠️ 참고: 이 명령어는 따로 test 폴더 생성하고 거기서 실행하세요! 이미지 파일이 엄청 생성됩니다.

이런 준수한 색감의 PNG 이미지들이 막 추출되었어요.

방법 2-2) PNG 프레임들을 묶어서 GIF 생성

ffmpeg -framerate 15 -i frame%04d.png -vf "scale=480:-1:flags=lanczos" output.gif

위에서 추출한 PNG 시퀀스(프레임 이미지)들을 초당 15프레임의 고품질 GIF로 생성하는 명령어입니다.

결과: 35.6MB

이렇게 하면 꽤 괜찮은 GIF 파일이 생성됩니다.

비교 이미지 가장 오른쪽이 지금 생성한 gif 입니다.

방법 3) 팔레트 생성 후 GIF 생성 ⭐

이번에는 ‘팔레트 이미지’를 먼저 생성합니다.

ffmpeg -i input.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,zscale=primaries=bt709:m=bt709:range=full,palettegen" palette.png

위 명령어를 입력하면 아래와 같은 16px 짜리 팔레트 이미지가 생기는데요:

팔레트 이미지

팔레트 이미지 입니다. 이 팔레트를 사용해서 GIF를 생성합니다.

왜 팔레트가 필요한가?

GIF는 256색만 표현이 가능하다고 했었죠? 그런데 프레임마다 각각 따로 256색을 추출하는 것이라, 색감이 불안정합니다.

그래서 이 문제를 보완하기 위해 전체 영상 모든 프레임을 기준으로 256색을 추출해서 팔레트(palettegen)를 만드는 거죠.

ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=15,scale=480:-1:flags=lanczos,zscale=primaries=bt709:m=bt709:range=full[x];[x][1:v]paletteuse" output.gif

그럼 이어서 이 팔레트를 적용해 GIF를 생성해 봅니다.

결과: 8.8MB (35.6MB → 8.8MB로 용량 대폭 감소!)

팔레트 이미지

실제 GIF를 보면 좀 더 차이가 느껴집니다! 훨씬 색감이 영상에 가까워졌어요. 용량은 35.6MB → 8.8MB로 더 줄었고요.

방법 4) 네이버 블로그 앱

네이버 블로그 앱으로 만든 gif 결과: 768KB

마지막으로 색감 맛집 네이버 블로그 앱에서 생성한 GIF입니다.

용량은 가장 작은데, 이건 애초에 생성 가능한 영상 길이도 짧아요.

총정리: 4가지 방법 비교

4가지 gif 비교

짜잔~ 열심히 해봤건만 역시 네이버 블로그 색감이 가장 좋습니다;

하지만 저 색 경계가 심하죠. ㅠㅠ

그런데…

자, 그럼 이건 어떤가요?

궁극의 GIF

궁극의 GIF - 4.2MB 짱이죠? 궁극의 GIF입니다. 😄 용량도 준수합니다.

그런데 이 결과물의 키 포인트는 FFmpeg가 아니었습니다. 어떤 천재 러시아 형님이 만든 GIF 기술이 있더라고요.

이 기술에 대해서는 다음 포스팅에 이어 적어보겠습니다.

힌트: 프레임별 팔레트 최적화 + 시간축 디더링 + 256색의 한계를 돌파한 것처럼 보이는 마법! 🎨


P.S.
이 서비스가 마음에 드신다면, 주변 분들에게도 추천해주세요.

여러분의 파일을 안전하게 지키면서 멋진 GIF를 만들 수 있는 도구입니다.


💬 댓글

자유롭게 의견을 나눠주세요