Constantin Posted April 19, 2017 Share Posted April 19, 2017 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? Quote Link to comment
Griga Posted April 19, 2017 Share Posted April 19, 2017 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. Quote Link to comment
Constantin Posted April 19, 2017 Author Share Posted April 19, 2017 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. Quote Link to comment
Griga Posted April 19, 2017 Share Posted April 19, 2017 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. Quote Link to comment
Constantin Posted April 19, 2017 Author Share Posted April 19, 2017 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! Quote Link to comment
Tjod Posted April 19, 2017 Share Posted April 19, 2017 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. Quote Link to comment
Constantin Posted April 26, 2017 Author Share Posted April 26, 2017 Danke Tjod, das probiere ich aus! Quote Link to comment
Constantin Posted April 26, 2017 Author Share Posted April 26, 2017 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! Quote Link to comment
gleddamax Posted April 26, 2017 Share Posted April 26, 2017 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. Quote Link to comment
Constantin Posted April 26, 2017 Author Share Posted April 26, 2017 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! Quote Link to comment
Tjod Posted April 26, 2017 Share Posted April 26, 2017 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. Quote Link to comment
Constantin Posted April 26, 2017 Author Share Posted April 26, 2017 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. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.