Cách giảm thiểu sử dụng CPU / bộ nhớ bằng ffmpeg khi quay video


13

Tôi sử dụng FFmpeg để thực hiện quay màn hình video từ màn hình Xvfb.

Hiện tại tôi gọi nó với:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

Khi tôi quay video từ khoảng 5 phiên Xvfb, mức sử dụng CPU của tôi rất cao và có độ trễ vì nó. Ngoài ra sử dụng bộ nhớ là khoảng 300 MB cho mỗi quá trình ffmpeg.

Tôi nên sử dụng tham số nào cho ffmpeg để giảm thiểu việc sử dụng tài nguyên máy tính (đặc biệt là CPU và bộ nhớ) khi thực hiện quay màn hình video?

Câu trả lời:


17

1. Tạo đầu ra RGB không mất dữ liệu trước

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • Đầu vào là RGB, vì vậy sử dụng bộ mã hóa libx264rgb sẽ tránh việc chuyển đổi từ RGB sang YUV có khả năng xảy ra chậm nếu bạn sử dụng libx264 đơn giản.

  • Điều này sử dụng cài đặt trước mã hóa x264 nhanh nhất: cực nhanh.

  • Đầu ra sẽ mất mát vì -crf 0được sử dụng.

2. Sau đó mã hóa lại

Đầu ra từ lệnh đầu tiên sẽ rất lớn và hầu hết người chơi câm không thể xử lý RGB H.264 để bạn có thể mã hóa lại:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Bạn có thể thử nghiệm với -crfgiá trị để kiểm soát chất lượng đầu ra. Một phạm vi lành mạnh chủ quan là 18-28, trong đó 18 là mất thị giác hoặc gần như vậy. Mặc định là 23.

  • Sử dụng các cài đặt trước chậm nhất bạn có sự kiên nhẫn cho: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Mặc định là medium.

  • Tôi đã thêm vào -vf format=yuv420pđể đảm bảo đầu ra hoạt động với các trình phát câm như QuickTime và Windows Media Player. Bạn có thể bỏ qua phần này nếu bạn đang tải nó lên YouTube hoặc chỉ phát trên VLC, mpv, MPlayer hoặc bất kỳ trình phát dựa trên FFmpeg nào khác.

Cũng thấy


Tôi quay video từ màn hình không mặc định (đó là Xvfb) để nó có thể là bất kỳ số nào
Andrei Botalov

@AndreyBotalov Bạn đã thử phương pháp lossless chưa? Nó đã thực hiện tốt hơn cho bạn?
llogan

1
Hiện tại tôi gọi ffmpegvới -preset superfasttham số (tôi chưa thử -crf). Nó tốn ít tài nguyên hơn trong trường hợp đó và tạo ra các video có kích thước đủ tốt.
Andrei Botalov

@AndreyBotalov -crf 23được sử dụng theo mặc định nếu bạn không khai báo một giá trị, nhưng dù sao nếu superfastnó là đủ cho bạn thì có lẽ vấn đề đã được giải quyết.
llogan

1
Bạn cũng có thể thử mã hóa phần cứng qua h264_nvenc (nvidia) hoặc h264_qsv (cpu intel hiện đại). Điều này sẽ chuyển gánh nặng mã hóa từ CPU của bạn sang phần cứng h264 chuyên dụng.
Kenn

4

Tốt hơn là tập trung vào việc sử dụng các tùy chọn ffmpeg khác nhau sẽ đạt được kết quả tương tự theo cách sử dụng ít tài nguyên hơn. Điều đó nói rằng, có nhiều cách để sử dụng ít tài nguyên hơn nếu bạn thực sự cần phải hoàn thành một việc cụ thể với ffmpeg và nó đang sử dụng quá nhiều tài nguyên.

