VMware Virtual Webcam Support

Hallo,

wird aktuell die VMware Virtual Webcam (Media Foundation) unterstützt?

Im Client → Video werden nur die drehenden Punkte angezeigt. Die Webcam ist eine Logitech C930e, hier allerdings in einer VMware View Session mit aktiviertem Realtime A/V. Dabei wird die Webcam nicht direkt durchgereicht sondern als VMware Virtual Webcam-Gerät (am Zero Client abgeladen).

Im Debug-Log wird das Gerät korrekt angezeigt, es gibt allerdings kein Bild dazu.

[2021-05-11 13:15:49.932] [T3276] [Debug] [service.DeviceService] video device added "VMware Virtual Webcam (Media Foundation)" "5cabc19f6e2e62e99b074585f1d02f2c"
[2021-05-11 13:15:49.932] [T3276] [Debug] [service.DeviceService] video devices refreshed, currently 1 devices

Mit der Windows 10 Kamera App funktioniert die Webcam korrekt, ebenso im Chrome und Edge. Datenschutzeinstellungen erlauben den Zugriff auch für Desktop-Apps.

Am Zero Client ist die Webcam-Auflösung 1280×720 bei 15 FPS eingestellt.

Aktuell läuft der pascom Client mit “angleWarp”-Rendering, aber auch mit “Software” verhält sich in dieser Hinsicht nicht anders.

Gruß,
Rapha

Hallo @rapha,

da bin ich überfragt. Vielleicht weiß ja jemand aus dem Forum woran das liegen könnte?

Grüße Andi

Hallo @rapha,

probiere bitte mal folgende Schritte:

  1. Client beenden (sicherstellen das auch im Tray kein Icon mehr ist)
  2. Eingabeaufforderung öffnen
  3. Umgebungsvariable setzen: set GST_DEBUG=4
  4. Client starten "%LOCALAPPDATA%\pascom Client\pascom Client.exe" (Wenn keine Standard-Installation durchgeführt wurde muss der Pfad angepasst werden!)
  5. Einstellungen öffnen, zu den Videoeinstellungen navigieren
  6. Supportinfo erstellen und via PN an mich senden

Grüße,
Jan

Hier auch mal die Codec-Infos aus VLC (DirectShow) von der Webcam.

2021-05-14 10_22_51-Aktuelle Medieninformationen

Die Supportinfo ist mit exklusiven Zugriff auf die Webcam erstellt worden, also keine andere App hat zu diesem Zeitpunkt auf die Webcam zugegriffen (Man sieht es auch an der weißen LED an der Webcam, diese wird übrigens nicht aktiv wenn der pascom Client darauf zuzugreifen versucht).

Edit: Falls interessant - der Zero Client ist ein 10ZiG 6048qv mit aktueller Firmware. Der Horizon View-Agent Version 7.12, die Verbindung wird über Blast Extreme aufgebaut.

Gruß,
Rapha

Hallo @rapha,

danke für die Logs. Wie ich vermutet hatte ist es ein Bug beim aushandeln welches Farbmodell für die einzelnen Video Frames verwendet werden soll. Das passiert mit manchen Webcams, wir sind an dem Thema schon dran.

Grüße,
Jan

Hallo @rapha,

die v76 Beta enthält einen Fix für dieses Problem, magst mal testen?

Grüße,
Jan

Hallo @jlorenz,

leider noch keine sichtbare Veränderung, die drehenden Punkte drehen sich weiter und weiter :smiley:

Habe dir das SupportInfo per PN gesendet, GST_DEBUG=4, Logfile client(1).log dürfte hier interessant sein.

Gruß,
Rapha

Hallo @rapha,

danke für die Supportinfos. Wir sind an dem Problem dran.

Grüße,
Jan

Hallo @rapha,

die aktuellste Beta 76.D1835 enthält weitere Änderungen in dieser Richtung. Magst mit dieser version nochmal testen ob es jetzt läuft?

