커맨드 라인을 통해 MP4 비디오에서 애니메이션 GIF를 만드는 방법은 무엇입니까?


답변:


127

ffmpeg 3.4.4는 우분투 18.04에서 직접 할 수 있습니다

다음과 같은 것을 사용하고 싶을 것입니다.

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

이 게시물에 설명 된 테스트 데이터 생성 절차 .

더 직접적인 :

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

또한 작동하지만 비디오 형식은 프레임 전체에서 지능적으로 압축되므로 출력 GIF는 입력 비디오보다 훨씬 큽니다.

인수 분석 :

  • ulimit -Sv 1000000: 프로그램의 최대 1Gb 메모리 크기를 설정합니다.

    대부분의 명령은 이전의 특정 시도와 같이 무제한 메모리를 사용하지 않도록합니다.

    500MB는 ffmpeg가 공유 라이브러리를로드하지 못하도록합니다. RAM을 업그레이드 할 시간입니까?

  • -ss 00:00:03 -to 00:00:06: 비디오를 잘라낼 시작 및 종료 시간입니다.

    아니요, GIF는 온라인으로 동영상 을 해적판으로 배포 하는 가장 좋은 방법은 아닙니다 .

    참조 : https : //.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: 출력 512픽셀을 높이로 만들고 가로 세로 비율을 유지하도록 너비를 조정합니다.

    이것은 비디오보다 해상도가 훨씬 낮은 웹 이미지의 일반적인 사용 사례입니다.

    이 옵션을 제거하면 출력 GIF의 높이는 입력 비디오와 동일합니다.

    원 영상 높이로 예를 찾을 수있다 ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 이고 이 경우 1024 x 1024입니다.

  • -r 15: 샘플링 FPS.

    그래서 예를 들어, 원래의 동영상, 30 FPS이었다 -r 15그 수단 ffmpeg매 2 (1 개 프레임을 선택한다 = 30 / 15).

    인식 된 출력 FPS는 입력과 일치하도록 조정되므로 속도 향상을 느끼지 못하고 세분성 만 향상됩니다.

    입력 FPS는로 찾을 ffprobe수 있으며 https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames에mediainfo 설명 된대로 전체 입력 프레임 수를 찾을 수 있습니다 . -in-a-video-on-the-linux- 명령어 행 / 1044894 # 1044894

    비디오 형식은 일반적으로 해상도가 높기 때문에 더 높은 프레임 속도를 갖기 때문에이 옵션을 사용하는 것이 좋습니다. GIF가 작을수록 낮은 프레임 속도가 눈에 띄지 않으므로 일부 프레임을 건너 뛰고 더 작은 GIF를 만들 수 있습니다.

: 사전 18.04 전에 ffmpeg+ convert중간 파일이없는 한 줄

ffmpeg이전에 GIF를 처리 할 수 ​​없었습니다. 내가 가진 가장 좋은 것은 다음과 같습니다.

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

일부 인수에 대한 설명 :

"실제"비 GIF 비디오 형식은 프레임에서 압축되는 반면 GIF는 개별 프레임 만 압축하므로 높이와 프레임 속도를 줄이더라도 출력 GIF는 여전히 비디오보다 클 수 있습니다.

직접 :

convert input.mp4 rpi2-bare-metal-blink.gif

작동했지만 메모리 오버플로로 인해 컴퓨터가 거의 죽이고 2s 1Mb 입력 파일에 대해 100 배 더 큰 출력을 생성했습니다. 언젠가 ImageMagick이 따라 잡을 수 있습니다.

참조 : https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

우분투 17.10에서 테스트되었습니다.


1
Downvoters 설명하십시오 ;-)
— Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
지연이 -r 값과 일치하지 않습니다 (결과 gif는 2 배 속도 임). 또한 명백한 이유없이 스케일 인수를 추가했습니다 (gif를 실제로 작게 만듭니다).
— asmeurer

2
동의한다. 작은 크기의 GIF는 웹에 적합합니다. 감사합니다 scale=320:-1
— zombic

2
궁금한 사람들을 위해 : 제거 -r 10하면 GIF가 정상 속도로 돌아옵니다.
— Mitch

2
나는 mp4보다 20 % 큰 gif를 얻었다 : O
— Adam Goldman

113

두 단계 :

  • 비디오에서 이미지 추출

    .mp4파일 과 같은 디렉토리에 프레임이라는 디렉토리를 작성 하십시오. 사용 명령 :

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    출처

  • 이미지를 gif로 변환

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    문서 : GIF 옵션 변환

다소 큰 파일로 끝나고 이미지 magick 안내서를 살펴보고 두 번째 단계 명령에 추가하여 작은 파일을 얻을 수있는 옵션에 대한 gif를 최적화 하십시오.


1
훌륭한 답변-추가 정보 : ffmpeg는 여기에
— chepyle

3
frames첫 번째 명령이 작동 하려면 폴더가 존재해야합니다.
— totymedli 2016 년

3
작동하는 빠른 방법이 그 일반적으로 최적화 할하고 링크를 읽기에는 너무 게으른 그 사람들을 위해, 단지 추가 -layers Optimize마지막으로 convert전에, 명령 *.jpg. 출력을 확인하십시오. 영향을받을 수 있습니다. 나를 위해 그것은 품질의 눈에 띄는 손실없이 GIF 크기를 5MB에서
— 700KB로 줄였습니다

고맙게도 흥미로운 프로세스였습니다. 5.6MB mp4는 236MB gif로 끝났습니다. 내 웹 사이트에 올리는 것은 확실하지 않습니다.) gif는 1 분이 아닌 초로 제한되어야합니다.
— 카 다몬

2
JPG 파일 형식을 사용하는 대신 기본 설정으로 인해 손실이 많으므로 초기 파일 내보내기에 PNG를 사용하는 것이 좋습니다. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
— Pierre F

12

gifify 는 변환을 단순화하는 올인원 노드 기반 유틸리티입니다. 이에 따라 nodejs, npm, ffmpeg, 및 imagemagick모든 REPOS에서 사용할 수있다.

당신은 일단 npm설치는 설치 gifify와 함께 전 세계적으로 :

    npm install -g gifify

다음을 사용하여 비디오를 .GIF로 변환 할 수 있습니다.

    gifify video.mp4 -o video.gif

비디오에서 시작 및 종료 위치를 선택적으로 설정하고 텍스트 캡션을 추가 할 수도 있습니다.

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

❗️ 작은 비디오에서도 변환이 완료 되려면 몇 분이 걸릴 수 있습니다.

참고 : ffmpeg및 imagemagick일부 특정 라이브러리 (즉 libass을 따라는 fontconfig) 컴파일해야 할 수도 있습니다.


약 40 초 이상의 클립을 처리하지 않습니다 : github.com/vvo/gifify/issues/99
— oligofren

19.04 : 또 다른 필수 패키지는 gifsicle이지만 또 다른 문제가 발생합니다. github.com/vvo/gifify/issues/95 또한, npm 초보자에게 실행할 디렉토리 npm install와 루트로 실행할지 여부를 알려주 시겠습니까? 감사!
— 니콜라스 라울
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.