Jak zminimalizować wykorzystanie procesora / pamięci przez ffmpeg podczas nagrywania wideo

13

Używam FFmpeg do robienia zrzutów ekranu z ekranu Xvfb.

Obecnie przywołuję to z:

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

Gdy nagrywam wideo z około 5 sesji Xvfb, moje użycie procesora jest bardzo wysokie i z tego powodu występują opóźnienia. Również użycie pamięci wynosi około 300 MB na każdy proces ffmpeg.

Jakich parametrów ffmpeg należy użyć, aby zminimalizować zużycie zasobów komputera (szczególnie procesora i pamięci) podczas przechwytywania ekranu wideo?

Andrei Botalov
źródło

Odpowiedzi:

17

1. Najpierw wykonaj bezstratne wyjście RGB

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • Dane wejściowe to RGB, więc użycie kodera libx264rgb pozwoli uniknąć potencjalnie powolnej konwersji RGB na YUV, która miałaby miejsce, jeśli użyjesz zwykłego libx264.

  • Wykorzystuje to najszybsze ustawienie kodowania x264: ultraszybkie.

  • Dane wyjściowe będą bezstratne, ponieważ -crf 0zostaną użyte.

2. Następnie ponownie go zakoduj

Wyjście z pierwszego polecenia będzie ogromne, a większość głupich graczy nie obsługuje RGB H.264, więc można go ponownie zakodować:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Możesz eksperymentować z -crfwartością, aby kontrolować jakość wydruku. Subiektywnie rozsądny zakres to 18-28, gdzie 18 jest wizualnie bezstratne lub prawie takie. Domyślnie jest to 23.

  • Użyj najwolniejsze ustawienie masz cierpliwości do: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Domyślnie jest medium.

  • Dodałem, -vf format=yuv420paby upewnić się, że wyjście działa z głupimi odtwarzaczami, takimi jak QuickTime i Windows Media Player. Możesz to pominąć, jeśli przesyłasz go do YouTube'a lub grasz tylko na VLC, MPV, MPlayerze lub innym odtwarzaczu opartym na FFmpeg.

Zobacz także

Llogan
źródło
Przechwytuję wideo z niestandardowego wyświetlacza (to Xvfb), więc może to być dowolna liczba
Andrei Botalov
@AndreyBotalov Czy próbowałeś metody bezstratnej? Czy to działało dla ciebie lepiej?
llogan
1
Obecnie wywołuję ffmpegz -preset superfastparametrem (nie próbowałem -crf). W takim przypadku zajmuje mniej zasobów i tworzy filmy o wystarczająco dobrym rozmiarze.
Andrei Botalov
@AndreyBotalov -crf 23jest używany domyślnie, jeśli nie zadeklarujesz wartości, ale jeśli i tak superfastjest dla Ciebie wystarczający, być może problem został rozwiązany.
llogan
1
Możesz także wypróbować kodowanie sprzętowe za pomocą h264_nvenc (nvidia) lub h264_qsv (nowoczesny procesor Intel). Spowoduje to przeniesienie ciężaru kodowania z procesora na dedykowany sprzęt h264.
Kenn
4

Lepiej skoncentrować się na użyciu różnych opcji ffmpeg, które osiągną ten sam wynik w sposób, który zużywa mniej zasobów. To powiedziawszy, istnieją sposoby na wykorzystanie mniejszej ilości zasobów, jeśli naprawdę potrzebujesz osiągnąć konkretną rzecz za pomocą ffmpeg i używa ona zbyt wielu zasobów.

Możesz zmniejszyć priorytet ffmpegprocesu procesora:

  • Metoda Terminal: Użyj nicepolecenia, aby zmienić priorytet procesu za: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. W Linuksie numer priorytetu ( niceformat polecenia nice -n <priority> <command>) wynosi od -20 do 20. Im większa liczba całkowita, tym niższy priorytet; neutralny to 0. Jeśli użyjesz polecenia, które ci dałem i ustawisz na 8, procesor da procesowi mniej czasu, co wydaje się mniejszą „mocą”. Jeśli ta liczba jest zbyt wysoka lub dwie niskie, oczywiście możesz ją zmienić.
  • Metoda GUI: Nie jest to zalecane, ponieważ daje mniejszą kontrolę nad dokładną liczbą i nie działa od razu po rozpoczęciu procesu. Jest to jednak bardziej zrozumiałe. Po ffmpeguruchomieniu otwórz Monitor systemu. Przewiń w dół do nazwanego procesu ffmpeg, kliknij go lewym przyciskiem myszy, aby wybrać, kliknij prawym przyciskiem myszy i ustaw priorytet na „Niski” lub „Bardzo niski”.

Jeśli martwisz się również wykorzystaniem pamięci, wiedz, że nie można powiedzieć procesowi, aby zajmował tylko tyle pamięci i nadal działał. Jądro automatycznie kontroluje przydział pamięci dla procesów. Istnieje sposób na umieszczanie procesów w klatkach za pomocą timeoutskryptu , dzięki czemu gdy proces i wszelkie procesy potomne zajmą zbyt dużo pamięci (limit określony przez ciebie), są one bezpiecznie przerywane i wyświetla się powiadomienie. Jednak jeśli proces ma tylko tyle pamięci (powiedzmy przez jądro) i żąda więcej pamięci, której nie może mieć, spowoduje awarię.

Kilka przydatnych informacji na temat:

Korzystając z wiedzy o Cgroups, możesz robić wiele zabawnych rzeczy, takich jak kontrolowanie szybkości procesu.

Richard
źródło
2
Jeśli dobrze rozumiem, ustawienie ffmpeg w kolejce o niższym priorytecie spowoduje, że będzie produkować filmy z opóźnieniami, co jest niepożądane.
Andrei Botalov
1
Hmm ... Nie widzę nic w Internecie, co by to mówiło ... Czy masz źródło, które to wskazuje? (Jeśli nie, powinien to być błąd).
Richard
2
Jeśli dobrze rozumiem, niższy priorytet oznacza, że ​​ffmpeg będzie miał mniej czasu procesora niż teraz. Ale procesor jest załadowany prawie w 100%, więc myślę, że zmiana priorytetów nie pomoże
Andrei Botalov
1
Ma to na celu ograniczenie wykorzystania procesora przez proces, więc jeśli procesor działa na 100%, łatwiej będzie sobie z nim poradzić.
Richard
4
Mam -1, ponieważ bez względu na to, jak zmienisz priorytet, tylko pogorszy to sytuację. Ustawienie niższego priorytetu skróci czas procesora dla ffmpeg, co spowoduje więcej opuszczonych ramek lub, zwiększając priorytet, jeszcze bardziej spowolni inne procesy w systemie. Oba wyniki są niepożądane.
gertvdijk
0

-re (wejście) Czytaj dane wejściowe przy natywnej częstotliwości klatek. Służy głównie do symulacji urządzenia pobierającego lub strumienia wejściowego na żywo (np. Podczas odczytu z pliku). Nie powinien być używany z rzeczywistymi urządzeniami pobierającymi lub strumieniami wejściowymi na żywo (gdzie może to spowodować utratę pakietów). Domyślnie ffmpeg próbuje jak najszybciej odczytać dane wejściowe. Ta opcja spowolni odczyt danych wejściowych do natywnej częstotliwości klatek danych wejściowych. Jest to przydatne w przypadku danych wyjściowych w czasie rzeczywistym (np. Streaming na żywo).

劉 大為
źródło
„Nie należy używać z rzeczywistymi urządzeniami do chwytania”, takimi jak x11grab.
llogan