Grüße,
Jan

Hallo Jan,
leider noch immer kein Video.

[T14248] [Warning] [controller.GStreamerController] Could not establish a working video stream, giving up

Logfile kommt per PN.
Kann ich evtl. irgendwie einen Test-Stream zu Verfügung stellen?

Danke und Gruß,
Rapha

Hallo @rapha,

danke für die Logfiles. Meine Vermutungen bezüglich der Ursache für das Problem scheinen nicht zu stimmen. Ich melde mich direkt via PN für das weitere Vorgehen nachdem ich die Logfiles etwas genauer analysiert hab.

Grüße,
Jan

Alles klar,
habe zwischenzeitlich etwas mit gstreamer “probiert”. Auch direkt mit gst-launch-1.0 -v mfvideosrc kommt der

ERROR: from element /GstPipeline:pipeline0/GstMFVideoSrc:mfvideosrc0: Internal data stream error.

ksvideosrc liefert ein “Zugriff verweigert” und im Endeffekt auch den Internal data stream error.

Werde mir das nochmal mit einer anderen Workstation anschauen, vielleicht ist es wirklich nur ein fehlender Treiber.

Danke und Gruß,
Rapha

Hallo @rapha,

nice. Das erspart mir eine detaillierte Anleitung zur GStreamer Installation :slight_smile:

Probiere mal bitte diese Pipeline:

gst-launch-1.0 -v mfvideosrc ! videoconvert ! autovideosink

Wenn diese Pipeline läuft, versuche bitte diese:

gst-launch-1.0 -v mfvideosrc ! videoconvert ! videoscale ! videorate ! capsfilter caps="video/x-raw,width=480,height=640,framerate=15/1" ! autovideosink

Grüße,
Jan

Läuft leider nicht.

C:\Users>gst-launch-1.0 -v mfvideosrc ! videoconvert ! autovideosink
Setting pipeline to PAUSED …
Pipeline is live and does not need PREROLL …
Got context from element ‘autovideosink0’: gst.d3d11.device.handle=context, device=(GstD3D11Device)“(GstD3D11Device)\ d3d11device8”, adapter=(uint)0, adapter-luid=(gint64)71355, device-id=(uint)4528, vendor-id=(uint)4318, hardware=(boolean)true, description=(string)“NVIDIA\ GRID\ K240Q”;
Pipeline is PREROLLED …
Setting pipeline to PLAYING …
/GstPipeline:pipeline0/GstMFVideoSrc:mfvideosrc0.GstPad:src: caps = video/x-raw, format=(string)BGR, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src: caps = video/x-raw, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, format=(string)BGRx
/GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-raw, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, format=(string)BGRx
/GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstD3D11VideoSink:autovideosink0-actual-sink-d3d11video.GstPad:sink: caps = video/x-raw, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, format=(string)BGRx
/GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGhostPad:sink: caps = video/x-raw, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, format=(string)BGRx
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink: caps = video/x-raw, format=(string)BGR, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstMFVideoSrc:mfvideosrc0: Internal data stream error.
Additional debug info:
…/libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop (): /GstPipeline:pipeline0/GstMFVideoSrc:mfvideosrc0:
streaming stopped, reason error (-5)
Execution ended after 0:00:00.089007000
Setting pipeline to NULL …
Freeing pipeline …

Aber die videotestsrc funktioniert (~3s bis Strg+C): gst-launch-1.0 -v videotestsrc ! videoconvert ! autovideosink:

