Bild des Benutzers booiiing
Tags:

Übersicht

GLC ist ein Tool, um Mitschnitte von OpenGL-Anwendungen unter Linux zu erzeugen. Im Gegensatz zu traditionellen Werkzeugen (wie recordmydesktop), die sich die Bilder vom XServer holen und damit stark auf die Performance schlagen, hängt sich GLC in die OpenGL-Bibliothek ein und holt sich die Bilder direkt aus dem Render-Buffer. Auch die Aufnahme von Sound ist möglich. GLC funktioniert ebenfalls mit Aufnahmen von Anwendungen über wine.

Features

  • The complete source code is available and licenced under zlib-style licence.
  • Thread-based architechture takes full advantage of multicore-CPUs.
  • Support for multiple simultaneous audio and video streams.
  • Reads frames asynchronously from GPU using GL_ARB_pixel_buffer_object extension.
  • Does enforce fps cap only in the captured stream.
  • If the application can play audio using ALSA, glc can record it regardless of sound card's capabilities.
  • Support for recording voice to a separate audio stream.
  • Stores color correction information and applies it at playback.
  • Minimal application overhead (eg. slow HDD does not slow program down).
  • Fast arbitrary ratio video scaling with bilinear filtering.
  • Does colorspace conversion to YCbCr 420jpeg which cuts stream size in half.
  • Compresses stream with lightweight LZO or QuickLZ compression which saves additional 40%-60%.

Installation

Gentoo

Für Gentoo gibt es ein Portage-Overlay, dies installiert man am einfachsten mit:

layman -f -a glc -o 'http://nullkey.ath.cx/glc/overlays.xml'

Falls layman noch nicht installiert ist, kann man das nachholen mit:

emerge layman
echo "source /usr/portage/local/layman/make.conf" >> /etc/make.conf

Wer stable verwendet, muss vor der Installation noch glc, packetstream und elfhacks freistellen:

echo "media-video/glc ~x86 ~amd64
dev-libs/packetstream ~x86 ~amd64
dev-libs/elfhacks ~x86 ~amd64" >> /etc/portage/package.keywords

Danach reicht ein einfaches:

emerge glc

Arch-Linux

Es gibt reguläre stabile und Entwicklerpakete.

Andere Distributionen

Das Installationsscript vereinfacht die Einrichtung auf anderen Systemen.

HINWEIS: Als Installationspfad am besten /usr/local/ angeben! Dann funktioniert hinterher alles und euer System bleibt "sauber" ;)

Debian/Ubuntu
Die folgenden Pakete werden zum Compilieren benötigt:

apt-get/aptitude/synaptic install build-essential cmake libx11-dev libxxf86vm-dev libgl1-mesa-dev libasound2-dev libpng12-dev

64-bit Systeme
Es wird zusätzlich gcc-multilib benötigt. Weiterhin sollte sicher gestellt sein, dass die folgenden Links/Dateien existieren:

ln -s /usr/lib32/libGL.so.1 /usr/lib32/libGL.so
ln -s /usr/lib32/libasound.so.2 /usr/lib32/libasound.so
ln -s /usr/lib32/libXxf86vm.so.1 /usr/lib32/libXxf86vm.so
ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so
ln -s /usr/lib32/libpng12.so.0 /usr/lib32/libpng.so

Aufnehmen

Zum Aufzeichnen von Videos dient das Programm glc-capture. Im einfachsten Fall wird es dem Aufruf der OpenGL-Anwendung vorausgestellt und die Aufnahme dann mit shift+F8 gestartet bzw mit shift+F9 gestoppt.

Aber ACHTUNG! Hier werden nur minimal komprimierte Rohdaten gespeichert! Das hat zwar den Vorteil, dass man kaum Performance-Einbußen hat, jedoch wird die Festplatte sehr schnell sehr voll. Um das zu verhindern, kümmern wir uns später um Komprimierung.

Steam Games

Um Steam Spiele auf zu nehmen:

glc-capture wine C:/Program\ Files/Steam/Steam.exe -console -applaunch 240

List of Steam Application IDs
List of Command Line Options

Abspielen

Eine Datei kann mit glc-play wiedergegeben werden, mit verschiedenen Parametern lassen sich auch die Informationen über den Stream ausgeben.

Datereduzierung

Wie schon erwähnt sind die Daten auf der Festplatte nur minimal und verlustfrei komprimiert - da kommen schnell einige Gigabyte zusammen. Für kurze Videos mag das OK sein, aber wer zB ein komplettes Clanmatch aufzeichnen will, kommt da bald an die Grenze jeder Platte.

