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 -codecs
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:

/etc/ffserver.conf
Port               8090
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

ffserver
starten.

Und dann mit einem weiteren Kommando den existierenden RTSP-Stream mit fmpeg zum aktiven ffserver streamen:

ffmpeg -i "rtsp://user:password@192.168.1.99:554/Streaming/Channels/2" http://localhost:8090/feed.ffm

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.html
eine Ü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:

/etc/ffserver.conf
<Feed feed.ffm>
     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 der
ffserver.conf
etwa so ausehen

/etc/ffserver.conf
<Stream stream.webm>
     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

<html>
  <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:

Format     Video-Codec     ffmpeg codec:v    Audio-Codec    ffmpeg codec:a
--------------------------------------------------------------------------
.mp4       H.264           libx264           AAC            libfdk_aac
.ogg/.ogv  Theora          libtheora         Vorbis         libvorbis
.webm      VP8             libvpx            Vorbis         libvorbis