Integración de Transmisión Network Device Interface (NDI)¶
Video Capture SDK .Net Media Blocks SDK .Net
¿Qué es NDI?¶
Network Device Interface (NDI) es un estándar de la industria para producción de video en vivo sobre redes IP. Permite transmisión de video y audio de alta calidad y baja latencia sobre Ethernet convencional, reemplazando costoso cableado SDI con flujos de trabajo basados en software. Los casos de uso comunes incluyen:
- Transmisión y streaming en vivo
- Videoconferencia profesional
- Configuraciones de producción multi-cámara
- Flujos de trabajo de producción remota
- Aplicaciones de servidor de playout
El SDK de VisioForge proporciona soporte de salida NDI para flujos de trabajo de escritorio y servidor, permitiéndole transmitir cámaras, dispositivos de captura o archivos multimedia a receptores NDI en su red.
Requisitos de Instalación¶
Para usar transmisión NDI, instale uno de los siguientes paquetes oficiales de NDI:
Estos proporcionan los componentes de runtime que habilitan la comunicación NDI. Puede verificar la disponibilidad de NDI en código:
bool ndiAvailable = NDISinkBlock.IsAvailable();
Salida NDI Multiplataforma¶
VideoCaptureCoreX VideoEditCoreX MediaBlocksPipeline
Clase NDIOutput¶
La clase NDIOutput proporciona salida NDI para los motores VideoCaptureCoreX y VideoEditCoreX:
public class NDIOutput : IVideoEditXBaseOutput, IVideoCaptureXBaseOutput, IOutputVideoProcessor, IOutputAudioProcessor
Configuración¶
| Propiedad | Tipo | Descripción |
|---|---|---|
Sink | NDISinkSettings | Configuración de salida NDI (nombre del flujo, compresión, configuraciones de red) |
CustomVideoProcessor | MediaBlock | Procesamiento de video personalizado opcional antes de la transmisión NDI |
CustomAudioProcessor | MediaBlock | Procesamiento de audio personalizado opcional antes de la transmisión NDI |
Constructores¶
// Crear con nombre de flujo
var output = new NDIOutput("My Stream");
// Crear con configuraciones pre-configuradas
var output = new NDIOutput(new NDISinkSettings("My Stream"));
Ejemplos de Implementación¶
Media Blocks SDK¶
// Crear un bloque de salida NDI con un nombre de flujo descriptivo
var ndiSink = new NDISinkBlock("VisioForge Production Stream");
// Conectar fuente de video a la salida NDI
pipeline.Connect(videoSource.Output, ndiSink.CreateNewInput(MediaBlockPadMediaType.Video));
// Conectar fuente de audio a la salida NDI
pipeline.Connect(audioSource.Output, ndiSink.CreateNewInput(MediaBlockPadMediaType.Audio));
Video Capture SDK¶
// Inicializar salida NDI con un nombre de flujo amigable para red
var ndiOutput = new NDIOutput("VisioForge_Studio_Output");
// Agregar la salida NDI configurada al pipeline de captura de video
core.Outputs_Add(ndiOutput); // core representa la instancia VideoCaptureCoreX
Transmisión de Cámara a NDI¶
El caso de uso más común es transmitir una webcam local y micrófono a NDI. Este ejemplo usa el Media Blocks SDK para capturar desde dispositivos del sistema y enviar a NDI con el remuestreo de audio adecuado.
Arquitectura del Pipeline¶
SystemVideoSourceBlock → NDISinkBlock (entrada de video)
SystemAudioSourceBlock → AudioResamplerBlock (48kHz, F32LE, estéreo) → NDISinkBlock (entrada de audio)
Ejemplo de Código¶
using VisioForge.Core;
using VisioForge.Core.MediaBlocks;
using VisioForge.Core.MediaBlocks.Sources;
using VisioForge.Core.MediaBlocks.AudioProcessing;
using VisioForge.Core.MediaBlocks.Sinks;
using VisioForge.Core.Types.X.Sources;
using VisioForge.Core.Types.X.AudioEncoders;
// Inicializar SDK una vez al inicio
await VisioForgeX.InitSDKAsync();
var pipeline = new MediaBlocksPipeline();
// Enumerar dispositivos disponibles
var videoDevices = await DeviceEnumerator.Shared.VideoSourcesAsync();
var audioDevices = await DeviceEnumerator.Shared.AudioSourcesAsync();
// Configurar fuente de video (primera cámara disponible)
var videoSettings = new VideoCaptureDeviceSourceSettings(videoDevices[0]);
var videoSource = new SystemVideoSourceBlock(videoSettings);
// Configurar fuente de audio (primer micrófono disponible)
var audioSettings = new AudioCaptureDeviceSourceSettings(audioDevices[0]);
var audioSource = new SystemAudioSourceBlock(audioSettings);
// Crear salida NDI
var ndiSink = new NDISinkBlock("My Camera Stream");
// Conectar video directamente a NDI
pipeline.Connect(videoSource.Output, ndiSink.CreateNewInput(MediaBlockPadMediaType.Video));
// Remuestrear audio a 48kHz F32LE estéreo (requerido por NDI)
var audioResampler = new AudioResamplerBlock(
new AudioResamplerSettings(AudioFormatX.F32LE, 48000, 2));
pipeline.Connect(audioSource.Output, audioResampler.Input);
pipeline.Connect(audioResampler.Output, ndiSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Implementación NDI Específica de Windows¶
VideoCaptureCore VideoEditCore
Para implementaciones específicas de Windows, el SDK proporciona opciones de configuración adicionales a través de los componentes VideoCaptureCore o VideoEditCore.
Guía de Implementación Paso a Paso¶
1. Habilitar Transmisión de Red¶
VideoCapture1.Network_Streaming_Enabled = true;
2. Configurar Transmisión de Audio¶
VideoCapture1.Network_Streaming_Audio_Enabled = true;
3. Seleccionar Protocolo NDI¶
VideoCapture1.Network_Streaming_Format = NetworkStreamingFormat.NDI;
4. Crear y Configurar Salida NDI¶
var streamName = "VisioForge NDI Streamer";
var ndiOutput = new NDIOutput(streamName);
5. Asignar la Salida¶
VideoCapture1.Network_Streaming_Output = ndiOutput;
6. Generar la URL NDI (Opcional)¶
string ndiUrl = $"ndi://{System.Net.Dns.GetHostName()}/{streamName}";
Debug.WriteLine(ndiUrl);
Reproducción de Archivos a Salida NDI¶
El Media Blocks SDK puede transmitir archivos multimedia locales (MP4, MKV, AVI, etc.) directamente a NDI sin ninguna renderización local — ideal para aplicaciones de servidor de playout.
Pipeline Recomendado¶
UniversalSourceBlock (archivo)
VideoOutput → NDISinkBlock (entrada de video)
AudioOutput → AudioResamplerBlock (48kHz, F32LE, estéreo) → NDISinkBlock (entrada de audio)
Ejemplo de Código¶
var pipeline = new MediaBlocksPipeline();
// Fuente de archivo con detección automática de formato
var fileSource = new UniversalSourceBlock(
await UniversalSourceSettings.CreateAsync(new Uri("file:///path/to/video.mp4")));
// Salida NDI
var ndiSink = new NDISinkBlock("My NDI Stream");
// Conectar video directamente a NDI
pipeline.Connect(fileSource.VideoOutput,
ndiSink.CreateNewInput(MediaBlockPadMediaType.Video));
// Remuestrear audio a 48kHz F32LE estéreo para compatibilidad NDI
var audioResampler = new AudioResamplerBlock(
new AudioResamplerSettings(AudioFormatX.F32LE, 48000, 2));
pipeline.Connect(fileSource.AudioOutput, audioResampler.Input);
pipeline.Connect(audioResampler.Output,
ndiSink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Opcional: habilitar reproducción en bucle
pipeline.Loop = true;
await pipeline.StartAsync();
Requisitos de Formato de Audio¶
NDI requiere audio 48kHz, punto flotante de 32 bits (F32LE), entrelazado. Cuando transmita desde fuentes que puedan contener audio a otras frecuencias de muestreo (por ejemplo, AAC a 44.1kHz en archivos MP4, o frecuencias variables de micrófono), siempre incluya un AudioResamplerBlock para convertir a 48kHz. Sin remuestreo, el audio puede tartamudear, tener fallos o perder sincronización con el video.
var audioResampler = new AudioResamplerBlock(
new AudioResamplerSettings(AudioFormatX.F32LE, 48000, 2));
Recepción de Fuentes NDI¶
Esta guía se centra en enviar video y audio a NDI. Para descubrir, conectar, previsualizar o capturar fuentes NDI, incluidas aplicaciones Android y MAUI de reproducción NDI, consulte la Referencia de Fuentes de Video NDI.
Solución de Problemas¶
Tartamudeo o Fallos de Audio en Salida NDI¶
Síntoma: El audio no es fluido al transmitir desde archivos — tartamudea, tiene fallos o problemas de sincronización labial.
Causa: El archivo fuente contiene audio a una frecuencia de muestreo diferente de 48kHz (por ejemplo, AAC a 44.1kHz en archivos MP4). NDI espera audio a 48kHz.
Solución: Inserte un AudioResamplerBlock configurado para 48kHz F32LE estéreo entre la fuente de archivo y el sumidero NDI, como se muestra en el ejemplo de reproducción de archivos anterior.
Preguntas Frecuentes¶
¿Cómo transmito video desde una cámara a NDI en C#?¶
Use el Media Blocks SDK para crear un pipeline con SystemVideoSourceBlock para la cámara, SystemAudioSourceBlock para el micrófono y NDISinkBlock como salida. Conecte el audio a través de un AudioResamplerBlock configurado a 48kHz F32LE estéreo, que NDI requiere. Consulte la sección Transmisión de Cámara a NDI para el código completo.
¿Qué formato de audio requiere NDI?¶
NDI requiere audio de 48kHz, punto flotante de 32 bits (F32LE), estéreo entrelazado. Siempre incluya un AudioResamplerBlock(new AudioResamplerSettings(AudioFormatX.F32LE, 48000, 2)) en su pipeline entre la fuente de audio y el sumidero NDI. Sin el remuestreo adecuado, puede experimentar tartamudeo de audio, fallos o problemas de sincronización A/V.
¿Puedo transmitir un archivo de video a NDI para playout?¶
Sí. Use UniversalSourceBlock para leer el archivo, conecte el video directamente a NDISinkBlock y dirija el audio a través de AudioResamplerBlock para la conversión a 48kHz. Habilite pipeline.Loop = true para playout continuo. Este patrón es ideal para servidores de playout de transmisión con cero sobrecarga de renderización local.
¿Cuáles son los requisitos del sistema para transmisión NDI en .NET?¶
Necesita el NDI SDK o NDI Tools instalado para soporte NDI en tiempo de ejecución. El SDK de VisioForge soporta Windows, macOS y Linux. Verifique la disponibilidad de NDI en tiempo de ejecución con NDISinkBlock.IsAvailable(). Los requisitos de ancho de banda de red dependen de la resolución y la tasa de fotogramas — un flujo NDI HD típico usa aproximadamente 100-150 Mbps.
¿Cómo verifico si NDI está disponible en el sistema?¶
Llame a NDISinkBlock.IsAvailable() antes de crear componentes del pipeline NDI. Este método estático verifica si las bibliotecas de runtime NDI están instaladas y accesibles. Si devuelve false, solicite al usuario que instale el paquete NDI SDK o NDI Tools.
Ver También¶
- Referencia de Fuentes de Video NDI — recibir y capturar fuentes NDI en .NET
- Visor de Streams RTSP y Reproductor de Cámaras IP — guía similar de streaming IP para cámaras RTSP
- Guía de Despliegue — paquetes de runtime específicos de plataforma para Windows, macOS, Linux
- Ejemplos de Código en GitHub — demos de transmisor y fuente NDI
- Media Blocks SDK .Net — página del producto y descargas