Jump to content

RTSP Stream mit Zugangsdaten als TS Stream einbinden


Constantin

Recommended Posts

Die Möglichkeit seit v6.0, Streams als Sender anlegen zu können, ist der absolute Hammer! Endlich wieder ein paar Lokalsender, die es nicht per Sat gibt und ein paar zusätzliche ausländische Sender. Dafür habe ich gerne die 19€ für den DMS ausgegeben!

 

Heute habe ich mal versucht, meine beiden IP-Sicherheitskameras von Foscam einzubinden. Die senden einen H264-Stream unter der folgenden URL (beispielhaft):

rtsp://benutzername:passwort@ip:port/videoMain

Im VLC-Player funktioniert das beispielsweise problemlos. Im DVBViewer bleibt allerdings der Bildschirm schwarz. Im DVB Source Filter steht bei Audio und Video "No data / unconnected" (Audio gibt es nicht, da wäre das also normal, aber ein Bild ist im Stream definitiv vorhanden, da er ja im VLC läuft).

 

Drei Gründe scheinen mir jetzt plausibel:

1. Der DVBViewer unterstützt generell kein RTSP, sondern nur HTTP streams (konnte ich mangels anderem Test-Stream nicht ausprobieren)

2. Der DVBViewer kann das Format des Video-Streams nicht wiedergeben

3. Der DVBViewer kann nicht damit umgehen, dass Benutzername und Passwort in der URL enthalten sind

 

Wenn es nicht direkt 1 ist, wie finden wir denn zusammen am besten heraus, was es ist? Kann ich euch irgendwie einen Schnipsel des Streams zukommen lassen, ohne dass das Kamerabild hier öffentlich im Forum sichtbar ist?

 

Und falls es 1. ist - besteht die Chance, dass RTSP in Zukunft unterstützt wird?

 

Link to comment

Der DVBViewer unterstützt nur Sat>IP konformes RTSP, so wie es Sat>IP-Server liefern.

 

Hier steht im Abschnitt "Streaming", was der DVBViewer verarbeiten kann. Er ist also nicht so vielseitig wie der VLC, sondern akzeptiert nur das, was in seinen DVB-Kontext passt.

 

Du könntest allerdings mal probieren, ob der LAV Sourcefilter etwas mit der RTSP URL anfangen kann (vorausgesetzt, die LAV Filters sind installiert). Dazu musst du die URL unter Wiedergabe -> URL öffnen eingeben.

 

Link to comment

Danke für die schnelle Antwort, Griga!

 

Über Wiedergabe > URL öffnen funktioniert es tatsächlich! Seltsamerweise aber nur als Standbild - die Aktualisierung des Bilds muss ich über "Wiedergabe neu aufbauen", oder durch Verändern der Fenstergröße oder durch verschieben des Fensters manuell triggern. (LAV Filter sind aber auf dem aktuellsten Stand)

 

So oder so hätte ich die Streams aber gere als Sender eingerichtet, damit ich sie auch auf dem TV per Kodi oder unterwegs über die DVBViewer App anschauen kann. Aber davon muss ich mich ja dann wohl leider verabschieden, wenn die Streams nicht die entsprechenden Voraussetzungen erfüllen.

Link to comment

Da der VLC auch als Server arbeitet, könnte er theoretisch den RTSP Input in einen HTTP-Stream mit eingebettetem Transportstrom konvertieren, der wiederum im DVBViewer als Senderlisten-Eintrag funktionieren würde - bliebe zu probieren, ob das klappt. Aber dann müsste der VLC ebenfalls die ganze Zeit laufen.

Link to comment

Damit probiere ich gerade herum - aber leider crashed der VLC immer, sobald ich das Transcoding aktiviere - und ohne bleibt das Bild schwarz. Vermutlich hat der Chinesische Kamera-Hersteller da beim Format irgendetwas zusammengemurkst... Aber falls ich es doch irgendwie hinbekommen sollte, poste ich hier ein Update!

Link to comment

Neben dem VLC Player wäre auch ffmpeg eine Option um einen Stream zu Transcodiren.

Aber da gibt es dann halt keine GUI und man muss sich die Parameter z.B. im einer bach Datei (.bat) zusammen basteln.

https://trac.ffmpeg.org/wiki/StreamingGuide

 

Als erstes mal stream zu Datei, das könnte eventuell so gehen:

ffmpeg.exe -i "rtsp://benutzername:passwort@ip:port/videoMain" -f mpegts "c:\Video\test.ts"

 

Wenn das klappt und sich die Datei im DVBViewer abspielen lässt kann man gucken in welchem Format man dass von  FFmpeg direkt weiter streamt.

Link to comment

Hi Tjod,

 

das hat hervorragend funktioniert! Den transcodierten Stream lasse ich auf dem lokalen Apache mit PHP wie folgt ausgeben:

<?php
set_time_limit(0);
header('Content-Type: video/mp2t');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache"); 
header("Pragma: no-cache");

