Ir al contenido

Streaming

La consola de Hyper-V solo muestra la pantalla básica de Hyper-V, no lo que dibuja la GPU. Para ver la VM con la GPU, GpuVM instala un servidor de streaming dentro de la VM y la abre con un cliente en el host.

Componente Dónde Función Versión fijada
Sunshine VM Captura la pantalla virtual y codifica con NVENC. v2026.914.233613
Virtual Display Driver VM Un monitor que dibuja la GPU. 25.7.23
nefcon VM Instalador de drivers por línea de comandos; crea el dispositivo de la pantalla virtual. v1.14.0
usbip-win2 VM Conecta el altavoz USB de GpuVM, que captura Sunshine. 0.9.8.0
Moonlight Host Muestra la VM. Se instala aparte

Los instaladores se descargan en el host al crear la VM, se verifican con el SHA-256 fijado en streaming/components.json y se copian al disco de la VM. El invitado no descarga nada. Se guardan en una carpeta cache (dentro de %ProgramData%\GpuVM con la app instalada).

nefcon está fijado en v1.14.0, la versión que usa el script oficial de instalación del VDD, aunque ya existe la v1.21.0.

Sunshine corre dentro de la VM. Su usuario y contraseña se generan al crear la VM; en el host quedan cifrados con DPAPI. La contraseña viaja en texto plano al invitado solo para la instalación y después se borra.

Cada vez que haces Encender y abrir, GpuVM lee la lista de pantallas de Sunshine por su API, pone output_name en la pantalla virtual y reinicia Sunshine si eso cambió, para que nunca capture por error la pantalla de Hyper-V. Si GpuVM ya apagó la pantalla de Hyper-V, además pone dd_configuration_option en disabled: si Sunshine cambia la pantalla en cada sesión, vuelve a probar todos sus codificadores y el primer cuadro tarda 22 a 27 s en vez de unos 2 s (laboratorio 008). Cambiar la resolución o los FPS todavía cuesta 10 a 15 s, porque Sunshine ve que la pantalla cambió. Si no, usa ensure_only_display.

Sunshine puede capturar la pantalla virtual de dos formas, que se eligen por VM en Opciones → Captura o con Set-GpuVMCapture -Name <vm> -Mode ddx|wgc:

Modo En la app Cómo corre Sunshine Muestra No muestra
ddx (desktop duplication) Estándar (la predeterminada) Como servicio de Windows (SYSTEM). Todo, incluidos los avisos de administrador de Windows. Programas en pantalla completa exclusiva: negro.
wgc (Windows.Graphics.Capture) Pantalla completa exclusiva En la sesión del usuario que inició sesión, con una tarea al iniciar sesión (conhost --headless, sin ventana de consola); el servicio queda en manual. Programas en pantalla completa exclusiva, a cualquier resolución. Los avisos de administrador (se dibujan en el escritorio seguro).

Con ddx, desktop duplication no recibe cuadros nuevos de la pantalla virtual mientras un programa está en pantalla completa exclusiva, así que el stream queda en negro; el programa solo se ve cuando pierde el foco (laboratorio 009). El modo se aplica en el momento si la VM está encendida y se revisa en cada Encender y abrir; si ya está así, Sunshine no se reinicia. Aplicarlo necesita la contraseña del invitado.

El Virtual Display Driver agrega un monitor que dibuja la GPU. Se instala con nefcon y solo se confía en el certificado que firmó el driver.

  • Después del primer inicio la VM se reinicia una vez sola para dejar la pantalla virtual como única pantalla.
  • Si la pantalla virtual funciona, se desactiva la pantalla de Hyper-V para que Windows y Sunshine usen la virtual (disableHyperVVideo en el perfil).
  • En cada Encender y abrir, con la contraseña del invitado guardada, la pantalla virtual queda como la única y principal de la VM. Las VMs con GPU-P reciben una salida oculta extra de 1024×768 de la GPU compartida; si quedara como principal, las ventanas nuevas (Steam, instaladores) se abrirían donde el stream no las muestra. Si ya está así, no se toca nada, para que Sunshine no vuelva a probar sus codificadores.
  • Si algo falla, la VM sigue accesible por Escritorio remoto.

