커맨드 라인을 통해 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!'

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

참고 : ffmpegimagemagick일부 특정 라이브러리 (즉 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.