$cmd = 'ffmpeg.exe -i "rtsp://user:password@ip:port/videoMain" -f mpegts -c copy -an pipe:1';

passthru($cmd);
exit;

 -c copy hat zu einer Verbesserung der Bildqualität geführt (soweit ich das verstehe, wird dadurch das transcodieren verhindert und nur das Containerformat geändert?)

-an entfernt den Audiokanal, der ja sowieso nicht vorhanden ist (bzw. einen unangenehmen Brummton beherbergte ;))

 

Vielen Dank für den Denkanstoß in die richtige Richtung!

Link to comment

ffmpeg kann wohl auch direkt streamen. Auf trac.ffmpeg.org gibt es einen entsprechenden Guide dazu, den ich nur kurz überflogen habe. Wäre das vielleicht auch eine Möglichkeit? Die copy-option scheint es dort auch zu geben. Ob der Input ein Stream sein kann weiß ich jetzt allerdings nicht.

 

Mit PHP kenne ich mich jetzt nicht aus. Wird bei dir der Stream dann als Datei auf die Festplatte geschrieben oder wird das von deinem Apache so dann weitergestreamt?

 

Zitat

-c copy hat zu einer Verbesserung der Bildqualität geführt (soweit ich das verstehe, wird dadurch das transcodieren verhindert und nur das Containerformat geändert?)

 

absolut richtig. '-c' ist die Kurzschreibweise von '-codec'; der Parameter 'copy' weist ffmpeg an, den Videoteil des Streams unverändert in den neuen Kontainer zu packen/kopieren.

 

-c copy wird jeweils den ersten Audio- und Videostrom im Stream / in der Datei angewendet. Bei mehreren Strömen (in der Regel Audio z.B. DVB-Aufnahmen) muss man per -map <nr.:nr.> - Option weitere bestimmen bzw. aussuchen wenn man nur einen will.

Mit -c:v <Parameter> kann man den codec für den Videoteil feslegen, analog dazu mit -c:a <Parameter> den für Audio.

 

 

Zitat

-an entfernt den Audiokanal

-vn enfernt den analog dazu den Videoteil, wenn man nur Audio haben möchte.

Link to comment

Hi @gleddamax,

 

wenn ich das richtig sehe, hätte ich mit der Lösung aber wieder ein RTP-Stream - aber vielleicht geht das auch als HTTP Stream bei entsprechender Konfiguration. Aber egal, für mich funktioniert die Lösung jetzt sehr gut, wie ich sie habe! Danke trotzdem für die Info!

 

Auf die Platte gespeichert wird nichts, über pipe:1 werden die Daten direkt in den STDOUT geschrieben, und PHPs passthru() gibt sie direkt an den Client (im Browser durch den mime type als Download) weiter.

 

Bin ganz begeistert, dass das jetzt funktioniert. Vielleicht ist es ja auch für jemand anderen brauchbar! :)

Link to comment

ffmpeg kann so ziemlich alles was man mit Audio und Video machen will solange es nicht um das anzeigen direkt geht. Die GUI Geschichten würde ich nur nutzen wenn man mit der Kommandozeilen Geschichte überfordert ist oder nur kurz was testen will. Alle die es da gibt decken nur einen winzigen Bruchteil der ffmpeg Funktionen ab.

 

Wenn du statt pipe:1  tcp://127.0.0.1:2000?listen nimmst kannst du direkt einen stream erzeugen mit dem der Aktuelle DVBViewer oder DMS was anfragen kann.

Zitat

ffmpeg.exe -i "rtsp://user:password@ip:port/videoMain" -f mpegts -c copy -an tcp://127.0.0.1:2000?listen

Das müsstest du dann aber über eine Bach Datei oder verknüpfen immer starten wenn du das brauchst.

 

Im DVBViewer wäre die URL tcp://127.0.0.1:2000 um das aufzurufen.

 

Aber wenn der Webserver sowieso läuft ist die php Lösung wahrscheinlich eleganter weil so wie ich dass verstehe, das Transcodiren erst gestartet wird wenn auf die Adresse zugegriffen wird. Also nicht manuell gestartet werden muss und auch nicht läuft wenn der stream nicht gebraucht wird.

Link to comment

Ganz genau, es wird nur gestartet, wenn ich den Stream per HTTP request angefordert wird, und ffmpeg wird auch automatisch beendet, sobald die Verbindung getrennt wird. Für mich exakt so, wie ich es mir als Idealfall gedacht hatte! :)

 

Der Webserver läuft sowieso mit auf dem Rechner, auf dem der DMS läuft. Im DVBViewer sind meine beiden Cams als TS Streams unter

http://localhost/cam1

http://localhost/cam2

angelegt (in den Ordnern jeweils eine index.php mit dem obigen Script) - läuft jetzt Tadellos und ich kann auf dem Fernseher in Kodi wie ganz normale TV-Programme auf die Cams schalten. ;)

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...