Ffmpeg sử dụng bao nhiêu luồng theo mặc định?


47

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:


24

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.


Cảm ơn. Bạn có tham chiếu đến các mặc định cho một số codec tiêu chuẩn được hỗ trợ bởi ffmpeg không?
Edward Dale

6
Đừng dựa vào nó. Ffmpeg 0.7.8 của tôi trên Linux sử dụng 1 luồng theo mặc định không có vấn đề gì.
Barafu Albino

Giá trị nào có thể được sử dụng để có được kết quả tốt hơn? PS Tôi đang sử dụng FFMpeg trong khung Android.
Kẻ giết người

23

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 tophiể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".


1
Lưu ý rằng điều này dường như chỉ đúng với mã hóa, không phải xử lý chung. Nếu nó không thực sự tạo ra các khung đầu ra thì nó sẽ không song song. ví dụ: nếu bạn không rung chuyển từ 02:00 trở đi thì bạn sẽ chỉ nhận được sự song song từ 02:00 trở đi, nhưng mọi thứ cho đến 02:00 vẫn cần được xử lý một cách an toàn.
Mehrdad

6

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. htopcho 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 4là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

6

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.1mã 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 .


Tôi có 1800X và tôi đang quan sát mức độ sử dụng không quá 20% trải rộng trên 16 luồng của nó, nhưng tôi cũng đang sử dụng một vài đối số tùy chọn: -vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecodevì vậy đó là một vài biến để cô lập. Thêm vào -threads 12không có hiệu lực.
Elaskanator

3

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 -threadstù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 -threadstù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.


Bạn có thể vui lòng thêm những gì bạn có nghĩa là "chuyển đổi"? Lý tưởng nhất, lệnh chính xác.
Ondra ižka

4.1.3 trên Ubuntu 18.04 và kết quả rất giống nhau. Mặc định là "tải thấp trên tất cả các lõi".
Roel Van de Paar

Tôi đoán lý do tại sao bạn đạt tối ưu ở 6 luồng trên máy "12 lõi" (cpu không được chỉ định, khác với đầu tiên được liệt kê) là 6 có thể là số lõi thực và 12 số luồng?
Roel Van de Paar

1

giả sử bạn đã kích hoạt luồng, nó chỉ định số lõi gấp 1,5 lần.


1,5 x số lõi cho chủ đề khung. 1 x số lõi cho chủ đề lát. Điều này là cụ thể cho (lib) x264. Tôi không chắc phân bổ là gì cho các bộ mã hóa khác.
llogan

@LordNeckbeard Làm thế nào để chuyển đổi giữa luồng khung và luồng cắt lát!?
Dr.jacky

1
@ Mr.Hyde Có lẽ với -x264-params sliced-threads=1. Hoặc thông qua việc sử dụng -tune zerolatency.
llogan 17/08/2015
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.