Local Streaming ohne Delay

07/11/2019 12:49 Beaschi#1
Hallo Leute,

ich bin zurzeit dabei einen Hardware Bot für diverse Games zu bauen. Nun stellt sich für mich die Frage, wie bekomme ich ein Live Bild (von meinem Game) auf ein zweites externes Gerät wie Handy, Laptop, PC, ... habe es schon mit OBS Streaming probiert aber da hat man nen Delay von mehreren Sekunden.
Für meine Methode ist eine Sekunde Delay schon viel zu viel :P Hätte da evtl. jemand einen Tipp oder sogar ein Tool dafür?

LG und Vielen Dank schonmal
07/11/2019 13:00 iMostLiked#2
Befinden sich alle Geräte im selben Netzwerk?
Falls ja kannst du das einfach mit (Web-)Sockets lösen.

Auf den externen Geräten bastelst du dir dann ein kleines Frontend, was die Daten abfängt und anzeigt. Hierfür könntest du Bibliotheken wie [Only registered and activated users can see links. Click Here To Register...] nutzen.

Auch kannst du dir [Only registered and activated users can see links. Click Here To Register...] anschauen. Aber letzteres ist bisschen komplizierter als ersteres. Zumindest wenn man HLS noch nie genutzt hat. Weiß jetzt nicht, wie aufwendig das sein soll.
07/11/2019 14:55 Beaschi#3
Hey :)

danke für deine Antwort, ja die Geräte befinden sich im selben Netzwerk. Habe auch schon an eine direkte Verkabelung der beiden Geräte gedacht.
07/12/2019 03:01 Omdi#4
Alternativ TeamViewer nutzen.
07/12/2019 08:31 Beaschi#5
an TeamViewer hab ich auch schon gedacht, aber da lagt das bild ...
07/12/2019 12:11 warfley#6
Du kannst mit FFMPEG den bildschirm aufnehmen, in ein netcat pipen, eventuell für sicherheit noch durch ssh portforwarding (damit benutzt du eine sichgere SSH verbindung als vpn), und auf dem zielgerät dann mit FFMPEG oder libVLC die daten lesen.

Wenn dein netwerk etwas lahm ist kannst du ganz auf beiden seiten durch ein gzip pipen.
Sollte in 4-5 bash zeilen mit den oben genannten programmen funktionieren, für windows dann entsprechend mit MSYS2 oder Cygwin (oder du lädtst dir die putty und ffmpeg execs direkt runter, dann hast du halt keine bash zum zusammenbasteln, und musst dafür dann ein python script oder sowas nehmen)

Kleines beispiel script (nicht getestet)
Record rechner:
Code:
ffmpeg -video_size 1960x1080 -framerate 25 -f x11grab -i :0.0 -f rawvideo - | nc zielRechnerIP 6574
Zielrechner:
Code:
nc -l 6574 | ffmpeg -f rawvideo -i - -f matroska -o video.mkv
Sollte den screen auf dem Aufnahmerechner aufnehmen (1080p, 25fps), über port 6574 senden (im rawvideo format, wahrscheinlich nicht die besste idee, ich weiß aber aus dem stehgreif nicht welche formate sich zum streamen eignen) und startet auf dem zielrechner einen server auf port 6574, von dem alle daten gelesen werden und mit ffmpeg nach mkv konvertiert und gespeichert werden.

Mehr infos findest du hier (ffmpeg): [Only registered and activated users can see links. Click Here To Register...]
und hier (netcat): [Only registered and activated users can see links. Click Here To Register...]

EDIT: seine eignene links lesen zu können wär ja toll... Du brauchst auf der Recorder seite nicht mal netcat, da du mit ffmpeg einfach über tcp, udp oder andere protokolle streamen kannst. Du musst also nur noch einen server auf der reciever seite aufmachen (via netcat -l)
07/13/2019 12:49 Beaschi#7
Vielen Dank für die Vorschläge! Ich schau mir das die Tage an :))
07/13/2019 18:28 warfley#8
Ich habs jetzt mal selbst ausprobiert, hab aber nur einen PC zur verfügung, daher kann ichs nicht übers netzwerk testen.
Aufnahme:
Code:
ffmpeg -video_size 1960x1080 -framerate 25 -f x11grab -i :0.0 -f flv - | nc -u 127.0.0.1 6754
Abspielen:
Code:
nc -l -u -p 6754 | vlc -
Damit wird mir wunderbar der screen aufgenommen und direkt an vlc gestreamt (-u in netcat bedeutet UDP, das ist schneller als TCP, kann aber daten verlieren, was bei einem kontinuirlichen stream aber kein problem ist)
Wenn du jetzt was mit den daten machen möchtest (z.B. in deinem eigenen programm benutzen) würde ich statt dem nc -l... einen eigenen Server schreiben, und daraus das ganze dann über die ffmpeg api (sollte es für jede relevante sprache geben) auslesen und analysieren.

Falls du dich wunderst warum VLC bei oben dem code ne sekunde oder so delay hat obwohl es aufm loopback läuft, das liegt an dem bufferverhalten von vlc. Bei deiner eigenen anwendung kannst du auf die daten natürlich zugreifen sobald sie verfügbar sind

PS: damit es funktioniert muss der server (also nc -l) zu erst gestartet werden, der stream erst danach

PPS: das ist jetzt unter Linux getestet, aber sowohl netcat als auch ffmpeg sollte es für Windows geben (auch wenn die CLI API zum aufnehmen mit ffmpeg eventuell etwas anders ist, das windows kein X11 verwendet).