Bildschirmausgabe einer libvirt/QEMU-Instanz als Video aufnehmen

Von einer KVM/QEMU Virtuellen Maschine kann zu beliebigem Zeitpunkt eine Bilddatei des aktuellen Bildschirminhalts angefordert werden.

Diese Anleitung erklärt wie man via libvirt/virsh diese Bilder in regelmäßigen Abständen speichert und diese dann zu einem Video kombiniert.

Am System müssen bc, convert sowie bc vorhanden sein. Unter Void Linux installiert man die entsprechenden Pakete beispielsweise via xbps-install -Su ImageMagick ffmpeg bc.

Umgebung definieren

Diese Konstanten müssen im Verlauf der gesamten Anleitung korrekt gesetzt sein.

VM=name_der_virtuellen_maschine
BILDER_PRO_SEKUNDE=5

Bildschirmfotos regelmäßig abspeichern

DIR=`mktemp --tmpdir --directory $VM-screenrecording-XXX`
IMG=`mktemp --tmpdir $VM-current-XXX.ppm`
VERZOEGERUNG=`echo "scale=2 ; 1/$BILDER_PRO_SEKUNDE"  | bc`

echo 'Aufnahme ...'
echo '(Strg-C zum Beenden)'
while :; do
        virsh qemu-monitor-command $VM --hmp screendump "$IMG" >/dev/null
        if [ -s $IMG ] ; then
                convert "$IMG" "$DIR/`date +%s.%N`.jpg" && rm "$IMG"
                sleep $VERZOEGERUNG
        else
                echo "Fehler: $IMG ist leer" >&2
        fi
done

Bilder in eine Videodatei zusammenführen

ffmpeg -v error -pattern_type glob -codec copy \
        -framerate $BILDER_PRO_SEKUNDE \
        -i "$DIR/*.jpg" "$DIR/$VM.mkv" 
        && rm -R "$DIR/"*.jpg && echo "$DIR/$VM.mkv"