Làm cách nào để tạo một GIF hoạt hình từ video MP4 thông qua dòng lệnh?


119

Tôi muốn làm một phim hoạt hình .giftừ một .mp4video. Tôi muốn làm điều đó từ dòng lệnh, vì vậy xin vui lòng chỉ liệt kê các công cụ dòng lệnh.


Bạn có thể sử dụng tập lệnh này trên Github sử dụng FFMPEG và tạo bảng màu trung gian để có chất lượng hình ảnh tốt hơn.
troyane

Câu trả lời:


128

ffmpeg 3.4.4 có thể thực hiện trực tiếp trên Ubuntu 18.04

Bạn có thể muốn sử dụng một cái gì đó như:

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

Kiểm tra thủ tục tạo dữ liệu được mô tả trên bài đăng này .

Một cách trực tiếp hơn:

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

cũng hoạt động, nhưng GIF đầu ra sẽ lớn hơn video đầu vào, vì các định dạng video nén thông minh trên các khung.

Phân tích đối số:

  • ulimit -Sv 1000000: đặt kích thước bộ nhớ tối đa 1Gb cho chương trình.

    Chủ yếu là tôi đảm bảo rằng lệnh không sử dụng bộ nhớ không giới hạn như các lần thử trước.

    500Mb khiến ffmpeg không tải được thư viện chia sẻ ... thời gian nâng cấp RAM của bạn?

  • -ss 00:00:03 -to 00:00:06: thời gian bắt đầu và kết thúc để cắt video từ.

    Không, GIF không phải là cách tốt nhất để cướp biển phân phối video trực tuyến.

    Xem thêm: https://stackoverflow.com/questions/18444194/cuting-the-video-basing-on-start-and-end-time-USE-ffmpeg

  • -vf scale=512:-1: tạo các 512pixel đầu ra theo chiều cao và điều chỉnh độ rộng để duy trì tỷ lệ khung hình.

    Đây là trường hợp sử dụng phổ biến cho hình ảnh cho web, có xu hướng có độ phân giải nhỏ hơn nhiều so với video.

    Nếu bạn xóa tùy chọn này, GIF đầu ra có cùng chiều cao với video đầu vào.

    Ví dụ ffprobe: chiều cao của video gốc có thể được tìm thấy với : https://superuser.com/questions/595177/how-to-retrieve-video-file-inif-from-command-line-under-linux/1035178#1035178 và là 1024 x 1024 trong trường hợp của chúng tôi.

  • -r 15: lấy mẫu FPS.

    Ví dụ: video gốc là 30 FPS, vì vậy -r 15có nghĩa là ffmpegsẽ chọn một khung hình trong mỗi 2 ( = 30 / 15).

    Tuy nhiên, FPS đầu ra cảm nhận được điều chỉnh để phù hợp với đầu vào, do đó bạn sẽ không nhận thấy tốc độ tăng, chỉ có độ chi tiết cao hơn.

    Có thể tìm thấy FPS đầu vào ffprobevà tổng số khung hình đầu vào có thể được mediainfogiải thích tại: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-a-video-on-the-linux-lệnh-line / 1044894 # 1044894

    Tôi khuyên bạn nên tùy chọn này vì các định dạng video thường có tốc độ khung hình cao hơn do độ phân giải lớn hơn. Với các GIF nhỏ hơn, tốc độ khung hình thấp hơn ít được chú ý hơn và vì vậy chúng ta có thể bỏ qua một số khung và tạo các GIF nhỏ hơn.

Trước ngày 18.04: ffmpeg+ convertmột lớp không có tệp trung gian

ffmpegkhông thể xử lý GIF trước đây. Điều tốt nhất tôi có là một cái gì đó cùng:

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

Giải thích một số lập luận:

  • -loop 0: thêm trường đếm mở rộng Netscape Gif vào đầu ra. 0 có nghĩa là vòng lặp vô hạn như mô tả tại địa chỉ: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog , firefoxvà crom tất cả các vòng lặp vô hạn theo mặc định ngay cả khi không nó, vì vậy tôi không chắc chắn như thế nào cần thiết nó là nữa

  • -delay 5: thời gian chờ đợi trước khi hiển thị khung tiếp theo, tính bằng hundreths của giây, như được mô tả tại: https://en.wikipedia.org/wiki/GIF#Animated_GIF byte 324. Có 100nghĩa là 1 FPS, 5có nghĩa là 1 / 0.5 == 20FPS.

