Die letzten Wochen habe ich einige Zeit damit verbracht, eine Lösung zu finden, mit der ich Videos aufnehmen und in Echtzeit Text hineinkodieren kann. Ich hatte mir das Problem schon vor ein paar Jahren mal angesehen. Damals gab es ein ffmpeg-Filter, “text”, der vor dem Rendern jedes einzelnen Frames eine Textdatei ausgelesen und diese ins Video hineinkodierte. Das Plugin war damals aber gerade nicht mehr aktuell vermutlich auf Grund einer API-Änderung nicht mehr unterstützt. Ich wollte nicht auf einer alten ffmpeg-Version basierend eine Lösung suchen, aber die ffmpeg-Entwickler hatte zu dem Zeitpunkt auch noch keinen Ersatz.
Ich habe dann überlegt, etwas mit AVFoundation unter OSX zu programmieren. Dazu habe ich ein kleines Capture-Programm geschrieben, dass mit der internen Kamera des MacBooks auch funktionierte. Dann brauchte ich eine richtige USB-Capture-Karte um weitermachen zu können. Das war leider nicht so einfach.
Ich konnte keine USB-Video-Capture-Geräte finden, die AVFoundation unterstützen, also einen richtigen Treiber für OSX mitbringen. Das geradezu dreisteste Produkt ist , der zwar Mac-Unterstützung im Namen hat, den Treiber aber seit 10.4 (Tiger) nicht mehr aktualisiert hat. Auf einem aktuellen System funktioniert er nicht.
Danach habe ich den Elgato-Stick probiert. Immerhin hat Elgato einen recht guten Ruf für ihre TV-Capture-Geräte. Leider bringt auch dieser Stick keinen Treiber, sondern nur ein Userland-Programm mit. Damit kann man zwar Videos aufnehmen, aber eben nicht über AVFoundation. Nutzlos für mich.
Der Easycap-Stick, der zwar mit unter 10€ sehr günstig ist, schien hier das gleiche Problem zu haben. Da ich ihn dann noch mal aus Neugier unter Linux testen wollte und er so billig war, habe ich ihn nicht wieder zurückgeschickt.
Etwas frustriert habe ich dann noch mal die ffmpeg-Dokumentation gelesen und fand tatsächlich unter den libavfilter einen Filter namens drawtext. Meine erste Freude wich der Enttäuschung, dass die übergebene Textdatei nur einmal beim Start gelesen und dann nicht wieder aktualisiert wird. Man kann damit also keine dynamischen Texte ins Video schreiben. Aber es war eine Basis, um die gewünschten Funktionen nachzurüsten.
Also habe ich versucht, die Videokarten nun unter Linux zum Laufen zu bringen. Leider stellte sich das auch erst nicht so einfach dar. Ich habe noch zwei interne Hauppauge-Karten hier rumliegen gehabt, die aber für den späteren Einsatz im Auto nicht so geeignet sind, es sollte schon besser ein USB-Gerät sein. Der Easycap-Stick machte Probleme unter Ubuntu 11.10 und wollte (zumindest auf Anhieb) auch nicht unter einem aktuellen Gentoo laufen. Auch in der c’t 10/2012 steht, dass er unter Linux nicht funktioniert. Neues Gerät kaufen? Laut der Homepage von Terratec, sollte der Grabster AV 350 unter Linux laufen. Das stimmt zwar, leider ist die Videoqualität aber unter aller Sau gewesen. Das Ding habe ich schnell zurückgeschickt und mich noch mal dem Easycap zugewandt. Erfreulicherweise läuft er unter Ubuntu 12.04 out-of-the-box.
Aufnehmen
Ein paar kleinere Hürden sind noch zu nehmen, um den Easycap unter Linux als Aufnahmegerät zu nutzen. Erstens: das Pixelformat. Der Stick liefert YUV 4-2-2, der x264-Encoder unterstützt das Format aber so nicht. Zweitens: Framerate. Der Stick liefert nur 22,75 Frames per second. Damit die Aufnahme nicht ruckelt, muss man dies dem Encoder explizit mitteilen.
Um eine erste Aufnahme zu bekommen, habe ich mir also nach einigem Suchen ein paar Parameter zusammengebastelt:
ffmpeg -f video4linux2 -vc 0 -i /dev/video0 -vcodec libx264 \
-vprofile baseline -level 30 -maxrate=10000000 \
-bufsize=10000000 -pix_fmt yuv420p aufnahme.mp4










