우리는 생성하는 데 걸리는 시간만큼 품질이 중요하지 않은 수많은 썸네일 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