FFMPEG – Desktopsessions direkt encoden

Jeder Gamer kennt das Problem, man möchte seine Gamesession aufzeichnen und später bei Youtube hochladen. Unter Windows gibt es einige gute Tools das zu tun, z.b. Fraps. Unter Fedora Linux ist das noch einfacher, da im GNOME bereits der Desktop-Recorder integriert ist, sollte man jedenfalls meinen.

Wenn es funktionieren würde, gäbe diesen Beitrag wohl nicht, also was brauchen wir tatsächlich alles :

1. Pulse Audio
2. FFMpeg

Pulse Audio ist bereits drauf, sonst könnte man nichts hören, wichtig wäre aber für Pulse noch das Tool „pactl“ aus dem „pulseaudio-utils“ RPM . Damit ermittelt man zunächst mal den sogenannten Sink auf dem alles zusammen gemischt wird:

# pactl list sinks
Sink #0
    State: RUNNING
    Name: alsa_output.pci-0000_00_14.2.analog-stereo
    Description: Internes Audio Analog Stereo
    Driver: module-alsa-card.c
    Sample Specification: s16le 2ch 48000Hz
    Channel Map: front-left,front-right
    Owner Module: 8
    Mute: no
    Volume: front-left: 95197 / 145% / 9,73 dB,   front-right: 95197 / 145% / 9,73 dB
            balance 0,00
    Base Volume: 65536 / 100% / 0,00 dB
    Monitor Source: alsa_output.pci-0000_00_14.2.analog-stereo.monitor
    Latency: 25933 usec, configured 26000 usec
    Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY
    Properties:
        alsa.resolution_bits = „16“
        device.api = „alsa“
        device.class = „sound“
        alsa.class = „generic“
        alsa.subclass = „generic-mix“
        alsa.name = „ALC887-VD Analog“
        alsa.id = „ALC887-VD Analog“
        alsa.subdevice = „0“
        alsa.subdevice_name = „subdevice #0“
        alsa.device = „0“
        alsa.card = „0“
        alsa.card_name = „HDA ATI SB“
        alsa.long_card_name = „HDA ATI SB at 0xfe300000 irq 16“
        alsa.driver_name = „snd_hda_intel“
        device.bus_path = „pci-0000:00:14.2“
        sysfs.path = „/devices/pci0000:00/0000:00:14.2/sound/card0“
        device.bus = „pci“
        device.vendor.id = „1002“
        device.vendor.name = „Advanced Micro Devices, Inc. [AMD/ATI]“
        device.product.id = „4383“
        device.product.name = „SBx00 Azalia (Intel HDA)“
        device.form_factor = „internal“
        device.string = „front:0“
        device.buffering.buffer_size = „352768“
        device.buffering.fragment_size = „176384“
        device.access_mode = „mmap+timer“
        device.profile.name = „analog-stereo“
        device.profile.description = „Analog Stereo“
        device.description = „Internes Audio Analog Stereo“
        alsa.mixer_name = „Realtek ALC887-VD“
        alsa.components = „HDA:10ec0887,10438444,00100302“
        module-udev-detect.discovered = „1“
        device.icon_name = „audio-card-pci“
    Profile:
        analog-output-lineout: Line Out (priority: 9900, available)
        analog-output-headphones: Analoge Kopfhörer (priority: 9000, not available)
    Aktive Profile: analog-output-lineout
    Formats:
        pcm

Das Rote ist nicht der benutzbare Name, immer die Monitor Quelle nehmen. Das geben wir direkt im FFMpeg Befehl als Audioquellenangabe an:

# ffmpeg -f x11grab -s 1440×900 -i :0.0 -r 25 -f pulse -i alsa_output.pci-0000_00_14.2.analog-stereo.monitor -c:v libx264 -preset slow -pix_fmt yuv420p -s 1440×900 -strict experimental -acodec aac -ab 128000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -f avi testvideo.avi

Diese Bashzeile müssen Sie nur entsprechend an Ihre Bildschirmauflösung anpassen und natürlich Ihr passendes Sink ermitteln. Der Rest ist an sich klar :

