Sách

Thứ Hai, 4 tháng 3, 2019

[ffmpeg Tutorial] Crop Video Với Ffmpeg

Crop video với FFmpeg

Câu lệnh cơ bản

ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
Trong đó:
  • -i là cờ dùng để xác định input, sau đó là tên file (input.mp4)
  • -vf dùng để thông báo việc sử dụng video filter. Tiếp theo đó là công thức sử dụng. Để crop video với FFmpeg thì mình sử dụng công thức là crop=w:h:x:y.
    • w: là chiều rộng video mà bạn muốn thu được.h: là chiều cao video mà bạn muốn thu được.x: là toạ độ trên trục x điểm top, left của video mong muốn, mặc định x = 0.y: là toạ độ trên trục y điểm top, left của video mong muốn, mặc định y = 0.
  • output.mp4 là tên file output

Hệ trục toạ độ

Có thể bạn vẫn chưa hiểu rõ câu lệnh trên cho lắm. Nên mình đã chuẩn bị một hình minh hoạ cho bạn dễ hiểu hơn:


Hệ trục tọa độ trên video
Hệ trục tọa độ trên video

Ví dụ minh hoạ

Giả sử mình có một video với độ phân giải 1920×1080. Mình muốn crop lấy video với độ phân giải 1280×720 và điểm top, lef có toạ độ là (320, 180).
Khi đó, mình có w = 1280, h = 720, x = 320, y = 180. Suy ra câu lệnh cần dùng là:
ffmpeg -i input.mp4 -vf "crop=1280:720:320:180" output.mp4

Sử dụng biến số

Trong ví dụ trên, mình cố tình cắt lấy video nằm ở chính giữa của video gốc (cách đều 4 phía).
Vì mình đã chủ động tính toán:
  • x = 320 = (1920 – 1280) / 2
  • y = 180 = (1080 – 720) / 2
Hay tổng quát hoá: để cắt lấy video có kích thước w, h từ video gốc W, H và cách đều 4 phíathì:
  • x = (W – w) / 2
  • y = (H – h) / 2
Trong đó:
  • Giá trị w, h là giá trị mình mong muốn
  • Giá trị W, H là giá trị kích thước video ban đầu. Dĩ nhiên, bạn có thể lấy được kích thước của video này thủ công. Hoặc bạn có thể sử dụng biến số có sẵn cung cấp bởi FFmpeg. Đó là in_w tương ứng với chiều rộng video gốc, in_h tương ứng với chiều cao video gốc.
Nếu áp dụng biến số này thì câu lệnh trong ví dụ trên trở thành:
ffmpeg -i input.mp4 -vf "crop=1280:720:(in_w-1280)/2:(in_h-720)/2" output.mp4

Lời kết

Trên đây là cách để crop video với FFmpeg. Nếu có gì thắc mắc hay góp ý, bạn vui lòng để lại câu hỏi xuống phía dưới. Mình sẽ cố gắng giải đáp nhé!
Xin chào và hẹn gặp lại!