Moonlight en el host muestra la VM. El emparejamiento es automático: Moonlight genera el PIN y GpuVM se lo entrega a Sunshine por su API. El cliente emparejado lleva el nombre de este equipo.

  • Para volver a emparejar: Volver a emparejar Moonlight en el menú de la app, o ./gpuvm.ps1 connect -Name <vm> -Pair.
  • La resolución y los FPS se eligen en las Opciones de la app, o en cada conexión:
Ventana de terminal
./gpuvm.ps1 connect -Name win11 -Resolution 2560x1440 -Fps 120 -BitrateKbps 40000 -Codec HEVC

Codecs: auto, H.264, HEVC, AV1. Por defecto Moonlight abre la app Desktop de Sunshine.

Las VMs de generación 2 de Hyper-V no tienen tarjeta de sonido. GpuVM le da a la VM su propio altavoz USB: un pequeño servidor dentro de la VM (GpuVMAudio.exe) se presenta como un dispositivo de audio USB (48 kHz, estéreo), usbip-win2 lo conecta y Windows lo maneja con su propio driver de audio USB, como si fuera hardware real. Aparece como Altavoces (GpuVM Audio) y Sunshine lo captura (virtual_sink).

  • Nada sale de la VM: el servidor solo escucha en 127.0.0.1, corre como LOCAL SERVICE y su programa vive en C:\Program Files\GpuVM\Audio, donde solo los administradores pueden escribir.
  • usbip-win2 instala solo su cliente, en silencio. Sus drivers están firmados por Microsoft: sin modo de prueba ni certificados propios. GpuVM comprueba ambas cosas y lo desinstala si alguna falla.
  • El altavoz es persistente: usbip-win2 lo vuelve a conectar cada vez que Windows arranca, sin reinicios ni inicio de sesión. Encender y abrir lo revisa cada vez, lo reconecta si se perdió y actualiza el servidor cuando GpuVM trae uno nuevo.
  • Las VMs creadas con VB-CABLE pasan al altavoz la próxima vez que se abren. Dentro de una VM, la salida de VB-CABLE le llega muda a Sunshine; el sonido de antes venía de Steam Streaming Speakers (laboratorios 011 y 012).

La sección streaming del perfil define los valores por defecto:

"streaming": {
"provider": "sunshine", // o "none" para crear la VM sin streaming
"virtualDisplay": true,
"disableHyperVVideo": true,
"audio": "usb", // o "none" para no instalar audio
"sunshine": { }, // claves extra para sunshine.conf
"client": { "app": "Desktop", "resolution": "1920x1080", "fps": 60, "bitrateKbps": 0, "codec": "auto" }
}

client también acepta vsync, framePacing, performanceOverlay (true/false) y displayMode (fullscreen, windowed, borderless). Solo se le pasan a Moonlight si el perfil los define. captureSystemKeys (never, fullscreen, always; fullscreen si no se define) decide cuándo Alt+F4, Alt+Tab y la tecla Windows van a la VM; Ctrl+Alt+Shift+Q siempre sale del stream.

Moonlight se abre como el usuario que inició sesión, sin permisos de administrador, aunque GpuVM corra elevada: habla con un servidor que controla la VM.

Ventana de terminal
./gpuvm.ps1 components-update -WhatIf # ver si hay versiones nuevas

Busca la última versión publicada en GitHub de cada componente y actualiza versión, URL y SHA-256 en streaming/components.json. usbip-win2 se mantiene en 0.9.8.0 (hold en el archivo) hasta que un laboratorio pruebe una versión nueva. Una versión nueva no está probada: valídala en un laboratorio antes de crear VMs con ella. La app no puede ejecutar este comando.