Hilfe:Bildschirmaufnahmen vermittels Kommandozeile
Zusammenfassung – Bildschirmaufnahmen vermittels Kommandozeile: Ein Beitrag, der sich an „Fortgeschrittene“ richtet, die den Umgang mit der Kommandokonsole kennen. Bildschirmaufnahmen erfordern hier etwas Geschick, die richtigen Einstellungen anzugeben. Allgemein sollte man folgen Fragen sich vorher beantworten:
- Habe ich einen leistungsstarke Rechner? (größer ~4 GB Arbeitsspeicher können vermutlich die Bildschirmaufnahme sogleich fertig zusammenkodieren)
- Habe ich einen leistungsschwachen Rechner? (~4 GB Arbeitsspeicher sollten Tonaufnahme und Filmaufnahme getrennt speichern, um sie im Nachgang zusammenzufügen)
- Welches Endformat wird gebraucht? (OpenSource: OGV z.B. für dieses Wiki oder Wikipedia; bei Youtube: MP4)
Fenstergrößen herausfinden
Zerst die Fenstergrößen aufzeigen:
wmctrl -lG
# links-oben Breite × Höhe Fenstertitel
# (0+x 0+y) (px-breit px-hoch)
# 0x00c00003 -1 0 743 1366 25 localhost.localdomain xfce4-panel
# 0x01c00007 -1 0 0 1366 768 localhost.localdomain Schreibtisch
# 0x04200003 0 0 0 1366 743 localhost.localdomain command line - Get Window size in shell - Ask Ubuntu – Opera
Gemessen wird immer von links ganz oben als x=0 y=0
, hier erklärt für die Statusleiste (xfce4-panel
):
- von links-oben gesehen ist sie waagrecht mit
x=0
Pixel Abstand, und senkrecht mity=743
Pixel Abstand von links-oben - und dann ist sie 1366×25 Pixel breit mal hoch
… schematisch gesehen:
x… 0 Pixel Abstand y ⋮ +-------------------+ 7 | | 4 | | 3 | | ↓ | | -- |-------------------| 25 Pixel +-------------------+ hoch ←---- 1366 Pixel --→
Gerätequellen herausfinden - Ton
# https://trac.ffmpeg.org/wiki/Capture/PulseAudio
pactl list short sources | column -t # Tonquellen ausgeben
# 0 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz IDLE
# 1 alsa_input.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 48000Hz SUSPENDED
# 2 noechosource module-echo-cancel.c float32le 2ch 32000Hz SUSPENDED
# 3 noechosink.monitor module-echo-cancel.c float32le 2ch 32000Hz SUSPENDED
Hier gibt es alsa_output….analog-stereo.monitor
(=Computer-Audio, alle Computerprogramme), dann alsa_input….analog-stereo
(=Mikrophon), und noechosource
als auch noechosink.monitor
zeigen hier speziell eingestellte Pulse-Audio-Module, mit Echofilter, die hier nicht von Belang sind[1].
Eine weitere Möglichkeit ist die Pulse-Audio-Kommandokontrolle pacmd
:
pacmd list-source-outputs | grep "source:" # Tonquellen über grep herausfinden
# Hinweis: input ist meist das eigentliche Mikrophon
# Hinweis: output ist dann der dasige Hörkanal des Gerätes!
# source: 0 <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor> # Ton der Computerprogramme
# source: 1 <alsa_input.pci-0000_00_1b.0.analog-stereo> # Mikrophon
# source: 2 <noechosource>
# source: 3 <noechosink.monitor>
Dabei kann man die Tonquellen entweder bezüglich ihrer Kennnummer angeben: -f pulse -i 5
, oder durch den Gerätenamen: -f pulse -i alsa_input.pci-0000_00_1b.0.analog-stereo
, oder man verwendet einfach -f pulse -i default
, um die Quelle zu verwenden, die derzeit als Standard in pulseaudio eingestellt ist.
Tonaufnahme
Tonaufnahme von Computerprogrammen und Mikrophon, hier nach OGG:
# cd ~/Videos/Bildschirmaufnahmen/
# Einzelne STEREO-Datei erstellen
datumzeit=$(date '+%Y%m%d-%H%M')
dateiname='Tonaufnahme'
ffmpeg -y \
-loglevel warning \
-f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-filter_complex amix=inputs=2 \
${dateiname}_Stereo_${datumzeit}.ogg
# WICHTIG Aufnahme beenden mit q WICHTIG
# Kommando-Optionen erklärt:
# -y - yes/ja überschreibe Ausgabe **ohne Nachfrage**
# -loglevel warning - nur Warnungen ausgeben (standardmäßig werden umfangreiche Infos ausgegeben)
# -i - input - Eingangskanal
# -filter_complex - ist nötig die 4 Kanäle richtig zusammenzufügen
# Einzelne MONO-Datei erstellen
# cd ~/Videos/Bildschirmaufnahmen/
datumzeit=$(date '+%Y%m%d-%H%M')
dateiname='IT-Plenumsentscheid'
ffmpeg -y \
-loglevel warning \
-f pulse -thread_queue_size 4096 -ac 1 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -thread_queue_size 4096 -ac 1 -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-filter_complex amix=inputs=2 \
"${dateiname}_Mono-${datumzeit}.ogg"
# WICHTIG Aufnahme beenden mit q WICHTIG
# zusätzliche Kommando-Optionen erklärt:
# -ac 1 bedeuten “ac=audio channel“ 1, also nur 1 Tonkanal
# das ergibt MONO je Geräteeinfluß (hier: Computer=analog-stereo.monitor + Mikro=analog-stereo)
Tonaufnahme als MP3:
# cd ~/Videos/Bildschirmaufnahmen/
datumzeit=$(date '+%Y%m%d-%H%M')
ffmpeg -y \
-loglevel warning \
-f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-filter_complex amix=inputs=2 \
Tonaufnahme_${datumzeit}.mp3
# WICHTIG Aufnahme beenden mit q WICHTIG
# Kommando-Optionen erklärt:
# -loglevel warning - nur Warnungen ausgeben (standardmäßig werden umfangreiche Infos ausgegeben)
Bildschirmaufnahme
Für kräftige Rechenknechte kann man die Datei gleich fertig zusammenfügen (bei 4GB RAM hat der Rechner oft Probleme, Schritt zu halten). FFmpeg bemißt die Aufnahmefläche immer von links oben aus (bei ffmpeg … -i :0.0
sozusagen), im folgenden wird eine Aufnahmefläche von 1366x743
genommen, die umrandet dargestellt wird (merke aber: der gesamte Bildschirm ist in diesem Beispiel größer, mit 1366x768, so daß die Statusleiste/Panele ausgelassen wird)
# rechenintensiv: Ton wird möglicherweise schlecht aufgenommen
# cd ~/Videos/Bildschirmaufnahmen/
datumzeit=$(date '+%Y%m%d-%H%M')
ffmpeg -y -video_size 1366x743 -framerate 25 -f x11grab -i :0.0 \
-show_region 1 -loglevel warning \
-f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-ac 2 \
-filter_complex amix=inputs=2 \
TestBildschirmaufnahme_${datumzeit}_Bild-und-Ton.mp4
# WICHTIG Aufnahme beenden mit q WICHTIG
# Kommando-Optionen erklärt:
# -show_region 1 - zeige Umrahmung der Aufnahmefläche
# -loglevel warning - nur Warnungen ausgeben (standardmäßig werden umfangreiche Infos ausgegeben)
Für schwache Rechenknechte ist es besser, alle Dateien getrennt abzuspeichern, und später, im 2. Schritt, dann zusammenzufügen:
# Aufnahme in 3 Dateien - verbessert thread_queue_size (?Puffer):
# cd ~/Videos/Bildschirmaufnahmen/
datumzeit=$(date '+%Y%m%d-%H%M')
ffmpeg -y -video_size 1366x743 -framerate 25 \
-show_region 1 -loglevel warning \
-f x11grab -thread_queue_size 4096 -i :0.0 \
-f pulse -thread_queue_size 4096 -ac 2 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -thread_queue_size 4096 -ac 2 -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-map 0:v:0 TestBildschirmaufnahme_${datumzeit}-Bildschirm.mp4 \
-map 1:a:0 TestBildschirmaufnahme_${datumzeit}-Ton-Computer.aac \
-map 2:a:0 TestBildschirmaufnahme_${datumzeit}-Ton-Mikrophon.aac
echo $datumzeit
# WICHTIG Aufnahme beenden mit q WICHTIG
# Aufnahme in 3 Dateien (ohne thread_queue_size)
# cd ~/Videos/Bildschirmaufnahmen/
datumzeit=$(date '+%Y%m%d-%H%M')
ffmpeg -y -video_size 1366x743 -framerate 25 -f x11grab -i :0.0 \
-show_region 1 -loglevel warning \
-f pulse -ac 2 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -ac 2 -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-map 0:v:0 TestBildschirmaufnahme_${datumzeit}-Bildschirm.mp4 \
-map 1:a:0 TestBildschirmaufnahme_${datumzeit}-Ton-Computer.aac \
-map 2:a:0 TestBildschirmaufnahme_${datumzeit}-Ton-Mikrophon.aac
# WICHTIG Aufnahme beenden mit q WICHTIG
echo $datumzeit
Zusammenfügen einzelner Aufnahmen
# Aufnahme der 3 Dateien zusammenfügen (mit Überschreibung der Zieldatei):
# cd ~/Videos/Bildschirmaufnahmen/
datumzeit=20220119-1500
nice -n 19 ffmpeg -y -i TestBildschirmaufnahme_${datumzeit}-Bildschirm.mp4 \
-i TestBildschirmaufnahme_${datumzeit}-Ton-Computer.aac \
-i TestBildschirmaufnahme_${datumzeit}-Ton-Mikrophon.aac -ac 2 \
-filter_complex amix=inputs=2 \
-metadata title="Meine ausgezeichnete Bildschirmaufnahme" \
-metadata year="2022" \
-metadata description="Was ich schon immer alles wichtige sagen wollte …" \
TestBildschirmaufnahme_${datumzeit}-Bild-und-Ton.mp4
# mit ffplay abspielen
ffplay TestBildschirmaufnahme_${datumzeit}-Bild-und-Ton.mp4
# mpv TestBildschirmaufnahme_${datumzeit}-Bild-und-Ton.mp4
Anwendungsbeispiele aus dem Alltag
Bildschirmaufnahme in getrennte Dateien
cd ~/Videos/Bildschirmaufnahmen/
datumzeit=$(date '+%Y%m%d-%H%M')
video_datei="Video bei YoutTube herunterladen"
ffmpeg -video_size 1366x743 -framerate 25 \
-show_region 1 -loglevel warning -probesize 42M \
-f x11grab -thread_queue_size 4096 -i :0.0 \
-f pulse -thread_queue_size 4096 -ac 2 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -thread_queue_size 4096 -ac 2 -i alsa_input.pci-0000_00_1b.0.analog-stereo \
-map 0:v:0 "${video_datei}_${datumzeit}-Bildschirm.mp4" \
-map 1:a:0 "${video_datei}_${datumzeit}-Ton-Computer.aac" \
-map 2:a:0 "${video_datei}_${datumzeit}-Ton-Mikrophon.aac"
echo $datumzeit # war 20220218-1902
Video zusammenfügen:
- Start bei 00:00:16.5
- Ende bei 00:04:51 (Gesamtvideo war 00:04:54.66)
- sklaliere das Video auf 1920x1080, weil es bei YouTube auch als „HD“ Video angenommen werden soll (beließe man es bei 1366x743, dann ist die YouTube-Qualität stärker verschwommen als das Urvideo tatsächlich aufweist)
- füge Metadaten dem Video ein
ffprobe "Video bei YoutTube herunterladen_20220218-1902-Bildschirm.mp4" # Videodaten des Urvideos anzeigen lassen
# Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Video bei YoutTube herunterladen_20220218-1902-Bildschirm.mp4':
# Metadata:
# major_brand : isom
# minor_version : 512
# compatible_brands: isomiso2avc1mp41
# encoder : Lavf57.83.100
# Duration: 00:04:54.66, start: 0.000000, bitrate: 286 kb/s
# Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 1366x743, 283 kb/s, 25.67 fps, 25.67 tbr, 19712 tbn, 51.33 tbc (default)
# Metadata:
# handler_name : VideoHandler
datumzeit=20220218-1902
video_datei="Video bei YoutTube herunterladen"
cd ~/Videos/Bildschirmaufnahmen/
nice -n 19 ffmpeg -y \
-i "${video_datei}_${datumzeit}-Bildschirm.mp4" \
-i "${video_datei}_${datumzeit}-Ton-Computer.aac" \
-i "${video_datei}_${datumzeit}-Ton-Mikrophon.aac" -ac 2 \
-filter_complex "[1]afade=type=out:start_time=287:duration=4[TonCompAusblenden];\
[2]afade=t=out:st=287:d=4[TonMikroAusblenden];\
[TonCompAusblenden][TonMikroAusblenden]amix=inputs=2" \
-ss 00:00:16.5 -to 00:04:51 -preset faster -pix_fmt yuv420p -maxrate 5000K -bufsize 5000K -vf scale=1920x1080:flags=lanczos -movflags +faststart -b:a 160k \
-metadata title="Video bei YoutTube herunterladen (18. Hornung (Februar) 2022)" -metadata year="2022" -metadata description="Kurzanleitung für Firefox Erweiterung (=Add-On) „Easy Youtube Video Downloader Express“ zum herunterladen von YoutTube Videos." \
"${video_datei}_${datumzeit}-Bild-und-Ton.mp4"
Erklärungen
- Zeitbemessung:
-filter_complex
hat spezielle Syntax und allgemein wird ein Filter so angegeben[EINGANGS-i-INDEX]filtername=var1=wert1:var2=wert2[BEZEICHNUNG-Weiterleitung]
… und dies kann kombiniert werden. Hier ist-i "${video_datei}_${datumzeit}-Ton-Computer.aac"
die 2. Eingangsdatei von allen drei-i
, aber da ffmpeg den Eingangs-Index bei 0 anfängt, und von 0, 1 und 2 hochgezählt wird, müssen wir [1] angeben für die 2. Eingangsdatei:[1]afade=type=out:start_time=287:duration=4[TonCompAusblenden]
bedeutet:afade
→ Audio-Filter zum ausblenden, Startzeit bei 287 Sekunden (es geht ja bis 00:04:51, also 291 Sekunden minus 4 Sekunden zum Ausblenden ergibt eine Startzeit bei 287 Sekunden), Dauer des Ausblendens 4 Sekunden;[2]afade=t=out:st=287:d=4[TonMikroAusblenden]
ist dasgleiche in Kurzschreibweise für den Ton des Mikrophons;[TonCompAusblenden][TonMikroAusblenden]amix=inputs=2
führt beide bezeichneten Weiterleitungskanäle zusammen
- die Angaben für die Videoneuverarbeitung (
-preset faster … -vf scale=1920x1080:flags=lanczos -movflags +faststart -b:a 160k
sind Netzfunde; Details siehe englische Dokumentation der Videofilter https://ffmpeg.org/ffmpeg-filters.html#Video-Filters) -metadata title
und-metadata description
fügt Videotitel und Viedobeschreibung in das Video hinein