Unser Ziel ist es, den Datenstrom zu reduzieren und um dabei noch Rechenpower zu sparen, sollte das so früh wie möglich geschehen.
Zunächst sind 30 FPS zwar schön für flüssige Videos, doch 15 reichen im Internet (bei youtube und co) vollkommen aus. Weiterhin muss nicht unbedingt in 1900x1200 aufgenommen werden, reduziert also am besten die Auflösung im Spiel auf 1280x720 oder 1024x768. Ein Youtube-HD-Video fordert eine Breite von 720 Pixeln, bei 1024x768 müssen wir also noch skalieren.
Apropos youtube: wenn ihr da Videos schaut, interessiert euch der Ingame-Sound? Nein, schmissige Hintergrundmusik ist viel kurzweiliger! Also weg mit dem Krach bei der Aufnahme.
Die vollständige Zeile für glc-capture lautet nun:
glc-capture -f 15 -r 0.9375 --disable-audio --pbo -b back -o - <anwendung>
"-r 0.9375" korrigiert von 1024x768 auf x720, ist also bei nativen 1280x720 nicht nötig. "--pbo" nutzt PixelBufferObjects für schnelleren Datentransfer und "-b back" holt sich den Back- anstelle des Front-Buffers (nicht unbedingt nötig, kann aber nützlich sein). Mit "-o -" schließlich packen wir die Daten auf die Standardausgabe, um sie weiter zu verarbeiten.

Je nach Spiel/Anwendung kann das Video nun aber an unterschiedlichen Stellen landen. Um rauszufinden, wo genau, macht man am besten eine "normale" Aufnahme (also ohne "-o -") und schaut sich die Datei danach mit "glc-play -i 2 <dateiname" an und sucht den passenden Video-Stream (bei Savage 2 ist es zB #2). Diesen Index brauchen wir nun, um die Daten für den Encoder zu sortieren:
glc-play -y <stream-nummer> -o - -
Dieser Befehl wird mit einer Pipe an den ersten gehängt und verarbeitet somit dessen Standardausgabe zu einer neuen, die YUV-Videodaten enthält.

Nun können wir die Daten mit einem weiteren Programm codieren. Ich verwende beispielhaft mencoder und den MPEG4-Codec, jedoch können auch ffmpeg, vlc oder sonstige verwendet werden und natürlich auch ein anderer Codec.
mencoder -demuxer y4m -ovc lavc -vf expand=:::::16/9 -nosound -o gl-capture.mpeg -
"-vf expand=:::::16/9" fügt schwarze Balken links und rechts hinzu, falls die Original-Aufnahme nicht 16:9 war, wird also nur benötigt, wenn oben "-r" benutzt wurde. Ebenfalls mit Pipe hinter das letzte Kommando gehängt, liefert das uns nun eine komprimierte Datei, die nur noch ca 1MB pro 10 Sekunden Aufnahme braucht und bei Youtube als HD-Video hochgeladen werden kann (10-Minuten-Limit beachten!).

Damit das nicht jeder alles von Hand ein-/abtippen muss und sich dabei verschreibt, habe ich ein kleines Script gebastelt (was zur Sicherheit und Übersichtlichkeit noch eine Named-Pipe verwendet): GLC-encode. Dieses editiert man einfach nach seinen Wünschen (-r und -vf), macht es ausführbar und legt es im Pfad ab. Dann kann man seine Sitzung aufzeichnen mit:
glc-encode <anwendung>

Natürlich wird nun deutlich mehr Rechenpower benötigt, eine Multicore-CPU ist zu empfehlen, ebenso sollten mencoder und das Spiel an separate Cores gebunden werden.

Screenshots und Videos
manuel
Bild des Benutzers manuel
Offline
Beigetreten: 19.05.2008
Beiträge: 245

Die Homepage ist down, somit funktiniert auch das overlay nicht mehr und auch kein installationsscript.....

manuel
Bild des Benutzers manuel
Offline
Beigetreten: 19.05.2008
Beiträge: 245

Ich habe mir ein paar ebuilds gebaut, somit kann man glc jetzt wieder in Gentoo installieren....

Link: http://forums.gentoo.org/viewtopic-p-6871052.html#6871052

mitscherdinger
Bild des Benutzers mitscherdinger
Offline
Beigetreten: 13.09.2010
Beiträge: 65

GLC ist umgezogen auf Github:

https://github.com/nullkey/glc