Video kaydederken ffmpeg tarafından CPU / bellek kullanımını en aza indirme


13

Xvfb ekranından video ekran çekimi yapmak için FFmpeg kullanıyorum.

Şu anda ile çağırıyorum:

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

Yaklaşık 5 Xvfb oturumundan video kaydederken CPU kullanımım çok yüksek ve bu nedenle gecikmeler var. Ayrıca ffmpeg işlemlerinin her biri için bellek kullanımı yaklaşık 300 MB'dir.

Video ekran görüntüsü alırken bilgisayar kaynakları kullanımını (özellikle CPU ve bellek) en aza indirmek için hangi ffmpeg parametrelerini kullanmalıyım?

Yanıtlar:


17

1. Önce kayıpsız bir RGB çıkışı yapın

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • Giriş RGB'dir, bu nedenle libx264rgb kodlayıcısının kullanılması, düz libx264 kullanırsanız oluşabilecek potansiyel olarak yavaş RGB'den YUV dönüşümüne engel olur.

  • Bu, en hızlı x264 kodlama ön ayarını kullanır: ultrafast.

  • Kullanılan çıkış kayıpsız olacaktır -crf 0.

2. Sonra yeniden kodlayın

İlk komutun çıkışı çok büyük olacak ve aptal oyuncuların çoğu RGB H.264'ü işleyemez, böylece yeniden kodlayabilirsiniz:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • -crfÇıktı kalitesini kontrol etmek için değeri deneyebilirsiniz . Sübjektif olarak aklı başında bir ürün yelpazesi 18-28'dir, burada 18 görsel olarak kayıpsızdır ya da neredeyse öyle. Varsayılan değer 23'tür.

  • Sizin için sabır yavaş hazır ayarı kullanın: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Varsayılan değer medium.

  • -vf format=yuv420pÇıktının QuickTime ve Windows Media Player gibi aptal oyuncularla çalışmasını sağlamak için ekledim . YouTube'a yüklüyorsanız veya yalnızca VLC, mpv, MPlayer veya herhangi bir FFmpeg tabanlı oynatıcıda oynatıyorsanız bunu atlayabilirsiniz.

Ayrıca bakınız


Varsayılan olmayan ekrandan (Xvfb) video çekiyorum, bu yüzden herhangi bir sayı olabilir
Andrei Botalov

@AndreyBotalov Kayıpsız yöntemi denediniz mi? Sizin için daha iyi performans gösterdi mi?
llogan

1
Şu anda parametre ffmpegile çağırıyorum -preset superfast(denemedim -crf). Bu durumda daha az kaynak alır ve yeterince iyi boyutta videolar üretir.
Andrei Botalov

@AndreyBotalov -crf 23, bir değer bildirmezseniz varsayılan olarak kullanılır, ancak yine de superfastsizin için yeterliyse, sorun belki çözülür.
llogan

1
Ayrıca h264_nvenc (nvidia) veya h264_qsv (modern intel cpu) üzerinden donanım kodlamasını deneyebilirsiniz. Bu, kodlama yükünü CPU'nuzdan özel h264 donanımına kaydırır.
Kenn

4

Aynı sonucu daha az kaynak kullanan bir şekilde elde edecek farklı ffmpeg seçeneklerini kullanmaya odaklanmak daha iyidir. Bununla birlikte, ffmpeg ile belirli bir şeyi başarmanız gerekiyorsa ve daha fazla kaynak kullanıyorsa, daha az kaynak kullanmanın yolları vardır.

ffmpegCPU işleminin önceliğini azaltabilirsiniz :

  • Terminal yöntemi: kullanın nicesürecin önceliğini değiştirmek için komut: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. Linux'ta, öncelik numarası ( nicekomut biçimi nice -n <priority> <command>) -20 ile 20 arasında değişir. Tamsayı ne kadar büyük olursa , öncelik o kadar düşük olur; nötr 0'dır. Size verdiğim komutu kullanır ve 8 olarak ayarlarsanız, CPU işleme daha az zaman verir, bu da daha az "güç" gibi görünür. Bu sayı çok yüksek veya iki düşükse, elbette değiştirebilirsiniz.
  • GUI yöntemi: Bu, tam sayı üzerinde daha az kontrol sağladığından ve işlem başlar başlamaz yürürlüğe girmediği için önerilmez. Ancak, daha anlaşılır. İle ffmpegçalışan sistem monitörünün açılmasını. Adlı işleme ilerleyin ffmpeg, seçmek için sol tıklayın, sağ tıklayın ve önceliği "Düşük" veya "Çok Düşük" olarak ayarlayın.

Bellek kullanımı konusunda da endişeleriniz varsa, bir işleme yalnızca çok fazla bellek alıp hala çalışmasını söylemenin mümkün olmadığını bilin. Çekirdek, işlemler için bellek tahsisini otomatik olarak kontrol eder. İşlemleri timeoutkomut dosyasıyla kafeslemenin bir yolu vardır , böylece bir işlem ve alt süreçler çok fazla bellek aldığında (sizin belirlediğiniz bir sınır) güvenli bir şekilde sonlandırılır ve bir bildirim görüntülenir. Ancak, bir işleme yalnızca çok fazla bellek (çekirdek tarafından söyleyin) verilirse ve sahip olamayacağı daha fazla bellek isterse, çökecektir.

Bilmeniz gereken bazı yararlı şeyler:

Cgroups bilgisini kullanarak , bir sürecin değiş tokuşunu kontrol etmek gibi birçok eğlenceli şey yapabilirsiniz .


2
Eğer ffmpeg'i daha düşük öncelik sırasına koymak doğru bir şekilde anlarsam, istenmeyen gecikmeli videolar üretmesini sağlar.
Andrei Botalov

1
Hmm ... Çevrimiçi olarak hiçbir şey görmüyorum ... Bunu gösteren bir kaynağınız var mı? (Değilse, bir hata olmalı).
Richard

2
Daha düşük önceliği anlarsam, ffmpeg'in şimdi olduğundan daha az işlemci süresine sahip olacağı anlamına gelir. Ancak işlemci neredeyse% 100 yüklendi, bu yüzden
reprioritization

1
Bu, işlemin CPU kullanımını sınırlamak için tasarlanmıştır, bu nedenle CPU'nuz% 100'de çalışıyorsa, işlemek için daha kolay bir zaman olacaktır.
Richard

4
Bunu -1 yaptım, çünkü önceliği nasıl değiştirirseniz değiştirin, sadece daha da kötüleştirecektir. Daha düşük bir öncelik belirlemek, ffmpeg için CPU süresini düşürür ve daha fazla kare düşmesine neden olur veya önceliği yükselterek sistemdeki diğer işlemleri daha da yavaşlatır. Her iki sonuç da istenmez.
gertvdijk

0

-re (giriş) Doğal kare hızında girişi oku. Genellikle bir yakalama cihazını veya canlı giriş akışını simüle etmek için kullanılır (örneğin bir dosyadan okurken). Gerçek yakalama aygıtları veya canlı giriş akışlarıyla (paket kaybına neden olabileceği yerlerde) kullanılmamalıdır. Varsayılan olarak ffmpeg girişleri olabildiğince hızlı okumaya çalışır. Bu seçenek, girişlerin okunmasını, girişlerin yerel kare hızına yavaşlatacaktır. Gerçek zamanlı çıkış için yararlıdır (örn. Canlı akış).


"Gerçek tutma cihazlarıyla kullanılmamalıdır" gibi x11grab.
llogan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.