Jak zrobić screencast przy użyciu ffmpeg

Dla tych, którzy nie wiedzą, plik screencast jest to cyfrowe nagranie wyjścia z ekranu komputera, czasami zawierające narrację dźwiękową.

En Linux, istnieje kilka narzędzia zrobić screencast. Jednak ci, którzy wolą to robić zużywające minimalne zasoby nie mogą przestać czytać tego artykułu.


Korzystając z 2 narzędzi (ffmpeg do przechwytywania ekranu i xwininfo w celu uzyskania współrzędnych i wymiarów rejestrowanego okna) udało mi się wykonać screencast przy minimalnych zasobach i uzyskać optymalne wyniki.

Skrypt uruchamiający screencast

#! / bin / bash

# Uzyskaj współrzędne i rozmiar wybranego okna
# Nie dotyczy to dekoracji okien.
  unset xywh
  eval $ (xwininfo -frame |
    sed -n -e "s / ^ + Absolutny lewy górny X: + ([0-9] +). * / x = 1 / p"
           -e "s / ^ + Absolutny lewy górny Y: + ([0-9] +). * / y = 1 / p"
           -e "s / ^ + Szerokość: + ([0-9] +). * / w = 1 / p"
           -e "s / ^ + Wysokość: + ([0–9] +). * / h = 1 / p")
$ w = $ w + $ w% 2 # że szerokość jest wielokrotnością 2, w przeciwnym razie ffmpeg narzeka
WIN_XY = $ x "," $ y # formatuje współrzędne XY
WIN_GEO = $ w "x" $ h # format rozmiaru okna
# notification-send wyświetli komunikat informujący o rozpoczęciu prezentacji.
# uruchom ffmpeg z parametrami, które pasują do twojej konfiguracji.
notify-send "Uruchamianie screencast ..." && ffmpeg -f alsa -i hw: 0 -f x11grab -r 25 -s $ WIN_GEO -i: 0.0 + $ WIN_XY -acodec libmp3lame -async 1 -vcodec libx264 -preset ultrafast - crf 0 - wątki 0 save.mp4

Nie musisz w pełni rozumieć wszystkiego, co robi ten skrypt. Wystarczy postępować zgodnie z komentarzami. Jest jednak bardzo możliwe, że będziesz musiał zmienić niektóre parametry w wierszu, w którym wykonywany jest ffmpeg, aby dostosować je do konfiguracji twojego komputera.

Architektura dźwięku

1) Jeśli używasz OSS, zamień -f alsa -i hw: 0 na -f oss -i / dev / dsp

2) Jeśli używasz tylko ALSA, musisz użyć parametrów zawartych w skrypcie (-f alsa -i hw: 0). Aby określić liczbę po hw: możesz uruchomić aplay -l i wybrać odpowiedni numer karty dźwiękowej.

3) Jeśli używasz Pulse Audio (Ubuntu i pochodne go używają), użyj parametrów -f alsa -ac 1 -i pulse.

FPS

-r 25 wskazuje liczbę klatek na sekundę (klatki na sekundę lub klatki na sekundę), z jaką chcesz nagrywać. 25 to dobra opcja.

Kodek audio, wideo i synchronizacji

-acodec libmp3lame to kodek audio. Zdecydowałem się nagrać to w formacie mp3. Możesz użyć dowolnego innego.

-async 1 umożliwia synchronizację dźwięku z wideo.

-vcodec libx264 -preset ultraszybkie -crf 0 -threads 0, mówi ffmpeg, że kodek wideo do użycia to x264 i że ustawienie wstępne jest ultraszybkie (jest szybkie, wolne itp.), w przeciwnym razie nie nagra poprawnie z żądaną ilością fps. Parametr -crf 0 wskazuje poziom kompresji (im niższa kompresja, tym niższa kompresja). Wreszcie, wątki 0 wskazują liczbę wątków do użycia, podczas przekazywania 0 ffmpeg oblicza ją automatycznie. Podobnie jak w przypadku ustawień audio, możesz wybrać inne opcje.

Wszystkie te ustawienia dały mi najlepsze wyniki: stosunkowo mały plik, dobra jakość wideo, zsynchronizowany dźwięk i brak opóźnień. Zalecam jednak zagłębić się w dokumentację ffmpeg, aby odkryć inne.

Skrypt kończący screencast

#! / bin / bash
notify-send "Kończę screencast ..." && killall ffmpeg
Aby oba skrypty działały, musisz mieć zainstalowane powiadomienie-send. Wszystkie dystrybucje pochodzące z Ubuntu powinny być dostarczane z zainstalowanym tym narzędziem. W Arch i pochodnych: sudo pacman -S libnotify.

ffcast

Szukając informacji do napisania scenariuszy, odkryłem, że ktoś wpadł na pomysł bardzo podobny do mojego. Ffcast to skrypt korzystający z tych samych narzędzi (ffmpeg i xwininfo). Wspominam o tym, ponieważ niektórzy mogą uznać za wygodniejsze korzystanie z tego skryptu.

W Arch i pochodnych otworzyłem terminal i uruchomiłem:

yourt -S ffcast

Resztę możesz pobrać z tutaj.

Do końca…

Po utworzeniu i zapisaniu skryptów zapisanych w folderze HOME musisz nadać mu uprawnienia do wykonywania. Zakładając, że wywoływane są start_screencast i finish_screencast, uruchom następujące polecenia w terminalu:

chmod + x start_screencast
chmox + x terminate_screencast

Na koniec pozostaje tylko przypisanie każdego ze skryptów do 2 wygodnych dla Ciebie skrótów (skrótów). W ten sposób skrypty będą uruchamiane po naciśnięciu wybranej kombinacji klawiszy.