Gleichzeitige Wiedergabe von 12 RTP Streams

  • Hallo,


    ich möchte gerne 12 Multicast Streams eines SatIP Servers überwachen. Aus diesem Grund müssten alle Streams gleichzeitig auf einem Rechner laufen.
    Um das erstmal kurz zu testen habe ich es an meinem Rechner probiert. Das Ergebnis: Nach 4 Streams läuft meine CPU (Core i3-4330) auf 100% und mein Arbeitsspeicher ist mit 4GB auch schon knapp an der Grenze.


    Zunächst Informationen zu den Streams:


    Video:
    Codec: H264 - MPEG-4 AVC (part 10) (h264)
    Resolution: 1920x1090


    Audio:
    Codec: A52 Audio (aka AC3) (a52 )


    Hat jemand eventuell eine Idee, wie ich die 12 Streams alle gleichzeitig aufrufen kann, ohne dabei die CPU so stark zu belasten?

  • Hallo prostream,


    man könnte eine Lösung, so wie Du es Dir vorstellst mit dem VLC-Player realisieren. Ich habe hier im Forum etwas ähnliches mit DVB-Programmen zusammengestellt. Mein Ansatz ist eine html-Seite, in der verschiedene Signalquellen (DVB-T/S, Festplatte, Internet...) zu einem TV-Mosaic zusammengefasst sind.
    Siehe Link: https://www.vlc-forum.de/index.php/Thread/2006


    Eine andere Lösungsmöglichkeit könnte die Erweiterung "VLC broadcasting with mosaic" sein.
    Siehe Link: http://addons.videolan.org/content/show.php?action=content&content=163174


    Es gibt einige Überlegungen zu berücksichtigen.
    Bereits mit 10× TV-Programmen in SD-Auflösung (MPEG-2 Codec) gelangt mein 100 Mbit/s LAN-Switch an seine Grenze. Auch wenn die Netzwerkkarte des PC auf dem das TV-Mosaic wiedergegeben wird 1 GBit/s Ethernet Bandbreite bietet, werden nicht mehr als 10× TV-Programme (ca. 9,5 % Netzwerk-auslastung) flüssig wiedergegeben. Der PC wird von einem "Intel core i7" mit Rechenleistung versorgt. Ein "Intel core i3"-Prozessor, wird nicht genügend Rechenleistung bieten, zumal Du HDTV-Format verwendest.
    Möglicherweise hast Du einen leistungsfähigeren Computer im Hintergrund, der das HDTV-Format herunterrechnen (transcodieren) kann. Der VLC-Player bietet diese Möglichkeit.
    Was soll mit dem Ton geschehen?
    Kannst Du auf die HDTV-Bildauflösung im Control-Bildschirm (PC) verzichten?


    MfG
    Thomas

  • Hallo thweiss,


    danke für deine Antwort!
    Wir verwenden hier eine komplette Gigabit Infrastruktur, daher macht das Netzwerk uns hier derzeit keine Probleme.
    Wo wir allerdings Probleme mit haben ist die Rechenleistung. Wie du auch schon sagtest wird hiervon für das encodieren definitiv mehr gebraucht als ein Core i3 hergeben kann. Ich habe es mit einem Core i7-3770k versucht. Selbst dieser ist sofort an der Leistungsgrenze. Nach kurzem Overclocken lief es halbwegs flüssig mit 4Ghz Taktung... Das ist aber ja kein Dauerzustand.


    Der Ton soll erstmal gemutet werden, spielt also erstmal keine Rolle.
    Auf die HDTV-Auflösung kann ich gut verzichten. Ich skaliere alle Streams runter, über den zoom Parameter. Gibt es hier die Möglichkeit die Auflösung runterzusetzen, um Rechenleistung einzusparen?


    Folgend noch meine Batch Datei:



    Bei den Freien Sendern wird ein Zoom von 0,375 angewandt, da diese "nur" in HD-Ready ausgestrahlt werden.

  • Hallo prostream,


    die Lösung den Bildschirm (1920 × 810 Punkte) in 12× Bereiche aufzuteilen gefällt mir. Schöne Idee.


    Video 1 Video 2 Video 3 Video 4
    Video 5 Video 6 Video 7 Video 8
    Video 9 Video 10 Video 11 Video 12


    Aufgrund der begrenzten Rechenleistung könnte man die Matrix auf 3×3 reduzieren. Damit könnte ohne Übertaktung der Intel core i7 Prozessor klarkommen. Oder man braucht noch mehr Rechenleistung.
    Die andere wahrscheinlich besser geeignet Lösung wäre die HDTV-Streams vorher, idealerweise von irgend einen anderen leistungsfähigen PC oder mehreren PCs im gleichen Netzwerk entgegenzunehmen und in der Bildauflösung zu reduzieren, also die Videos transcodieren.


    Ich möchte ein Beispiel für ein per DVB-T verbreitetes TV-Programm hier einfügen, das mit einer 32-Bit Version des VLC-Players transcodiert wird.

    Code
    1. :Begin batch file
    2. cd c:\program files (x86)\videolan\vlc
    3. vlc dvb-t://frequency=746000000 :dvb-adapter=0 :bandwidth=8 :live-caching=1000 :program=20096 --sout=#transcode{vcodec=mp2v,vb=800,scale=0.5,acodec=mpga,ab=128,channels=2,samplerate=44100}:http{mux=ts,dst=:8080} :sout-keep


    Beispiel zwei für das gleiche TV-Programm mit der 64-Bit Version des VLC-Players.

    Code
    1. :Begin batch file
    2. cd c:\program files\videolan\vlc
    3. vlc dvb-t://frequency=746000000 :dvb-adapter=0 :bandwidth=8 :live-caching=1000 :program=20096 --sout=#transcode{vcodec=mp2v,vb=800,scale=0.5,acodec=mpga,ab=128,channels=2,samplerate=44100}:http{mux=ts,dst=:8080} :sout-keep


    Beide Scripte reduzieren die Bildauflösung des TV-Programms (SD-Format) genau um die Hälfte mit der Angabe "scale=0.5" im Zusammenhang mit der Stream-Option --sout=#transcode{}.
    Anstelle der Angaben des DVB-T Empfangs "dvb-t://... :program=20096" müsste man in Deinem Beispiel den Multicast-Stream als Eingangssignal eintragen und als Ausgang einen neuen, transcodierten (in der Bildauflösung reduzierten) Stream, vielleicht auch als unicast neu erstellen, der nur vom Controll-Monitor wiedergegeben wird.


    Aus Erfahrung hier im Forum und auch vom Videolan-Team wird die 32-Bit Version des VLC-Players empfohlen. Probiere dies mal für Dein Script aus. Vielleicht reduziert sich dadurch die benötigte Rechenleistung.


    Weitere Beispiele zum Thema Transcodieren findet man im folgenden Link (https://wiki.videolan.org/Docu…To/Command_Line_Examples/).


    Ich hoffe die Informationen helfen erst einmal weiter.


    MfG
    Thomas

  • Danke für deine Idee mit der 3x3 Aufteilung. Dadurch sind wir zu einem Kompromiss gekommen!


    Wir möchten nämlich nicht so großen Aufwand treiben nur um die Streams auf einem Monitor wiedergeben zu können.


    Unser Kompromiss ist es den Bildschirm in 4 zu unterteilen. 3 Teile spielen die Streams, welche immer wechseln und der 4. zeigt Server Statistiken an.
    Um das umzusetzen habe ich meine Batch Datei bis jetzt wie folgt geändert:


    Code
    1. @echo off
    2. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=0 --video-y=1 --loop --qt-start-minimized --no-video-title-show --zoom 0.75 C:\Users\MEINUSER\Desktop\SatIP Fullscreen\m3us\1.m3u
    3. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=960 --video-y=1 --loop --qt-start-minimized --no-video-title-show --zoom 0.5 C:\Users\MEINUSER\Desktop\SatIP Fullscreen\m3us\2.m3u
    4. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=0 --video-y=540 --loop --qt-start-minimized --no-video-title-show --zoom 0.5 C:\Users\MEINUSER\Desktop\SatIP Fullscreen\m3us\3.m3u


    Die Aufteilung funktioniert damit schon mal gut. Ich bräuchte nun nur noch eine Möglichkeit die jeweiligen Streams weiterzuschalten. Wie man sehen kann habe ich die 12 Streams in 3 Playlists (M3U) aufgeteilt. Somit müsste also jeder Teil 4 mal schalten, um dann von vorne zu beginnen.


    Hat eventuell noch jemand eine Idee, wie man das mit dem umschalten umsetzten kann?

  • Kennt eventuell jemand den Befehl für die Wiedergabezeit der aktuellen Datei? So könnte ich diese Zeit ja bspw. auf 5 Sekunden begrenzen und VLC spielt den nächsten Stream ab. Anschließend noch einen Loop einbauen und fertig.


    Dieser Parameter hat leider keine Auswirkungen:


    --run-time=<float> Run time
    The stream will run this duration (in seconds

  • Hallo prostream,


    die Option --run-time=<float> scheint mit einer größeren Ungenauigkeit zu reagieren oder anders gesagt sind die Angaben um +/- 5 Sekunden abweichend. Hier sollte man mal verschiedene Zeitwerte testen.


    Kodela hat dies hier im Forum beschrieben "https://www.vlc-forum.de/index.php/Thread/1867" unter Beispiele d) TV-Sendung aufzeichnen.


    Mein Beispiel mit DVB-T Aufnahme (Frequenz 498 MHz, TV-Programm SID=96) reagiert ab einen Wert von ca. 12 Sekunden für den Parameter "run-time".

    Code
    1. :Begin batch file
    2. cd c:\program files (x86)\videolan\vlc
    3. vlc --run-time=12 dvb-t://frequency=498000000 :dvb-adapter=0 :live-caching=300 :program=96 --sout=#file{dst="C:/Temp/Test.ts"} --no-sout-all vlc://quit


    MfG
    Thomas

  • Danke für den Hinweis! Leider greift der Befehl nicht bei mir. Ich habe den Befehl wie folgt eingebunden:


    Code
    1. @echo off
    2. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=0 --video-y=1 --loop --qt-start-minimized --no-video-title-show --run-time=5.5 --zoom 0.75 C:\Users\Admin\Desktop\m3us\1.m3u
    3. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=960 --video-y=1 --loop --qt-start-minimized --no-video-title-show --run-time=5.5 --zoom 0.5 C:\Users\Admin\Desktop\m3us\2.m3u
    4. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=1 --video-y=540 --loop --qt-start-minimized --no-video-title-show --run-time=5.5 --zoom 0.5 C:\Users\Admin\Desktop\m3us\3.m3u


    Nach 5 Sekunden läuft der Stream aber einfach weiter...

  • Ich habe herausgefunden, dass der Parameter

    Code
    1. --run-time=

    nur für bereits begrenzte Dateien funktioniert. Rufe ich bspw. eine AVI Datei mit diesem Parameter auf funktioniert alles einwandfrei. Sobald ich hiermit aber die m3u Datei aufrufe greift der Befehl nicht mehr.

  • Hallo prostream,


    der von Dir praktizierte Aufruf über Wiedergabelisten mag Vorteile haben, die damit verbundenen Nachteile dürften aber überwiegen. Wie Du schon erkannt hast, kann sich der Parameter run-time nicht auf die Wiedergabeliste beziehen, sie wird ja nicht wiedergegeben. Sie liefert nur wiederzugebende Objekte. Und so wie run-time für eine Wiedergabeliste verworfen wird, so geschieht dies auch bei anderen Parametern, die man auf eine Wiedergabeliste nicht anwenden kann. Deine "Einwirkungsmöglichkeiten" werden damit also stark eingeschränkt.


    Übrigens "meckert" der VLC nicht wegen jedem unsinnigen Parameter, häufig verwirft er solche einfach stillschweigend.


    MfG, kodela

  • Ich habe nun versucht den Befehl direkt auf den Stream anzuwenden. Das funktioniert ebenfalls nicht. Liegt es daran, dass der Stream keine Zeitliche Begrenzung hat bzw. unendlich ist

  • Liegt es daran, dass der Stream keine Zeitliche Begrenzung hat bzw. unendlich ist


    Hallo prostream,


    nein, das kann nicht sein, denn ich verwende run-time seit langer Zeit erfolgreich für die zeitliche Begrenzung von DVB-T Streams und die haben ja auch keine zeitliche Begrenzung. Eben habe ich es noch einmal getestet.


    MfG, kodela


  • Hallo prostream,


    nein, das kann nicht sein, denn ich verwende run-time seit langer Zeit erfolgreich für die zeitliche Begrenzung von DVB-T Streams und die haben ja auch keine zeitliche Begrenzung. Eben habe ich es noch einmal getestet.


    MfG, kodela


    Mh.. Ich verstehe dann allerdings nicht was ich falsch mache.
    Genau so müsste der Stream dann ja nach 5 Sekunden gestoppt werden, was er nicht tut:


    Code
    1. start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" --no-video-deco --no-embedded-video --video-x=1 --video-y=1 --loop --qt-start-minimized --no-video-title-show --run-time=5.0 --zoom 0.75 rtp://239.5.2.1:6670
  • Hallo prostream,


    da Du ja leider keinen (bei mir) funktionierenden Stream in Deinem Kommandozeilenstring verwendet hast, habe ich den String in dieser Form verwendet:


    Code
    1. start vlc --no-video-deco --no-embedded-video --video-x=1 --video-y=1 --loop --qt-start-minimized --no-video-title-show --run-time=2 --zoom 0.75 https://youtu.be/4pHJ0dVl_CY


    und damit funktionert alles, selbst bei 2 Sekunden und ohne Dezimaltrenner.


    MfG, kodela