Tôi thấy rằng có một -threads <count>
tùy chọn dòng lệnh trong ffmpeg. Giá trị mặc định của tùy chọn này là gì?
Tôi thấy rằng có một -threads <count>
tùy chọn dòng lệnh trong ffmpeg. Giá trị mặc định của tùy chọn này là gì?
Câu trả lời:
nó phụ thuộc vào codec được sử dụng, phiên bản ffmpeg và số lượng lõi CPU của bạn. Đôi khi nó chỉ đơn giản là một luồng trên mỗi lõi. Đôi khi nó phức tạp hơn như:
Với libx264, đó là lõi x 1.5 cho các luồng khung và lõi x 1 cho các luồng cắt.
Tính đến năm 2014, nó sử dụng một con số tối ưu.
Bạn có thể xác minh điều này trên máy tính đa lõi bằng cách kiểm tra tải CPU (Linux : top
, Windows: trình quản lý tác vụ) với các tùy chọn khác nhau để ffmpeg:
-threads 0
(tối ưu);
-threads 1
(đơn luồng);
-threads 2
(2 luồng ví dụ như Intel Core 2 Duo);
không có (mặc định, cũng tối ưu).
Chỉnh sửa năm 2015: trên CPU 12 lõi, một số lệnh ffmpeg có Linux top
hiển thị tối đa 200% cpu (chỉ có 2 lõi), bất kể số lượng được đưa ra là bao nhiêu -threads
. Vì vậy, mặc định vẫn có thể là tối ưu theo nghĩa "tốt như nhị phân ffmpeg này có thể nhận được", nhưng không tối ưu theo nghĩa "khai thác triệt để CPU leet của tôi".
Vào năm 2015 trên Ubuntu 14.04 với ffmpeg 0.8.10-6, nó đã sử dụng 1 lõi trên hệ thống 4 lõi.
htop
cho thấy điều này; chỉ có một lõi được sử dụng và tôi có tốc độ chuyển đổi 16 khung hình / giây cho video FullHD.
Sử dụng -threads 4
làm cho tất cả các lõi CPU của tôi đạt 100% và tôi có tỷ lệ chuyển đổi là 47 khung hình / giây.
Tôi đã sử dụng lệnh sau:
$ ffmpeg -i foo.mp4 -y -target pal-dvd -aspect 16:9 dvd-out.mpg
Một số câu trả lời này hơi cũ và tôi chỉ muốn thêm rằng với ffmpeg 4.1
mã hóa của tôi libx264
, tất cả 6 lõi / 12 luồng của hệ thống Ryzen 5 2600X của tôi đã được tối đa mà không có bất kỳ -thread
đối số nào .
-vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecode
vì vậy đó là một vài biến để cô lập. Thêm vào -threads 12
không có hiệu lực.
Tôi đã chơi với chuyển đổi trong một máy ảo CentOS 6.5 (Ryzen 1700 8c / 16t - vm được gán 12 trong số 16 lõi). Các thử nghiệm với phim 480p ghi được như sau:
Tùy chọn chủ đề / Tỷ lệ chuyển đổi (fps @ 60 giây)
(none/default)/130fps
-threads 1/70fps
-threads 2/120fps
-threads 4/185fps
-threads 6/228fps
-threads 8/204fps
-threads 10/181fps
Phần thú vị là tải CPU (sử dụng htop
để xem nó).
Không sử dụng -threads
tùy chọn nào ở phạm vi 130fps với tải trọng trải đều trên tất cả các lõi ở mức tải thấp.
Sử dụng 1 luồng đã thực hiện chính xác điều đó, tải một lõi ở mức 100%. Sử dụng bất cứ điều gì khác dẫn đến một tình huống tải lây lan khác.
Như bạn có thể thấy, cũng có một điểm lợi nhuận giảm dần, vì vậy bạn phải điều chỉnh tùy chọn -threads cho máy cụ thể của mình. Đối với thiết lập của tôi, cụ thể, sử dụng -threads 6 (trên máy 12 lõi) đã mang lại FPS tốt nhất khi chuyển đổi video (từ h264 sang x264 ở tốc độ bit khác nhau để buộc chuyển đổi) và trả về thực sự làm giảm nhiều luồng tôi đã ném vào nó
Nó cũng có thể là một vấn đề bộ nhớ - nó chỉ có 1GB được gán cho VM. Tôi có thể điều chỉnh nó và xem nếu điều đó thay đổi bất cứ điều gì. Tuy nhiên - điều đó cho thấy rằng việc sử dụng -threads
tùy chọn có thể tăng hiệu suất, vì vậy hãy chạy một số thử nghiệm trên máy cụ thể của bạn ở các cấp độ khác nhau để tìm điểm thiết lập của bạn.
giả sử bạn đã kích hoạt luồng, nó chỉ định số lõi gấp 1,5 lần.
-x264-params sliced-threads=1
. Hoặc thông qua việc sử dụng -tune zerolatency
.