– X11grab: aktiviert den Screengrabber
– Audioinput von Pulse Audio
– h264 Codec fürs Video
– das Preset Slow sorgt für gute Qualität
– AAC mit 128kbit für den Audiocodec
– und Stereosoundkanäle
und am Ende noch der Dateinamen und das Dateiformat. Das war es schon und im Gegensatz zum GNOME-Screenrecorder kommt dabei auch was brauchbares aus. Das Ergebnis kann sofort im GNOME-Mplayer angesehen werden.

Hier ein paar Tips:

Die zweite Angabe von „-s 1440×900“ ist die Zielgröße fürs Video. Weicht diese vom ersten Wert ab, wird automatisch passend skaliert.

FFMpeg nimmt im Beispiel oben bei einer Mehrmonitorlösung den linken Monitor.

In einem früheren Beitrag habe ich bereits auf die Möglichkeiten des Autocroping von FFMpeg hingewiesen. Wenn man also von einem zweiten Monitor capturen möchte, muß man die Gesamtgröße des Bildschirms angeben und nicht nur die vom linken Monitor. Dann benutzt man den Cropfilter und schneidet den linken Monitor einfach weg.

In einem anderen Beitrag wurde gezeigt, wie man sich mit xwininfo anzeigen lassen kann, wie die Maße des Bildschirms sind.

FFMpeg kann gleichzeitig zwei oder mehr Audioquellen in den Film mit einbinden. Damit kann man sich z.b. auch eine Audiokommentarspur ins Video einfügen, wenn man das Micro mitschneidet. Meistens ist die PC-Hardware aber so lausig, daß man den Ton noch mal nachbearbeiten muß und vor allem soll das Video ja am Ende vermutlich noch geschnitten werden. Sinnvoll wäre es daher, den Ton mit Audacity aufzunehmen und dann gleich das Rauschen zu entfernen. Ansonsten muß man den Ton erst aus dem Video abspalten und dann am Ende das Video sowieso neu mischen, was beim Schneiden ohnehin passiert. Das besondere an FFMpeg ist nun, daß es die beiden Tonspuren auch gleich live zu einer Tonspur zusammen mischen kann. Wenn dann aber Geräusche oder Musik im Video vorkommen, wird das mit den Scheiden dann nichts mehr. Überlegen Sie also vorher was Sie wollen.

Mit Yum Paketupdates rückgängig machen

Ab und zu kann es vorkommen, daß neue Pakete von Treiber oder Programmen zu Fehlern führen. Jüngstes Beispiel ist der Nvidia Treiber für Fedora 20. Da die Auswirkungen erst nach dem Neustart des Computers wirksam werden, benötigt man zum Beheben des Problems Rootrechte.

Pakete identifizieren

Zunächst einmal muß man die Pakete finden, die aktualisiert wurden. Dazu schaut man sich die letzten Zeilen des Yum Logfiles an :

# tail /var/log/yum.log
Jan 29 00:42:04 Updated: 1:kmod-nvidia-340xx-3.17.8-200.fc20.x86_64-340.65-4.fc20.x86_64
Jan 29 00:42:04 Updated: 1:kmod-nvidia-340xx-340.65-4.fc20.x86_64
Jan 29 00:45:22 Installed: 1:kmod-nvidia-3.17.8-200.fc20.x86_64-331.113-1.fc20.1.x86_64

Pakete die mit der Sache nichts zu tun haben, könnten natürlich auch installiert worden sein, im obigen Beispiel ist das nicht der Fall.

Pakete downgraden

Die Pakete wieder los zu werden ist ganz einfach, wenn man den korrekten Namen ermittelt hat:

# yum downgrade kmod-nvidia-340xx-3.17.8-200.fc20.x86_64
# yum downgrade kmod-nvidia-340xx-340

Updates verhindern

Damit die Pakete beim nächsten Update nicht wieder mit eingespielt werden, trägt man diese in die Liste der ausgeklammerten Pakete in der YUM Konfiguration ein:

# vi /etc/yum.conf

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3
exclude=kmod-nvidia-340xx*

