Vor Kurzem bin ich auf eine Handvoll Projekte gestoßen, die die Aufzeichnung von Videos umfassen. Eines darunter ist ein 3D-Bildgebungsprojekt, bei dem wir fünf Videofeeds von 1080p verwenden möchten, um die einminütige Rotation eines Gegenstands auf einer Plattform aufzuzeichnen, was uns eine enorme Datenmenge liefert, um bestimmte Bilderkennungssoftwares weiterzuentwickeln.
Das andere Projekt ist ziemlich spannend, da wir einen besonderen Gast zu Besuch in unserem Labor haben und ich versucht habe, herauszufinden, wie wir die Community an einigen Dingen teilhaben lassen können, die wir konstruieren werden. Warum nicht die gesamte Laborarbeit live auf unseren YouTube-Channel übertragen, damit unsere Zuschauer sehen, woran wir arbeiten, und mit uns interagieren können?
Beide Projekte sind ziemlich unterhaltsam, und da wir einen Satz Raspberry Pi 3 zur Hand hatten, beschloss ich, einen davon zu verwenden und auszuprobieren, ob ich ihn dazu bringen kann, mehrere Videofeeds aufzuzeichnen, oder ihn in ein effizientes Streaming-Gerät zu verwandeln, um nicht den leistungsstärkeren Laptop unserer Video-Kollegen kidnappen zu müssen. Wenn ich diesen kleinen Einplatinenrechner dazu bringen könnte, diese Aufgaben zu erledigen, würde dies tatsächlich leistungsstärkere Maschinen entlasten und zudem wäre es eine coole Demonstration. Doch ich fragte mich, ob diese Platine wirklich das Zeug dazu hat.
Zu Anfang recherchierte ich einfach alles, was ich zur Videoaufnahme fand, und entschied mich dazu, mit einer USB-Webcam zu arbeiten, die ich gerade griffbereit hatte: die Logitech C920. Außerdem beschloss ich, die NoIR Pi Kamera einzusetzen, die wir bei unserem Projekt Fridge Defender verwendet hatten. Während der Raspberry Pi mit einer vorinstallierten Software zur Videoaufzeichnung wie Streamer versehen ist, wählte ich einen anderen Weg. Ich arbeitete an der Nutzung von FFmpeg, das von einer breiten Community verwendet wird und zahlreiche Optionen für verschiedene Encoder bereithält, was mir Flexibilität und jede Menge Beispiele für den Einstieg bot.
Meine ersten Ergebnisse waren nicht sehr vielversprechend. Die Nutzung von FFmpeg zur Aufzeichnung von Videos mit der USB-Webcam in eine AVI-Datei brachte schlechte Resultate – der Raspberry Pi nutze ca. 50 % der CPU und ließ nicht darauf hoffen, 1080p-Videos bei ordentlichen 30 Bildern pro Sekunde aufzuzeichnen. Als ich fortfuhr und mir die Ergebnisse anschaute, erhielt ich etwa 6,6 Bilder pro Sekunde, was in einem ruckelnden Video resultierte, das weder brauchbar für unseren Labor-Livestream noch für die 3D-Objekterzeugung war. Ich reduzierte auf 720p und sah eine Verbesserung von 14 Bildern pro Sekunde, doch das lohnte sich noch immer nicht. Der Wechsel zum WVGA-Format (von 854x480) brachte mir schließlich endlich meine ersehnten konsistenten 30 Bilder pro Sekunde, doch die Videoqualität ließ zu wünschen übrig und für die Bilderkennung gilt: je mehr Pixel, desto besser. Ich war enttäuscht von meinem kleinen Zugpferd Pi, doch nicht bereit, mich geschlagen zu geben.
Zu diesem Zeitpunkt hatte ich die Wahl, einen anderen Computer mit zusätzlicher Leistung einzusetzen oder der Sache auf den Grund zu gehen. Ich entschied mich, der Sache auf den Grund zu gehen, da ich Herausforderungen liebe und überzeugt war, dass der Pi mehr drauf hat. Ich begann, FFmpeg zum Testen mit verschiedenen Codecs für Audio und Video neu zu kompilieren. Vom Kompilieren von FFmpeg auf dem Raspberry Pi wurde typischerweise abgeraten, da das Kompilieren von Code jede Menge Arbeit sein kann, doch aus eigener Erfahrung, und wenn man die vier Kernprozessoren des Raspberry Pi 3 berücksichtigt, ist es sicherlich sinnvoll, FFmpeg lokal mit mehreren Optionen zu kompilieren. Entscheidet man sich tatsächlich dazu, lokal zu kompilieren, nimmt dies keine Stunden in Anspruch, man hat aber genug Zeit, sich einen Kaffee zu holen und ein Schwätzchen zu halten. Man sollte allerdings sichergehen, den Befehl „make -j4“ zu verwenden, um die vier Kerne des Pi voll auszunutzen, ansonsten könnte es länger dauern.
Zu meinem erhofften Erfolgserlebnis kam es schließlich in einer Nacht von Donnerstag auf Freitag, in der mich Koffein und gute Musik bei Laune hielten. Mein größtes Problem mit dem Pi war die begrenzte Leistung, die dem Versuch diente, meinen eingehenden Videostream zu etwas zu transkodieren, das meines Erachtens brauchbarer war. Die Kamera gab einen unbearbeiteten Videofeed aus, den der Pi dann ins gängigere mpeg4-Format umwandelte. Diese Transkodierung nahm Leistung des Prozessors, Bandbreite zur Speicherung sowie Speicherplatz in Anspruch. Das Problem der unbearbeiteten Eingabe mit der C920 lässt sich umgehen. Die C920 verfügt über einen speziellen eingebauten Encoder, der einen h.264-kodierten Stream herausgeben kann. H.264 ist ein weiteres gängiges Videoformat, doch obwohl es mich meinem Ziel wesentlich näher bringt, würde eine Transkodierung noch immer meine Videobilder pro Sekunden zerstören.
Nachdem ich herausfand, dass die Kamera mir h.264 ohne Mehraufwand herausgab, entdeckte ich zudem, dass YouTube einen h.264-Stream für die Laborübertragung erfassen kann, ohne dass ich ihn vorher bearbeiten müsste. Ich musste den Ton noch etwas abändern, doch das belastete den Pi nicht. Nachdem ich in der Lage war, den h.264-Stream einfach durchzuleiten, sah ich mich auch schon in 1080p-Qualität auf YouTube bei stabilen 30 Bildern pro Sekunde. Ich war begeistert.
Um Ihnen einen Startpunkt für Ihre eigenen Projekte zu geben, ist hier mein letzter in FFmpeg eingegebener Set-Befehl:
ffmpeg -ar 44100 -ac 2 -f alsa -i hw:1,0 -f v4l2 -codec:v h264 -framerate 30 -video_size 1920x1080 -itsoffset 0.5 -i /dev/video0 -copyinkf -codec:v copy -codec:a aac -ab 128k -g 10 -f flv rtmp://a.rtmp.youtube.com/live2/(Ihr Stream-Key hier)
Der obenstehende Befehl liefert mir einen Stream von 1080p und 30 Bildern pro Sekunde mit Ton von meiner USB-Webcam an YouTube. Es ist noch immer einiges an Feinschliff erforderlich, um alles perfekt zu machen, denn YouTube beschwert sich noch immer, meine Keyframes seien nicht korrekt, doch bei diesen Ergebnissen lässt sich kaum streiten und es funktioniert wirklich.
Da ich jetzt tatsächlich Videos von 1080p und 30 Bildern pro Sekunde aufzeichnen kann, denke ich, dass ich wenigstens ein paar der Feeds erhalten kann, die ich für unser 3D-Bildgebungsprojekt benötige. Das h.264-Video kann ins MPEG4-Format konvertiert werden, nachdem es unter Verwendung von MP4Box auf dem Pi aufgezeichnet wurde, um unserer Analysesoftware etwas zu liefern, das sich für die Analyse in einzelne Bilder aufgliedern lässt.
Hier das Ergebnis: Der Raspberry Pi 3 bietet genug Leistung, um ein hochauflösendes Video effektiv an YouTube zu übertragen – Sie müssen nur sicherstellen, dass die von Ihnen verwendete Kamera einen kodierten Stream liefert. Der Pi hat vielleicht nicht alles, was zur Transkodierung eines 1080p-Videos in Echtzeit erforderlich ist, doch mit den richtigen Entscheidungen und ein wenig Ausprobieren kann er doch einiges leisten. Ich freue mich schon, zu sehen, was Sie mit diesen Einblicken zusammenstellen, und ich hoffe, Sie alle können sich unseren Livestream aus dem Labor mit besonderen Gästen ansehen, denn wir arbeiten an unseren nächsten coolen Projekten.