Bạn có thể giảm mức độ ưu tiên của ffmpegquy trình CPU:

  • Phương thức đầu cuối: Sử dụng nicelệnh để thay đổi mức ưu tiên của quy trình : nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. Trong Linux, số ưu tiên ( niceđịnh dạng lệnh nice -n <priority> <command>) nằm trong khoảng từ -20 đến 20. Số nguyên càng lớn, mức độ ưu tiên càng thấp ; trung tính là 0. Nếu bạn sử dụng lệnh tôi đã đưa cho bạn và đặt thành 8, CPU sẽ cho quá trình ít thời gian hơn, có vẻ như ít "năng lượng" hơn. Nếu con số này quá cao hoặc hai mức thấp, dĩ nhiên, bạn có thể thay đổi nó.
  • Phương pháp GUI: Điều này không được khuyến nghị vì nó cho phép bạn kiểm soát số lượng chính xác ít hơn và nó không có hiệu lực ngay khi quá trình bắt đầu. Tuy nhiên, nó dễ hiểu hơn. Với ffmpegviệc chạy, mở System Monitor. Cuộn xuống quá trình được đặt tên ffmpeg, nhấp chuột trái vào nó để chọn, nhấp chuột phải vào nó và đặt mức độ ưu tiên thành "Thấp" hoặc "Rất thấp".

Nếu bạn cũng lo lắng về việc sử dụng bộ nhớ, hãy biết rằng không thể nói quá trình chỉ chiếm quá nhiều bộ nhớ mà vẫn chạy. Nhân tự động điều khiển cấp phát bộ nhớ cho các quy trình. Có một cách để lồng các quy trình, với timeouttập lệnh , để khi một quy trình và bất kỳ quy trình con nào chiếm quá nhiều bộ nhớ (giới hạn do bạn đặt), chúng sẽ bị chấm dứt an toàn và thông báo được hiển thị. Tuy nhiên, nếu một quá trình chỉ được cung cấp quá nhiều bộ nhớ (nói bởi kernel) và nó yêu cầu thêm bộ nhớ mà nó không thể có, nó sẽ bị sập.

Một số điều hữu ích cần biết về:

Sử dụng kiến thức về Cgroups, bạn có thể làm rất nhiều điều thú vị như kiểm soát swappiness của một quá trình.


2
Nếu tôi hiểu chính xác việc đặt ffmpeg vào hàng đợi ưu tiên thấp hơn sẽ khiến nó tạo ra các video có độ trễ không mong muốn.
Andrei Botalov

1
Hmm ... Tôi không thấy gì trên mạng nói rằng ... Bạn có nguồn nào chỉ ra điều đó không? (Nếu không, nó sẽ là một lỗi).
Richard

2
Nếu tôi hiểu chính xác mức độ ưu tiên thấp hơn có nghĩa là ffmpeg sẽ có ít thời gian xử lý hơn so với hiện tại. Nhưng bộ xử lý được tải gần như 100% nên tôi nghĩ rằng việc tái vũ trang sẽ không giúp ích gì
Andrei Botalov

1
Điều này được thiết kế để hạn chế việc sử dụng CPU của quy trình, vì vậy nếu CPU của bạn đang chạy ở mức 100%, nó sẽ có thời gian xử lý dễ dàng hơn.
Richard

4
Tôi đã -1 điều này, vì cho dù bạn thay đổi mức độ ưu tiên như thế nào, nó sẽ chỉ làm cho nó tồi tệ hơn. Đặt mức ưu tiên thấp hơn sẽ giảm thời gian CPU cho ffmpeg dẫn đến nhiều khung hình bị giảm hơn hoặc bằng cách nâng mức ưu tiên, nó sẽ làm chậm các quá trình khác trên hệ thống hơn nữa. Cả hai kết quả đều không mong muốn.
gertvdijk

0

-re (đầu vào) Đọc đầu vào ở tốc độ khung hình gốc. Chủ yếu được sử dụng để mô phỏng một thiết bị lấy hoặc luồng đầu vào trực tiếp (ví dụ: khi đọc từ tệp). Không nên được sử dụng với các thiết bị lấy thực tế hoặc luồng đầu vào trực tiếp (nơi có thể gây mất gói). Theo mặc định, ffmpeg cố gắng đọc (các) đầu vào càng nhanh càng tốt. Tùy chọn này sẽ làm chậm việc đọc (các) đầu vào về tốc độ khung hình gốc của (các) đầu vào. Nó rất hữu ích cho đầu ra thời gian thực (ví dụ: phát trực tiếp).


"Không nên được sử dụng với các thiết bị lấy thực tế", chẳng hạn như x11grab.
khẩu hiệu
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.