Làm cách nào để thay đổi kích thước khung hình, giữ nguyên chiều rộng (sử dụng ffmpeg)?


21

Tôi mới sử dụng trang web StackExchange này và sử dụng bộ mã hóa FFmpeg. Tôi có một video có kích thước 720x480 (3: 2) mà tôi muốn đổi thành 720x406 (16: 9) để khớp với các video khác tôi có cho một trang web. Tôi đã thử các kết hợp lệnh khác nhau, bao gồm:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Điều tôi kết thúc là một video được thu nhỏ theo chiều cao được chỉ định, nhưng không giữ được chiều rộng. Nó kết thúc ở 608x406 hoặc khoảng đó. Tôi đã chơi với các phiên bản GUI khác nhau của FFmpeg ngày hôm nay và dường như chúng cũng làm điều tương tự.

Điều gì sẽ là các tùy chọn / tham số thích hợp để truyền vào (giả sử tôi sẽ có nhiều quyền kiểm soát hơn thông qua dòng lệnh) để đạt được kích thước khung mong muốn?

Câu trả lời:


36

sử dụng bộ lọc tỷ lệ sẽ làm điều đó, nhưng có thêm một chút cho nó.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

sẽ tạo một bộ phim với kích thước pixel yêu cầu, nhưng nếu bạn nhìn vào đầu ra, bạn sẽ thấy rằng nó thêm thông tin vào siêu dữ liệu để nó sẽ phát lại ở cùng tỷ lệ khung hình như ban đầu, bằng cách sử dụng các pixel không vuông. Vì vậy, nếu bạn muốn kéo dài phim một cách biến dạng thành tỷ lệ khung hình mới, bạn cần đặt thủ công tỷ lệ khung hình pixel, được gọi là SAR cho "Tỷ lệ khung hình mẫu", do đó, sử dụng pixel vuông:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Ngoài ra, bạn có thể đặt tỷ lệ khung hình hiển thị thành bất cứ điều gì bạn muốn, do đó:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

Những gì tôi đang làm với lệnh -vf và x = y, z = một biểu thức theo sau là tạo ra một chuỗi các bộ lọc . Các bộ lọc có thể khá phức tạp, nhưng trong cách sử dụng đơn giản nhất, chúng có dạng effect=parameter,nexteffect=anotherparametervà chúng được xử lý theo thứ tự bạn viết chúng.

Bạn có thể muốn đặt các lệnh bổ sung cho codec, v.v., ví dụ: -c:v libx264để sử dụng bộ mã hóa mp4 x264 và một cái gì đó giống như -crf 20đặt hệ số tốc độ không đổi thành 20 (thường là một sự thỏa hiệp khá tốt giữa kích thước và chất lượng). Vì vậy, một lệnh hoàn toàn hợp lý sẽ trông như sau:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

slowCấu hình chính tốt cho khả năng tương thích thiết bị, cài đặt trước cho bộ mã hóa libx264 là sự cân bằng khá tốt về tốc độ và chất lượng, vì vậy đây là một công việc mã hóa web nói chung tốt. Bạn có thể làm cho nó nhanh hơn bằng cách sử dụng fasthoặc veryfastchậm hơn veryslowplacebosẽ làm cho nó trở nên tốt hơn một chút so veryslowvới chi phí thời gian xử lý nhiều hơn (do đó là tên).

BTW Không sử dụng bản sao -c , có nghĩa là chỉ cần sao chép các video và âm thanh mà không làm bất cứ điều gì cho họ ở tất cả , vì vậy không có gì bạn làm về mặt quy mô, codec, bitrate vv sẽ có hiệu lực.


1
Nếu bạn đang sử dụng các phiên bản gần đây của ffmpeg, bạn không cần phải quy định x264 là codec nữa, nhưng vẫn có thể đáng để xem những cài đặt nào bạn muốn.
stib

1
Tôi nghĩ siêu dữ liệu chỉ có trường DAR. Vì vậy, sử dụng setsarchỉ là gián tiếp thiết lập DAR?
jiggunjer

Tôi phải sử dụng "-c copy", nhưng ở mặt khác tôi muốn thay đổi kích thước màn hình. Làm thế nào tôi có thể đạt được điều này?
Dr.jacky

1
@ Mr.Hyde bạn nên hỏi câu hỏi này như một câu hỏi mới thay vì hỏi trong một bình luận
stib
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.