[FFmpeg Tutorial] Chuyển video thành ảnh động GIF

Posted on October 17th, 2018

Làm sao để chuyển video thành ảnh động GIF và tối ưu kích thước của nó? Bài viết này mình sẽ giới thiệu cách làm việc đó sử dụng FFmpeg.

Câu lệnh chuyển video thành ảnh động GIF

Câu lệnh đơn giản:

ffmpeg -i input.mp4 output.gif -hide_banner

Trong đó:

  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • output.gif là tên file output. Đồng thời, phần đuôi .gif giúp FFmpeg hiểu rằng bạn đang muốn chuyển video thành ảnh động GIF.
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,...)

Ví dụ mình convert thử một video dài 7s, kích thước 1920x1080, dung lượng ~ 5MB với câu lệnh trên và kết quả:

Convert video thành ảnh động GIF với câu lệnh đơn giản

Ảnh động GIF có kích thước cỡ ~21MB (gấp 4 lần video gốc).

Tại sao ảnh động GIF lại nặng hơn nhiều so với video tương ứng?

Bởi vì, ảnh động GIF được tạo bởi các ảnh riêng lẻ ứng với ảnh gốc. Trong khi đó, video chỉ lưu chúng lại thành các frame dạng I, P, B. Mà chỉ frame I là frame đầy đủ, còn frame P và B chỉ dùng để lưu lại sự thay đổi nhỏ giữa các frame. Điều này giải thích tại sao ảnh động GIF lại nặng hơn so với video tương ứng.

Vậy làm sao tối ưu được kích thước của ảnh động GIF?

Tối ưu kích thước ảnh động GIF

Thực ra, nếu nói tối ưu thì cũng không hẳn. Chỉ đơn giản là mình giảm kích thước của nó đi thôi.

Có 3 cách để giảm kích thước của ảnh động GIF là:

  • Giảm thời lượng của ảnh động GIF. Ví dụ: thay vì độ dài 20 giây thì mình chỉ lấy 10 giây, bắt đầu từ giây thứ 5 đến giây thứ 15 chẳng hạn.
  • Giảm kích thước của ảnh động GIF. Ví dụ: thay vì kích thước Full HD (1920x1080) thì mình giảm xuống HD (1280x720).
  • Giảm tốc độ framerate (tức số frame trên 1 giây). Ví dụ: thay vì fps=30 thì mình giảm xuống còn fps=20.

Xem thêm: [FFmpeg tutorial] Những câu lệnh FFmpeg xử lý video

Giảm thời lượng ảnh động GIF

Video input.mp4 bên trên có độ dài 7 giây. Mình muốn ảnh động GIF sẽ có độ dài 4 giây, bắt đầu từ giây thứ 2 đến giây thứ 6.

Để làm việc này, mình có thể sử dụng 1 trong 2 câu lệnh sau:

# Cách 1:
ffmpeg -i input.mp4 -ss 2 -t 4 output_reduce_1.gif -hide_banner

# Cách 2:
ffmpeg -i input.mp4 -ss 2 -to 6 output_reduce_2.gif -hide_banner

Trong đó:

  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -ss 2 xác định thời điểm bắt đầu, ở đây là giây thứ 2.
  • -t 4 xác định thời lượng muốn lấy, ở đây là 4 giây.
  • -to 6 xác định thời điểm kết thúc, ở đây là giây thứ 6.
  • output_reduce_1.gif, output_reduce_2.gif là tên file output
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,...)

Kết quả:

Kết quả sau khi giảm thời lượng ảnh động GIF

Bạn có thể thấy là ảnh động GIF lần này có kích thức cỡ ~11MB (bằng một nửa so với ảnh động GIF ban đầu ~21MB).

Giảm kích thước ảnh động GIF

Trong ví dụ trên, video có kích thước Full HD (1920x1080). Bây giờ mình sẽ giảm nó xuống HD (1280xx720) như sau:

ffmpeg -i input.mp4 -vf scale=1280:720 output_reduce_3.gif -hide_banner

Trong đó:

  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -vf là cờ dùng để khai báo việc sử dụng video filter, với công thức là scale=1280:720 - là kích thước mong muốn.
  • output_reduce_3.gif là tên file output
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,...)

Kết quả:

Kết quả sau khi giảm độ phân giải

Ảnh động GIF output_reduce_3.gif lần này cũng có kích thước cỡ ~11MB.

Giảm tốc độ framerate của ảnh động GIF

Cũng trong ví dụ trên, video có fps=30. Mình sẽ giảm tốc độ này xuống fps=20 bằng câu lệnh sau:

ffmpeg -i input.mp4 -r 20 output_reduce_4.gif -hide_banner

Trong đó:

  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -r là cờ xác định framerate mong muốn, sau đó là số tương ứng với fps (20)
  • output_reduce_4.gif là tên file output
  • -hide_banner dùng để ẩn những thông tin liên quan đến FFmpeg (phiên bản, các thư viện sử dụng,...)

Kết quả:

Kết quả sau khi giảm framerate

Lúc này, ảnh động GIF output_reduce_4.gif có kích thước cỡ ~15MB.

Kết hợp các phương pháp

Nếu như việc sử dụng 1 trong 3 cách trên vẫn chưa đem lại kết quả như mong muốn thì bạn có thể kết hợp chúng lại.

Giả sử mình sẽ kết hợp cả 3 phương pháp trên lại với nhau:

ffmpeg -i input.mp4 -ss 2 -t 4 -vf scale=1280:720 -r 20 output_reduce_5.gif -hide_banner

Kết quả:

Kết quả

WOW! Lần này, ảnh động GIF output_reduce_5.gif có kích thước tương đương với video ban đầu ~5MB.

Lời kết

Trên đây là cách chuyển video thành ảnh động GIF, cũng như các phương pháp làm giảm kích thước của ảnh động GIF.

Nếu có gì thắc mắc hoặc góp ý vui lòng để lại trong phần bình luận phía dưới. Mình sẽ cố gắng giải đáp.

★ Nếu bạn thấy bài viết này hay thì hãy theo dõi mình trên Facebook/Youtube để nhận được thông báo khi có bài viết mới nhất nhé: