Sonntag, 4. November 2018

YouNow -wenn Streaming zur CPU Herausforderung wird

Problem:
Younow zieht sich beim Streamen bis zu 60% der CPU Leistung, ohne ersichtlichen Grund.
Der Versuch einen Gamingstream zu erstellen, scheitert dabei an der Restleistung für das Spiel.

Lösungsansatz:
Der Stream nach Younow wird über einen anderen PC erstellt, als das Spiel verwendet.
Seit dem November 2018 funktioniert Younow auch unter Linux / Mint (Flashversion).
Bild und Ton werden wie gewohnt mit OBS auf dem Windows PC erzeugt und per "Custom Recording" in das lokale Netz gespeist (bsp: udp://224.0.0.1:9999).
Wichtig: Auch das AUDIO Signal muss übertragen werden.

Auf dem Linux Rechner wird mit v4l-videoloop eine virtuelle Kamera erzeugt. Siehe dazu auch "Virtual WebCam for Skype"
Für den Stream wird zusätzlich ein virtuelles Audio Device benötigt.
Dieses mit mit dem Befehl:
"sudo modprobe snd-aloop"
erzeugt.
Mit
"cat /proc/asound/cards"
wird die Device ID der virtuellen Soundkarte gelesen.
Output:
"...
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xd4720000 irq 35
 1 [Loopback       ]: Loopback - Loopback
                      Loopback 1
..."

Per VLC kann der Stream getestet werden.
Quelle: "udp://@:9999"

Um per v4l dden Video und den Audio Stream entsprechend zuzuordnen, wird die Option "map" im ffmpeg Befehl verwendet.
Mit
"ffprobe udp://@:9999"
kann man die Kanäle für Video und Audio angezeigen lassen.
Output:
"....
    Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt470bg), 1024x818 [SAR 1:1 DAR 512:409], max. 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x101]: Audio: mp2 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, s16p, 160 kb/s
..."


Nun werden die beiden Kanäle den Devices zugeordnet:
Video: "-map 0:0 -f v4l2 /dev/video0"
Audio: "-map 0:1 -f alsa hw:1,1"
Anmerkung:
Bitte im unten verlinkten Artikel die Bedeutung der Parameter "hw" bezüglich des zweiten Wertes nach dem Komma erlesen.

Der komplette Befehl sieht dann so aus:
"ffmpeg -i udp://@:9999 -acodec copy -vcodec rawvideo -vf format=pix_fmts=yuv420p -map 0:0 -f v4l2 /dev/video0 -map 0:1 -f alsa hw:1,1"

--> Anmerkung:
--> die "threads" Option fällt in diesem Fall weg (Siehe Skype).
--> Eventuell läuft der Befehl beim ersten Start in einen Fehler. Einfach ein zweites Mal starten und etwas warten.
--> Die Gerätespezifischen Befehle müssem alle im "root" modus ausgeführt werden. Der Stream wird unter dem normalen Benutzer gestartet.


Ergebnis:
Zwar gibt es durch das zusätzliche Routing über einen zweiten Rechner eine minimale zusätzliche Verzögerung, diese beeinflusst den output jedoch nur minimal.
Einstellungen in OBS bezüglich Auflösung und FrameRate sollten individuell gefunden werden.

UPDATE:
Folgendes Script überprüft auf die Device ID für den V4L2 Audio und Video Kanal:

##Laden des Soundloopback
sudo modprobe snd-aloop

##Laden des v4l-Loopback
sudo modprobe v4l2loopback exclusive_caps=1

##prüfen auf das richtige /dev/videoX
VIDEOOUT=$(v4l2-ctl --list-devices|grep -A 1 -i "v4l2loopback"|grep -i "/dev/video"|awk '{print $1}')

##Prüfen auf das richtige Sound-device
SOUNDOUT=$(cat /proc/asound/cards|grep -i "loopback -"|awk '{print $1}')

##Starten des Streams mit den oben erfassten Zielen
ffmpeg -i udp://@:9999 -acodec copy -vcodec rawvideo -vf format=pix_fmts=yuv420p -map 0:0 -f v4l2 $VIDEOOUT -map 0:1 -f alsa hw:$SOUNDOUT,1


--------------------------
Based on
https://getkey.eu/blog/55106b9f/a-virtual-webcam


Freitag, 7. September 2018

Skype for Linux und die WebCam

Das ist jetzt mal Quick and Dirty und wird noch aufgearbeitet.
======================================================

Ausgangslage:
zum aktuellen Zeitpunkt funktionieren verschieden auch recht neue Kameramodelle nicht mehr mit Skype4Linux.
Ein Workaround mit v4l und einem prelaunch des Konverters schlägt in neueren Linux Versionen scheinbar auch bei vielen fehl.
Mein Ansatz kommt aus der Windows Welt, wo ich mit einer virtuellen Kamera Richtung YouNow aus OBS streame. Leider funktioniert das Plugin nicht unter Linux, aber es gibt einen ähnlichen Weg.
Hier mal ganz RAW meine Lösung.
=============================================================
================= V4L Loopback adapter ======================
=============================================================
Datum: 2018-09-07
Sourcen:
https://www.youtube.com/watch?v=6AZRiW3hHrw
https://github.com/umlaeute/v4l2loopback
https://obsproject.com/forum/resources/obs-studio-send-an-udp-stream-to-a-second-pc-using-obs.455/

Hiermit wird eine virtuelle Kamera erzeugt.

1. Einmalige Installation
a. V4L2Loopback GIT Repository clonen
b. als admin "make" und "make install", eventuell einen "depmod -a" hinterher
c. Laden des Moduls: "modprobe v4l2loopback exclusive_caps=1"
d. Kontrollieren, ob der Treiber geladen wurde: v4l2-ctl --list-devices

2. Betrieb:
a. WebCam einstöpseln und mit GUVC View die echte Kamera richtig einstellen. -> GUVC wieder schließen
b. OBS starten und Output konfigurieren
c. In OBS eine Scene mit der echten Kamera als Input erstellen.
d. "Start recording"
e. Nun kann per ffmpeg ein stream generiert werden.
ffmpeg -i udp://224.0.0.2:8888 -acodec copy -vcodec rawvideo -threads 0 -vf format=pix_fmts=yuv420p -s 640x480  -f v4l2 /dev/video0
--> Änderungen sind speziell für Skype wichtig. Auch im OBS sollte mindestens der Rescale auf 640x480 gesetzt werden.
Es kann sein, daß 2 mal gestartet werden muss, weil der Stream nicht sofort gefunden wird.
f. Skype starten
In den "Video und Audio Settings" sollte nun das Bild der virtuellen Kamera gezeigt werden.
Natürlich kann nun auch mit Scenen in OBS gearbeitet werden.
============================================================

Anmerkungen:
Ich habe ein wenig mit der ersten Installation gekämpft und auch den v4l2loopback-dkms installiert, aber ob das oder der "depmod -a" die Lösung war, kann ich so auch nicht sicher sagen.

Hope it helps.