Ngay cả khi bạn giảm chiều cao và tốc độ khung hình, GIF đầu ra vẫn có thể lớn hơn video, vì các định dạng video không phải là GIF "thực" nén trên các khung, trong khi GIF chỉ nén từng khung hình.

Một trực tiếp:

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

đã hoạt động, nhưng gần như đã giết chết máy tính của tôi vì tràn bộ nhớ và tạo ra một ouptput lớn hơn 100 lần cho tệp đầu vào 2Mb của tôi. Có thể một ngày nào đó ImageMagick sẽ bắt kịp.

Xem thêm: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-USE-ffmpeg-with-reasonable-quality

Đã thử nghiệm trên Ubuntu 17.10.


1
Xin hãy giải thích ;-)
Ciro Santilli 心 心 事件

1
Độ trễ của bạn không khớp với giá trị -r của bạn (gif kết quả là tốc độ gấp 2 lần). Ngoài ra, bạn đã thêm một đối số tỷ lệ mà không có lý do rõ ràng (nó làm cho gif thực sự nhỏ).
asmeker

2
Tôi đồng ý. Gifs kích thước nhỏ là tốt hơn cho web. Cảm ơn vì scale=320:-1
zombic

2
Đối với những người đang tự hỏi: loại bỏ -r 10sẽ đưa GIF trở lại tốc độ bình thường.
Mitch

2
Tôi có một gif lớn hơn 20% so với mp4: O
Adam Goldman

113

Hai bước:

  • Trích xuất hình ảnh từ video

    Tạo một thư mục được gọi là khung trong cùng thư mục với .mp4tệp của bạn . Sử dụng lệnh:

    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
    

    nguồn

  • Chuyển đổi hình ảnh sang 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
    

    Tài liệu: chuyển đổi tùy chọn gif

Bạn sẽ kết thúc với một tệp khá lớn, hãy xem hướng dẫn ảo thuật hình ảnh để tối ưu hóa gif trên các tùy chọn bạn có thể thêm vào lệnh bước thứ hai để có được một tệp nhỏ hơn.


1
câu trả lời tuyệt vời - một số thông tin bổ sung: ffmpeg có thể được cài đặt bằng cách sử dụng chỉ đường ở đây
chepyle

3
Hãy nhớ rằng framesthư mục phải tồn tại để lệnh đầu tiên hoạt động.
totymedli

3
Đối với những người muốn một cách nhanh chóng để tối ưu hóa thường hoạt động và quá lười để đọc liên kết, chỉ cần thêm -layers Optimizevào convertlệnh cuối cùng trước đó *.jpg. Kiểm tra đầu ra mặc dù, nó có thể bị ảnh hưởng. Đối với tôi, nó đã giảm kích thước gif từ 5 MB xuống 700 KB mà không giảm chất lượng
rõ rệt

Cảm ơn đó là một quá trình thú vị, một mp4 5,6 MB đã kết thúc một gif 236 MB, không chắc chắn tôi sẽ đưa nó lên trang web của mình;) Có thể một gif cần được giới hạn trong vài giây thay vì một phút.
thảo quả

2
Thay vì sử dụng định dạng tệp JPG, rất mất mát với cài đặt mặc định, tôi khuyên bạn nên sử dụng PNG để xuất tệp ban đầu. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F

12

gifify là một tiện ích dựa trên nút tất cả trong một giúp đơn giản hóa việc chuyển đổi. Nó phụ thuộc vào nodejs, npm, ffmpeg, và imagemagickđó là tất cả có sẵn trong Repos.

Khi bạn đã npmcài đặt, bạn có thể cài đặt gififytrên toàn cầu với:

    npm install -g gifify

Một video có thể được chuyển đổi thành .GIF với:

    gifify video.mp4 -o video.gif

Bạn cũng có thể tùy ý đặt vị trí bắt đầu và kết thúc trong video và thêm chú thích văn bản:

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

Có thể mất vài phút để chuyển đổi hoàn thành ngay cả với các video nhỏ hơn.

LƯU Ý: ffmpegimagemagickcó thể cần được biên dịch với một số thư viện cụ thể (ví dụ libass và fontconfig tương ứng).


Không xử lý các clip xấp xỉ> 40 giây: github.com/vvo/gifify/issues/99
oligofren

19.04: Một gói bắt buộc khác là gifsicle, nhưng sau đó, một vấn đề khác xảy ra: github.com/vvo/gifify/issues/95 Ngoài ra, bạn có phiền khi cho chúng tôi biết những người mới npm trong thư mục nào để chạy npm installvà có nên chạy nó dưới quyền root hay không? Cảm ơn!
Nicolas Raoul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.