Upload Traffic überwachen > wenn zu gering > batch ausführen



  • Hi Leute,

    erstmal zum Hintergrund:
    Ich streame auf YouTube verschiedene Wildvogel-Kameras.
    Gestreamt wird mit OBS Studio. Leider hat OBS einen schwerwiegenden Bug, bei dem der Upload beim ausgehenden RTMP-Stream einfach auf Null fällt, also keine Daten mehr gesendet werden, OBS davon aber nicht mitbekommt, also keinen Fehler anzeigt.
    Das hab ich auf mehreren Systemen...

    Meine Idee:
    Könnte man nicht den Upload-Traffic irgendwie aller paar Minuten abfragen und wenn dieser unter 1000 kb/s fällt wird eine batch Datei ausgeführt - Inhalt der batch Datei: OBS schließen und neustarten.
    OBS sendet ja im Normal-Zustand permanent mit ca. 6000 kb/s. Sobald weniger als 1000 kb/s erkannt werden, würde ein Neustart den Fehler eben umgehen.

    Da ich leider im C++ Bereich gar keine Ahnung habe, wollte ich fragen, ob mir bei diesem Projekt jemand helfen kann.
    Wäre auch nicht umsonst 🙂

    Vielen Dank
    Liebe Grüße
    Thomas


  • Mod

    Das läuft über das Aufrufen diverser Betriebsystemfunktionen (d.h. der C++-Teil wird sich auf eine Schleife und ein if beschränken und könnte genauso in jeder anderen Sprache geschrieben sein, zum Beispiel als Teil deiner Batchdatei). Dazu musst du uns natürlich verraten, um welches Betriebssystem es geht, dann verschiebe ich dich in das passende Fachforum.



  • @SeppJ
    Ich nutze aktuell Windows 10 (21H2)
    Das wäre natürlich noch besser, wenn ich das einfach mit in die batch Datei schreiben könnte.
    Hat jemand eine Idee wie sowas aussehen könnte?

    Ich bin über jeden Beitrag und Schnipsel, der mich zum Ziel führt, sehr dankbar 🙂
    Vielen vielen Dank



  • Muss es unbedingt C++ sein?

    Im C# Forum gab es kürzlich einen Beitrag über Traffic-Überwachung, das ist doch genau das, was du suchst. Und das .Net Framework bietet dafür schon fertige Klassen an, da musst du nicht noch erste C/C++ Bibliotheken suchen, die du benutzen kannst. In C# sollte das trivial zu lösen sein, wenn man auf Chromleisten und Schnörkel verzichtet.



  • @DocShoe
    Mir ist absolut jeder Weg recht 🙂
    Ich habe für die OBS Streams eigens abgestellte Streaming PCs. Wenn es sein muss würde ich sogar Linux drauf installieren 😅



  • Dann guck mal hier, ob dir das weiterhilft.





  • @DocShoe
    kannst du mir mal eine PN schicken?



  • @dreamer84

    Das war nicht ernst gemeint...
    Hast du Programmierkenntnisse/-erfahrung?



  • @DocShoe
    Ich hatte mal ein Projekt an einen Raspberry Pi mit Python und eins an einem Arduino mit C++.
    Das Prinzip verstehe ich im Ansatz, aber dann hörts leider auch schon auf 😞
    Ich bin aber lernfähig 😁



  • Fängt denn OBS Studio von selbst zu streamen an wenn man es startet? Also reicht wirklich das Neustarten des Prozesses, ohne dass man noch irgendwo hin klickt oder ähnliches?



  • @hustbaer
    Eigentlich startet es nicht von allein. Ich nutze aber einen Befehl hinter dem Pfad (Ziel), damit der Stream direkt startet wenn ich OBS öffne:
    "C:\Program Files\obs-studio\bin\64bit\obs64.exe" --startstreaming
    Das funktioniert zu 100% zuverlässig.
    Damit dürfte das bloße starten absolut ausreichen.



  • Dafür c++ einzusetzen erscheint mir ein bisschen wie mit Kanonen auf Spatzen zu schießen.

    Ich bin kein Powershell Experte und habe mir das gerade zusammen gegoogelt, aber mit so einem Skript könnte das gehen.

    $threshold =  1000
    
    $wmi = (Get-WMIObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesReceivedPerSec).BytesReceivedPerSec
    $kbytes = $wmi[1] / 1kb #depends on number of network interfaces
    
    if($kbytes -le $threshold)
    {
        Write-Output $kbytes
        Write-Host "restart"
    }
    else    
    {
        Write-Output $kbytes
        Write-Host "all ok"
    }
    

    Man beachte, dass man, wenn man mehrere Netzwerkinterfaces hat, ein Array zurück bekommt und ich da fest eine 1 rein gedonnert habe um das auf meinem aktuell verbundenen Netzwerkinterface zu testen.

    In einer echten Anwendung würde man vlt überprüfen wollen, ob der Upload über mehrere Messungen hinweg zu niedrig ist. Kann ja auch mal andere Gründe haben, als einen zusammengebrochenen Stream.



  • @Schlangenmensch
    Hey, vielen Dank schon mal für den Code 🙂
    Ich hab den jetzt mal getestet bei einem PC ohne Stream spuckt er "0 & restart" aus - das dürfte ja passen.
    Auf einemStreaming PC mit einem aktuell laufenden Stream spuckt er aber auch "0 & restart" aus.
    Muss ich da noch was einstellen?

    Echt, danke vielmals für eure Hilfe hier!



  • Vermutlich musst du das BytesReceivedPerSec durch das "Gesendet"-Pendant ersetzen. Du willst dir ja den upload angucken.


  • Mod

    Da du überhaupt keine Ausgabe hast, hast du wahrscheinlich nur ein Netzwerkinterface, und das [1] in Zeile 4 läuft ins Leere.

    edit: Jetzt hast du es geändert. Als ich geantwortet habe, hattest du noch geschrieben, dass du als Ausgabe "& restart" hättest. Nichtsdestotrotz solltest du genau über den Kommentar zu den mehreren Netzwerkinterfaces nachdenken. Die jetzige Implementierung mit der festen [1] ist nicht solide (ich muss bei mir beispielsweise 2 nutzen). Entweder musst du weiter ausholen und irgendwie das richtige Interface bestimmen, oder nimm einfach die Summe über alle Interfaces, wenn du weißt, dass da sonst nichts läuft. Du kannst dir ja mal die Ausgabe von (Get-WMIObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesReceivedPerSec).BytesReceivedPerSec angucken, wenn du das so in der Powershell ausführst



  • @DocShoe
    Wo finde ich das "Gesendet"Pendant? Was bedeutet das genau?

    @SeppJ
    Sorry, hatte die 0 nur vergessen...
    Ich habe auch mal eine 2 eingetragen. Passiert aber nichts anderes.
    Ich habe mal einen Screenshot gemacht. Dort sieht man rechts unten, dass OBS einen 6.000er Upload hat:::



  • @dreamer84

    BytesReceivedPerSec ist doch der Wert für den Empfang, du brauchst aber den Upload-Kanal. Grade google befragt und das sagt mir: BytesSentPerSec.

    Guckst du hier.



  • @DocShoe
    Macht Sinn...
    Hab ich ausgetauscht... bleibt aber trotzdem bei "0 & restart"



  • @DocShoe sagte in Upload Traffic überwachen > wenn zu gering > batch ausführen:

    Vermutlich musst du das BytesReceivedPerSec durch das "Gesendet"-Pendant ersetzen. Du willst dir ja den upload angucken.

    Huch... eigentlich wollte ich das mit BytesSentPerSec gepostet haben

    @dreamer84 wenn es nur ein Interface gibt, kannst du mal versuchen das [1] zu löschen. Ich meine irgendwo gelesen zu haben, dass dann kein Array zurück gegeben wird. Aber Achtung: Gefährliches Halbwissen.

    Edit: Aber auch bei Powershell fangen indizies mit 0 an, also hätte man bei 2 Interfaces $wmi[0] oder $wmi[1] . Wie viele Netzwerkinterfaces man hat, kann man bestimmt auch programmatisch abfragen.

    Edit2 : Vlt einfach mal (Get-WMIObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesSentPerSec).BytesSentPerSec in der Powershell ausführen und das Ergebnis hier posten 😉


Anmelden zum Antworten