Da ich in diesem Artikel gerade beschrieben hatte, wie man aus einem RTSP-Stream sich selbst aktualisierende Einzelbilder macht, der Vollständigkeit halber noch kurz angesprochen, wie man einen RTSP-Stream in einen anderen Stream (z.B. MPEG) konvertiert.
Dazu notwendig ist ffserver welcher sich wohl unter gewissen Umständen mit ffmpeg zusammen installiert. Auf einem von zwei Macs mit installiertem ffmpeg war ffserver bei mir vorhanden.
Fragt mich aber bitte nicht, durch welche Installations-Umstände es da drauf kam. Auf jeden Fall kann ich keine separate ffserver-Installation finden.
Sorry erstmal für dieses lieblose "Tutorial" (<-- diese Gänsefüßchen sind da nicht ohne Grund). Aber irgendwann hatte mich die erfolglose Probiererei, aus einem RTSP-Stream einen HTML5-fähigen Stream zu machen, ziemlich angekäst.
Codecs
Codecs, Formate, Encoder und Decoder von ffmpeg kann man sich wie folgt auflisten lassen:ffmpeg -formats
ffmpeg -encoders
ffmpeg -decoders
Aber Vorsicht: Ich habe nicht das Gefühl, dass die hier aufgelisteten Codecs/Formate/Encode/Decoder auch überhaupt nur etwas damit zu tun haben, was tatsächlich zur Verfügung steht. Das scheint sich mir eher um so eine "könnte sein"-Liste zu handeln. Von dem her kann man sich die vier Befehle auch sparen...
Vor der Installation von ffmpeg sollte man sicherstellen, dass man alle benötigten Codecs auf dem System installiert, die man später zur Ausgabe verwenden möchte (z.B. H.264 oder WebM).
Bei der Installation sollte der gewünschte Codec dann mit --enable-lib*** mitgegeben werden.
ffmpeg nachträglich irgendwelche Codecs beizubringen; daran bin ich gescheitert. Bei meinen zahlreichen Recherchen bin ich auch nie auf eine Info gestoßen, dass dies überhaupt möglich wäre.
Man sollte sich also genaustens Gedanken machen, wie man ffmpeg installiert, bevor man es installiert. Wobei ich, wenn ich mich noch richtig erinnern kann, damals froh war, dass ich es überhaupt durch irgendwelche Kniffe auf dem Mac installiert bekommen hatte. Dass nun die wichtigsten Codecs fehlen, ist allerdings ärgerlich.
Stream konvertieren
Nehmen wir nun an, wir wollen einen RTSP-Stream in einen MJPEG-Stream wandeln.Wir verwenden ffserver, um den MJPEG-Stream auf die Welt los zu lassen. Mit Hilfe von ffmpeg übergeben wir den bestehenden RTSP-Stream an ffserver, der für die Konvertierung zuständig ist.
Für ffserver müssen wir eine Konfigurations-Datei /etc/ffserver.conf erstellen:
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 5
MaxBandwidth 10000 # Maximale Bandbreite je Client
CustomLog -
<Feed feed.ffm>
File /tmp/feed.ffm
FileMaxSize 1g
</Feed>
<Stream test.mjpeg>
Feed feed.ffm
Format mjpeg
VideoCodec mjpeg
VideoFrameRate 1
VideoBitRate 512
VideoSize 640x480
NoAudio
</Stream>
<Stream stat.html>
Format status
# Status/Info-Seite nur für Leute aus dem lokalen Netzwerk:
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
Server mit
ffserverstarten.
Und dann mit einem weiteren Kommando den existierenden RTSP-Stream mit fmpeg zum aktiven ffserver streamen:
Wir geben hier als Ziel den in der ffserver-Config definierten Feed-Namen feed.ffm an.
Die ffserver.conf kann mehrere Feed-Angaben (input) und je Feed mehrere Streams (output) haben.
Die angegebene Status-Seite würde unter der Adresse
http://localhost:8090/stat.htmleine Übersicht über vorhandene Streams und verbundene Geräte liefern.
Nun benötigen wir aber zwei offene Shells. Auf einer läuft der ffserver, auf einer ffmpeg, welches Stream A zum Server sendet.
Letzteres könnten wir uns sparen, wenn wir die ffserver-Konfiguration anpassen. Hierzu fügen wir die Adresse des RTSP-Streams, den wir konvertieren wollen in den
<Feed/>-Tag der
ffserver.conf mit ein:
File /tmp/feed.ffm
FileMaxSize 1g
Launch ffmpeg -i rtsp://user:password@192.168.1.99:554/Streaming/Channels/2 -c copy
</Feed>
Stream so wandeln, dass wir ihn in HTML5 einbinden können
Also in der Theorie müsste unser Output-Stream in derffserver.confetwa so ausehen
Feed feed.ffm
Format webm
VideoCodec libvpx
AVOptionVideo flags +global_header
AVOptionVideo cpu-used 0
AVOptionVideo qmin 1
AVOptionVideo qmax 31
AVOptionVideo quality good
PreRoll 0
StartSendOnKey
VideoBitRate 500K
VideoSize 640x480
NoAudio
</Stream>
Dann könnte man ihn so in einer Website einbinden
<head></head>
<body>
<video width="640" height="480" controls>
<source src="http://<ffserverip>:8090/stream.webm" type="video/webm">
</video>
</body>
</html>
In der Theorie...bei mir scheiterte es daran, dass ffmpeg kein libpvx-VideoCodec installiert hat.
Auch bei älteren ffmpeg-Installationen mit libvpx könnte dies daran scheitern, dass die libvpx-Version zu alt ist und HTML5-Streaming nicht gescheit unterstützt. Wer experimentierfreudig ist, sollte mal ffmpeg samt Codecs neu installieren...
Codecs/Formate, die vom HTML5
<video/>-Tag unterstützt werden:
--------------------------------------------------------------------------
.mp4 H.264 libx264 AAC libfdk_aac
.ogg/.ogv Theora libtheora Vorbis libvorbis
.webm VP8 libvpx Vorbis libvorbis
![]() ![]() ![]() ![]() |
|
Erstellt am: 03.01.2016 | .Kommentieren |