Setting pipeline to PAUSED …
Pipeline is PREROLLING …
Got context from element ‘autovideosink0’: gst.d3d11.device.handle=context, device=(GstD3D11Device)“(GstD3D11Device)\ d3d11device5”, adapter=(uint)0, adapter-luid=(gint64)71355, device-id=(uint)4528, vendor-id=(uint)4318, hardware=(boolean)true, description=(string)“NVIDIA\ GRID\ K240Q”;
/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0.GstPad:src: caps = video/x-raw, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, format=(string)RGB10A2_LE, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:src: caps = video/x-raw, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, format=(string)RGB10A2_LE, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-raw, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, format=(string)RGB10A2_LE, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstD3D11VideoSink:autovideosink0-actual-sink-d3d11video.GstPad:sink: caps = video/x-raw, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, format=(string)RGB10A2_LE, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0.GstGhostPad:sink: caps = video/x-raw, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, format=(string)RGB10A2_LE, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstVideoConvert:videoconvert0.GstPad:sink: caps = video/x-raw, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, format=(string)RGB10A2_LE, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
Pipeline is PREROLLED …
Setting pipeline to PLAYING …
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstD3D11VideoSink:autovideosink0-actual-sink-d3d11video: Output window was closed
Additional debug info:
…/sys/d3d11/gstd3d11videosink.cpp(1195): gst_d3d11_video_sink_show_frame (): /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstD3D11VideoSink:autovideosink0-actual-sink-d3d11video
ERROR: from element /GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0: Internal data stream error.
Execution ended after 0:00:02.920244000
Additional debug info:
…/libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop (): /GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0:
streaming stopped, reason error (-5)
Setting pipeline to NULL …
Freeing pipeline …

Hallo @rapha,

als letzten Notnagel kannst du noch das hier versuchen:

gst-launch-1.0 -v ksvideosrc ! videoconvert ! autovideosink

Wenn das auch nicht geht, ist es denke ich eher ein Treiberproblem oder einfach Inkompatibel.

Ich habe keine direkte Erfarung, aber eine Google suche nach “vmware virtual webcam mediafoundation” führt mich zu diesem Dokument: https://docs.vmware.com/de/VMware-Horizon-7/7.11/horizon-remote-desktop-features.pdf

Da gibt es u. a. Einstellungen wie “Force MMR to use software overlay” und “Enable multi-media acceleration”. Vielleicht bringt dich ja das prüfen bzw. Anpassen eines solchen Settings weiter?

Grüße,
Jan

Hallo Jan,

das Dokument ist mir bekannt bzw. die Einstellungen.
Habe mittlerweile alle möglichen Kombinationen getestet, auch auf einer anderen Workstation (mit dem selben Thin-Client).

Auch damit wird mit gstreamer keine Ausgabe angezeigt, derselbe Fehler.

Es funktioniert so wie es soll wenn die Webcam an Windows durchgereicht wird (redirection), also kein Abladen erfolgt. Dieser Modus ist aber von VMware nicht empfohlen und führte (auch mit Audio) zu Performanceproblemen bzw. “Rucklern” und “Aussetzern”. Bei Video vielleicht nicht undebingt so interessant, bei Audio merkt man es aber schon deutlich.

Werde nochmal mit “auto device splitting” am Thin-Client experimentieren und berichten.

Gruß,
Rapha

Vielleicht auch interessant:

mfvideosrc mit der Webcam per redirect:

/GstPipeline:pipeline0/GstMFVideoSrc:mfvideosrc0.GstPad:src: caps = video/x-raw, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, format=(string)NV12, colorimetry=(string)1:4:0:1

Stelle mal die Auflösung für die VMware Virtual Webcam auf FHD, den Codec kann ich dort nicht einstellen, sieht dann so aus:

/GstPipeline:pipeline0/GstMFVideoSrc:mfvideosrc0.GstPad:src: caps = video/x-raw, format=(string)BGR, width=(int)1920, height=(int)1072, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1

Obwohl 1920x1080 eingestellt ist kommen angeblich nur 1920x1072 in Windows an.

Offensichtlich ist die VMware Virtual Webcam aktuell nicht von gstreamer unterstützt. Dann bleibt es erstmal bei Redirection :slight_smile:

Trotzdem Vielen Dank und Gruß,
Rapha