Với các phiên bản ffmpeg mới hơn, bạn có thể sử dụng tùy chọn scale
của bộ lọc force_original_aspect_ratio
. Ví dụ: để điều chỉnh video thành 1280 × 720 mà không cần nâng cấp (xem bài đăng này để biết thêm thông tin):
ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
Ở đây, scale
bộ lọc chia tỷ lệ thành 1280 × 720 nếu video đầu vào lớn hơn thế. Nếu nó nhỏ hơn, nó sẽ không được nâng cấp. Bộ pad
lọc là cần thiết để đưa video đầu ra lên 1280 × 720, trong trường hợp tỷ lệ khung hình hoặc kích thước của nó khác với kích thước mục tiêu.
Với các phiên bản ffmpeg cũ hơn, có một cách giải quyết có phần khó khăn. Đầu tiên, xác định chiều rộng, chiều cao và tỷ lệ khung hình của đầu ra của bạn. Điều này sẽ tiết kiệm cho chúng tôi một số gõ.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Bây giờ, hãy áp dụng lệnh bộ lọc siêu phức tạp mà Jim Worrall đã viết :
ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4
Tôi sẽ không thực sự giải thích tất cả những gì nó làm, nhưng về cơ bản, bạn có thể cung cấp cho nó bất kỳ video nào và nó sẽ chỉ hạ thấp, không cao cấp. Nếu bạn sẵn sàng, bạn có thể phân tích bộ lọc thành các biểu thức riêng lẻ. Có thể rút ngắn điều này, nhưng nó cũng hoạt động như vậy.