ffmpeg를 이용하여 macos에서 동영상을 gif로 변환하기 (transcoding)

저는 회사 또는 개인적으로도 PoC에 영상을 자주 활용하는 편입니다. 보통 QuickTime 으로 화면을 캡쳐한 후 바로 사용하거나 편집 도구를 통해 손을 보고 사용하게 되는데요. github issue 같이 동영상 파일 확장자 업로드가 안되는 서비스에서는 영상 파일을 바로 사용할 수가 없어 gif로 변환하여 사용하곤 합니다.

보통 이러한 액션들을 수행해주는 서비스는 온라인 기반이 많은데, 아무래도 업로드 자체가 불가능하거나 찜찜한 경우에는 로컬에서만 진행할 수 있는 환경이 필요하겠죠. 이 때 영상관련 라이브러리인 ffmpeg를 사용하면 쉽게 gif로도 변환이 가능합니다.

FFmpeg

ffmpeg는 아마 transcoding 관련 작업을 해보셨으면 매우 익숙한 도구일겁니다. 보안쪽 종사하시는 분들도 취약점 때문에 자주 신경쓰는 도구이기도 하구요. 어쩄던 음성 스트림, 영상 스트림의 변환 등에서는 정말 유용하고 유명한 도구입니다.

brew install ffmpeg

Covert

ffmpeg 를 직접 사용하기엔 flag 정보가 많이 필요한데요, 이미 누군가 쉽게 사용하기 위해 만들어둔 스크립트가 있습니다.

https://github.com/thevangelist/FFMPEG-gif-script-for-bash.git

단 해당 repo에는 불필요한 파일(샘플 영상 등)이 있어서 그냥 아래 스크립트를 바로 로컬에 붙여넣어서 사용하시는게 빠르고 좋을 것 같습니다.

togif.sh

#!/bin/sh
if test $# -lt 4; then
	cat <<-EOH
	$0: Script to generate animated gifs easily from command line.
	Usage:
	$0 input.(mp4|avi|webm|flv|...) output.gif horizontal_resolution fps
	EOH
    exit 1
fi
palette="$(mktemp /tmp/ffmpeg2gifXXXXXX.png)"
filters="fps=$4,scale=$3:-1:flags=lanczos"
ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette"
ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$2"
rm -f "$palette"
./togif.sh [source] [output-gif] [Scale] [FPS]

그래서 예를들어 아래 명령으로 argument를 포함하여 스크립트를 실행해보면, 123.mov 파일을 가지고 크기는 720, FPS는 30123.gif 가 생성되는 걸 확인할 수 있습니다.

./gifenc.sh 123.mov 123.gif 720 30
[Parsed_palettegen_2 @ 0x7f983c5673c0] Dupped color: FF171519
[Parsed_palettegen_2 @ 0x7f983c5673c0] Dupped color: FF2C2D30

References