ffmpeg를 사용하여 저품질 애니메이션 GIF를 어떻게 빠르게 생성합니까?

ffmpeg를 사용하여 저품질 애니메이션 GIF를 어떻게 빠르게 생성합니까?

우리는 생성하는 데 걸리는 시간만큼 품질이 중요하지 않은 수많은 썸네일 GIF를 생성합니다. ffmpeg를 사용하여 고품질 GIF를 생성하는 방법은 매우 잘 설명되어 있지만 가능한 한 빨리 저품질 GIF를 생성하는 방법을 알아내는 데는 운이 좋지 않습니다.

팔레트 계산은 다음 명령을 사용하여 대부분의 실행 시간을 차지합니다(여기의 다중 체인 필터 그래프 답변에서 가져옴:웹에서 직접 비디오 부분으로 최고의 팔레트 gif를 효율적으로 만드는 방법):

ffmpeg -y -threads 8 -r 24 -f image2 -start_number 1 -i "frames.%04d.jpg" -filter_complex "fps=24,scale=150:-1:flags=fast_bilinear,split=2 [a][b]; [a] palettegen [pal] fifo [b]; [b] [pal] paletteuse" output.gif

1000개 프레임의 해당 명령 실행 시간은 약 72초입니다. 그 중 약 67초가 팔레트 패스이고, 그 후 약 5초 만에 실제 GIF 생성이 진행됩니다. 전체 실행 시간을 최대한 줄이고 싶고 속도를 위해 이미지 품질을 많이 희생할 의향이 있습니다.

답변1

palettegen/ 필터를 사용하면 paletteuse명령 실행 속도가 느려집니다. 낮은 품질의 GIF를 얻는 간단한 방법은 다음과 같습니다.

ffmpeg -f image2 -i "frames.%04d.jpg" output.gif

추가 확장의 경우:

ffmpeg -f image2 -i "frames.%04d.jpg" -vf scale=150:-1 output.gif

출력 GIF에 프레임을 삭제할 수도 있습니다. 즉, 프레임을 샘플링하여 일부 프레임이 처리되지 않도록 할 수도 있습니다. 예를 들어 필터를 사용하여 1FPS 출력만 얻으려면 다음을 수행합니다 fps.

ffmpeg -i "frames.%04d.jpg" -vf "fps=fps=1,scale=150:-1" output.gif

답변2

저는 애니메이션 GIF를 생성하는 데 걸리는 시간을 너비 150픽셀, 길이 30프레임에 최대한 가깝게 줄이는 임무를 맡았습니다. 우리가 생성하는 대부분의 시퀀스는 1000프레임 미만입니다. 우리는 15,000개의 프레임 시퀀스를 가지고 있었고 렌더 노드는17분30프레임 정도의 GIF를 생성하는데, 이는 용납할 수 없을 정도로 느립니다.

우리는 ffmpeg를 디먹서로 사용하고 imagemagick에 파이핑했습니다. 몇 시간의 실험을 통해 다음과 같은 결론에 도달했습니다.

  • ffmpeg에 처리를 요청하는 입력 프레임 수는 다음과 같습니다.멀리서실행 속도 측면에서 가장 영향력 있는 입력입니다. 입력 프레임을 건너뛰기 위해 concat demuxer를 사용하는 것이 옵션인 경우 이것이 가장 큰 성능 차이를 만듭니다. 5번째 프레임마다 촬영함으로써 총 계산 시간을1분 45초고품질 Lanczos 재조정 및 프레임별 팔레트 계산 기능을 제공합니다.이제 30프레임 미리보기 썸네일을 생성하는 데 1초 미만이 걸립니다..

  • 재조정 알고리즘은 성능에 다음으로 큰 영향을 미치는 요인이었습니다(그러나 그 차이는 훨씬 더 컸습니다). Lanczos 대신 fast_bilinear를 사용하면 전체 15,000프레임에 걸쳐 계산 시간이 150초 절약되었습니다.

  • 가장 영향이 적은 변수는 팔레트 계산이었으며 이는 크기 조정 알고리즘에 따라 달라졌습니다. Lanczos를 사용하는 15,000개 이상의 프레임에서 팔레트 계산을 제거하면 약 17초의 실행 시간이 절약되었습니다. fast_bilinear를 사용하여 약 75초의 실행 시간을 절약했습니다.

크기 조정 알고리즘과 팔레트 계산이 미미했기 때문에 결국 최고 품질로 유지했습니다. 주로 ffmpeg에 입력 파일 읽기를 건너뛰도록 지시하여 계산 시간을 17분에서 1초 미만으로 줄였습니다.

주요 내용: 입력 프레임 건너뛰기 vs 출력 프레임 건너뛰기

우리 프로세스가 너무 오래 걸리는 이유는 image2 demuxer를 사용할 때 프레임 삭제가 실행 시간에 도움이 되지 않기 때문입니다. -r플래그와 필터를 망칠 경우 fps최종 GIF에 나타나는 프레임 수에 영향을 주지만 ffmpeg는 여전히 15,000개의 입력 프레임 모두에 대해 작업을 수행하는 것으로 보입니다.

ffmpeg 건너뛰기 입력 프레임을 찾을 수 있는 유일한 방법은 concat디먹서를 사용하는 것입니다.

입력 프레임을 건너뛰어 내 개발 컴퓨터에서 1초 이내에 고품질 애니메이션 GIF 썸네일을 생성하는 방법은 다음과 같습니다.

# create text file which describes the ~30 input frames we want ffmpeg to process
seq -f "file 'left_frames.%04g.jpg'" 10000 500 25000 > tmp.txt

# generate the animated gif using ffmpeg only
ffmpeg -f concat -i tmp.txt -filter_complex "scale=150:-1:flags=lanczos,split=2 [a][b]; [a] palettegen [pal]; [b] fifo [b]; [b] [pal] paletteuse" output.gif

관련 정보