Damit wäre man vorerst vor Updates sicher.  Das nächste Kernelupdate kommt aber todsicher und dann braucht man die neue Version der Pakete für diesen neuen Kernel. Man muß sich also jetzt sofort darum kümmern, daß dieser Fehler bekannt und natürlich behoben wird.

Bugzilla

RPMFusion und Fedora haben jeweils eine eigen Fehlertrackersoftware namens Bugzilla im Einsatz. Da die Nvidiatreiber über RPMFusion bekommen sind, muß man das Paket dort als Fehlerhaft melden.

Details zur Anmeldung kann man auf rpmfusion.org finden.

Es geht aber auch direkter, was in diesem Fall wohl dringend nötig ist. Dazu lädt man sich die defekten RPMS aus dem Repository direkt auf die Platte. Wie das geht habe ich hier beschrieben: Aus Yum ableiten wo ein RPM findet

Dann schaut man sich die Infos zu diesem RPM an : less xorg-x11-drv-nvidia-340xx-*

Neben allerlei Informationen zu dem Paket selbst, kann man hier auch direkt das Changelog sehen:

* Di Jan 27 2015 Leigh Scott <leigh123linux@googlemail.com> – 1:340.65-5
– revert last commit

Nun können Sie das direkt an den Entwickler melden, der das „verbockt“ hat 🙂

wenn das Paket bereits installiert ist …

geht das Aufrufen des Changelogs wesentlich einfacher :

# rpm -q –changelog xorg-x11-drv-nvidia-340xx
* Do Jan 15 2015 Przemysław Palacz <pprzemal@gmail.com> – 1:340.65-4
– Replace main nvidia driver in F20 with this legacy version

* So Jan 11 2015 Przemysław Palacz <pprzemal@gmail.com> – 1:340.65-3
– Switch libnvidia-ml and nvidia-debugdump to the cuda subpackage again

… die Logs gehen bis zur ersten Release des Pakets zurück …

* So Jun 22 2003 Andreas Bierfert (awjb) <andreas.bierfert[at]awbsworld.de> – 0:1.0.4363-0.fdr.1
– Initial RPM release, still some ugly stuff in there but should work…

Kein Wunder, daß die Pakete immer länger brauchen bis sie geladen worden sind.

Teamviewer für Linux auf Version 10 Updaten

Dein Update von Teamviewer 9 auf Teamviewer 10 hat funktioniert, aber Dein Desktop Icon ist weg ?

Dann hast Du vermutlich den gleichen kleinen Fehler gemacht, der mir unterlaufen ist: das Icon nicht vor der Installation zu löschen, sondern erst, wenn Teamviewer 10 drauf ist. Es ist nicht Deine Schuld, das Desktopiconmanagement der Gnome-Shell hat noch Platz für Verbesserungen.

Der Reinstall des RPM, so man es denn von hier runter lädt, nutzt mal rein gar nichts, weil das DesktopIcon nicht neu installiert wird.

Natürlich könnte man jetzt das RPM deinstallieren mit „erase“ und es dann noch mal ganz frisch installieren, aber das ist gar nicht nötig. Einfach das Desktopfile aus dem Installdirectory kopieren und dann neue Rechte setzen :

cp /opt/teamviewer/tv_bin/desktop/teamviewer-teamviewer10.desktop ~/Schreibtisch/
chmod 755 ~/Schreibtisch/teamviewer-teamviewer10.desktop

Fertig.

Ursachenforschung:

Das alte TV 9 Icon lag noch als „Zombie“ auf dem Desktop rum, nachdem das Paket ersetzt wurde. Wenn man das aber dann per Contextmenü löscht, löscht man eigentlich das neue Desktopfile von TV 10. Die Gnomeshell hat den Wechsel nicht mitbekommen und hält das geänderte File für ein neues File und räumt nicht sauber auf dem Desktop auf.

Wie man es vermeiden kann ..

Damit man sich dies erspart beim Wechsel von 10 auf 11, einfach nach dem das 11er Icon aufgetaucht ist, den Desktop mit ALT+F2 und dem Befehl „r“ neuladen. Schon ist die Leiche weg, ohne das man etwas zerschiesst.