Sinks¶
Los sinks son bloques que guardan o transmiten datos. Son los últimos bloques en el pipeline. Opcionalmente, algunos sinks pueden tener pines de salida para pasar datos al siguiente bloque en el pipeline.
El SDK proporciona muchos sinks diferentes para diferentes propósitos.
Sinks de archivo
Los siguientes sinks de archivo están disponibles:
Transmisión en red
Los siguientes sinks de transmisión en red están disponibles:
- DASH
- Facebook Live
- HLS
- MJPEG sobre HTTP
- NDI
- SRT
- SRT MPEG-TS
- RTMP
- Shoutcast
- WHIP
- YouTube Live
- RIST MPEG-TS
Sinks de utilidad
Los siguientes sinks de utilidad están disponibles:
- Sink de Stream
- Sink de Descriptor de Archivo
- Sink de Archivo KLV
- Sink de Búfer
- Sink de Cámara Virtual
Sinks de Archivo¶
ASF¶
ASF (Advanced Systems Format): Un formato contenedor digital de Microsoft usado para almacenar datos multimedia, diseñado para ser independiente de la plataforma y soportar tipos de medios escalables como audio y video.
Use la clase ASFSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: ASFSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/x-wma | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| video/x-wmv | ||
| video/x-jpc | ||
| video/x-vp8 | ||
| image/png |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->WMVEncoderBlock;
UniversalSourceBlock-->WMAEncoderBlock;
WMVEncoderBlock-->ASFSinkBlock;
WMAEncoderBlock-->ASFSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Bloque codificador de audio
var audioEncoderBlock = new WMAEncoderBlock(new WMAEncoderSettings());
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Bloque codificador de video
var videoEncoderBlock = new WMVEncoderBlock(new WMVEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Bloque sink para archivo ASF
var sinkBlock = new ASFSinkBlock(new ASFSinkSettings(@"output.wmv"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
AVI¶
AVI (Audio Video Interleave) es un formato contenedor multimedia introducido por Microsoft. Permite la reproducción simultánea de audio con video alternando segmentos de datos de audio y video.
Use la clase AVISinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: AVISinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| image/png |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->MP3EncoderBlock;
UniversalSourceBlock-->DIVXEncoderBlock;
MP3EncoderBlock-->AVISinkBlock;
DIVXEncoderBlock-->AVISinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Configurar codificador de audio MP3
var audioEncoderBlock = new MP3EncoderBlock(new MP3EncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Configurar codificador de video DIVX
var videoEncoderBlock = new DIVXEncoderBlock(new DIVXEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Crear sink AVI y conectar las entradas
var sinkBlock = new AVISinkBlock(new AVISinkSettings(@"output.avi"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Archivo RAW¶
Salida universal a un archivo. Este sink se usa dentro de todos los otros sinks de nivel superior, ej. MP4Sink. Puede usarse para escribir video o audio RAW a un archivo.
Información del bloque¶
Nombre: FileSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada | Cualquier formato de flujo | 1 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->MP3EncoderBlock;
MP3EncoderBlock-->AVISinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp3";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificar audio a MP3
var mp3EncoderBlock = new MP3EncoderBlock(new MP3EncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, mp3EncoderBlock.Input);
// Guardar a archivo
var fileSinkBlock = new FileSinkBlock(@"output.mp3");
pipeline.Connect(mp3EncoderBlock.Output, fileSinkBlock.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MKV¶
MKV (Matroska) es un formato contenedor de estándar abierto y gratuito, similar a MP4 y AVI pero con más flexibilidad y características avanzadas.
Use la clase MKVSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: MKVSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/x-wma | ||
| audio/x-vorbis | ||
| audio/x-opus | ||
| audio/x-flac | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| video/x-wmv | ||
| video/x-jpc | ||
| video/x-vp8 | ||
| video/x-vp9 | ||
| video/x-theora | ||
| image/png |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->VorbisEncoderBlock;
UniversalSourceBlock-->VP9EncoderBlock;
VorbisEncoderBlock-->MKVSinkBlock;
VP9EncoderBlock-->MKVSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio Vorbis
var audioEncoderBlock = new VorbisEncoderBlock(new VorbisEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video VP9
var videoEncoderBlock = new VP9EncoderBlock(new VP9EncoderSettings() { Bitrate = 2000 });
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink MKV
var sinkBlock = new MKVSinkBlock(new MKVSinkSettings(@"output.mkv"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MOV¶
MOV (QuickTime File Format) es un formato contenedor multimedia desarrollado por Apple para almacenar video, audio y otros medios basados en tiempo. Soporta varios códecs y es ampliamente usado para contenido multimedia en plataformas Apple, y también en edición de video profesional.
Use la clase MOVSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: MOVSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| image/png |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->MOVSinkBlock;
H264EncoderBlock-->MOVSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio AAC
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video H.264
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink MOV
var sinkBlock = new MOVSinkBlock(new MOVSinkSettings(@"output.mov"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MP4¶
MP4 (MPEG-4 Parte 14) es un formato contenedor multimedia digital usado para almacenar video, audio y otros datos como subtítulos e imágenes. Es ampliamente usado para compartir contenido de video en línea y es compatible con una amplia gama de dispositivos y plataformas.
Use la clase MP4SinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: MP4SinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| image/png |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->MP4SinkBlock;
H264EncoderBlock-->MP4SinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio AAC
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video H.264
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink MP4
var sinkBlock = new MP4SinkBlock(new MP4SinkSettings(@"output.mp4"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MPEG-PS¶
MPEG-PS (MPEG Program Stream) es un formato contenedor para multiplexar audio, video y otros datos digitales. Está diseñado para medios razonablemente confiables, como DVDs, CD-ROMs y otros medios de disco.
Construya con new MPEGPSSinkBlock(string filename) — el bloque solo expone un constructor con nombre de archivo; no existe una clase de configuración separada.
Información del bloque¶
Nombre: MPEGPSSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->MP2EncoderBlock;
UniversalSourceBlock-->MPEG2EncoderBlock;
MP2EncoderBlock-->MPEGPSSinkBlock;
MPEG2EncoderBlock-->MPEGPSSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio MP2
var audioEncoderBlock = new MP2EncoderBlock(new MP2EncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video MPEG-2
var videoEncoderBlock = new MPEG2EncoderBlock(new MPEG2VideoEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink MPEG-PS
var sinkBlock = new MPEGPSSinkBlock(@"output.mpg");
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MPEG-TS¶
MPEG-TS (MPEG Transport Stream) es un formato contenedor digital estándar para transmisión y almacenamiento de audio, video y datos del Protocolo de Información de Programa y Sistema (PSIP). Se usa en sistemas de transmisión como DVB, ATSC e IPTV.
Use la clase MPEGTSSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: MPEGTSSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->MPEGTSSinkBlock;
H264EncoderBlock-->MPEGTSSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio AAC
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video H.264
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink MPEG-TS
var sinkBlock = new MPEGTSSinkBlock(new MPEGTSSinkSettings(@"output.ts"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MXF¶
MXF (Material Exchange Format) es un formato contenedor para video y audio digital profesional, desarrollado para abordar problemas como intercambio de archivos, interoperabilidad y para mejorar el flujo de trabajo entre casas de producción y proveedores de contenido/equipos.
Use la clase MXFSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: MXFSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| image/png |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->PCMEncoderBlock;
UniversalSourceBlock-->DIVXEncoderBlock;
PCMEncoderBlock-->MXFSinkBlock;
DIVXEncoderBlock-->MXFSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Bloque de audio PCM
var audioBlock = new PCMEncoderBlock(new PCMEncoderSettings());
pipeline.Connect(fileSource.AudioOutput, audioBlock.Input);
// Codificador de video DIVX
var videoEncoderBlock = new DIVXEncoderBlock(new DIVXEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink MXF
var sinkBlock = new MXFSinkBlock(new MXFSinkSettings(@"output.mxf"));
pipeline.Connect(audioBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
OGG¶
OGG es un formato contenedor gratuito y abierto diseñado para transmisión eficiente y manipulación de multimedia digital de alta calidad. Es desarrollado por la Fundación Xiph.Org y soporta códecs de audio como Vorbis, Opus y FLAC, y códecs de video como Theora.
Use la clase OGGSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: OGGSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/x-vorbis | ||
| audio/x-flac | ||
| audio/x-speex | ||
| audio/x-celt | ||
| audio/x-opus | ||
| Entrada video | video/x-raw | uno o más |
| video/x-theora | ||
| video/x-dirac |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->VorbisEncoderBlock;
UniversalSourceBlock-->TheoraEncoderBlock;
VorbisEncoderBlock-->OGGSinkBlock;
TheoraEncoderBlock-->OGGSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio Vorbis
var audioEncoderBlock = new VorbisEncoderBlock(new VorbisEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video Theora
var videoEncoderBlock = new TheoraEncoderBlock(new TheoraEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink OGG
var sinkBlock = new OGGSinkBlock(new OGGSinkSettings(@"output.ogg"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
WAV¶
WAV (Waveform Audio File Format) es un estándar de formato de archivo de audio desarrollado por IBM y Microsoft para almacenar flujos de bits de audio en PCs. Es el formato principal usado en sistemas Windows para audio crudo y típicamente sin comprimir.
El sink se configura a través de su argumento filename — no existe una clase WAVSinkSettings separada; el formato de muestras proviene de la configuración del PCMEncoderBlock aguas arriba.
Información del bloque¶
Nombre: WAVSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno |
| audio/x-alaw | ||
| audio/x-mulaw |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->PCMEncoderBlock;
PCMEncoderBlock-->WAVSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp3";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Bloque de audio PCM
var audioBlock = new PCMEncoderBlock(new PCMEncoderSettings());
pipeline.Connect(fileSource.AudioOutput, audioBlock.Input);
// Sink WAV
var sinkBlock = new WAVSinkBlock(@"output.wav");
pipeline.Connect(audioBlock.Output, sinkBlock.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
WebM¶
WebM es un formato de archivo de medios abierto, libre de regalías, diseñado para la web. WebM define la estructura del contenedor de archivo, formatos de video y audio. Los archivos WebM consisten en flujos de video comprimidos con los códecs de video VP8 o VP9 y flujos de audio comprimidos con los códecs de audio Vorbis u Opus.
Use la clase WebMSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: WebMSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/x-vorbis | ||
| audio/x-opus | ||
| Entrada video | video/x-raw | uno o más |
| video/x-vp8 | ||
| video/x-vp9 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->VorbisEncoderBlock;
UniversalSourceBlock-->VP9EncoderBlock;
VorbisEncoderBlock-->WebMSinkBlock;
VP9EncoderBlock-->WebMSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Codificador de audio Vorbis
var audioEncoderBlock = new VorbisEncoderBlock(new VorbisEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// Codificador de video VP9
var videoEncoderBlock = new VP9EncoderBlock(new VP9EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Sink WebM
var sinkBlock = new WebMSinkBlock(new WebMSinkSettings(@"output.webm"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Sinks de Transmisión en Red¶
RTMP¶
RTMP (Real-Time Messaging Protocol): Desarrollado por Adobe, RTMP es un protocolo usado para transmitir audio, video y datos a través de Internet, optimizado para transmisión de alto rendimiento. Permite comunicación eficiente y de baja latencia, comúnmente usado en transmisiones en vivo como eventos deportivos y conciertos.
Use la clase RTMPSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: RTMPSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/mpeg [1,2,4] | uno |
| audio/x-adpcm | ||
| PCM [U8, S16LE] | ||
| audio/x-speex | ||
| audio/x-mulaw | ||
| audio/x-alaw | ||
| audio/x-nellymoser | ||
| Entrada video | video/x-h264 | uno |
Pipeline de ejemplo¶
graph LR;
VirtualVideoSourceBlock-->H264EncoderBlock;
VirtualAudioSourceBlock-->AACEncoderBlock;
H264EncoderBlock-->RTMPSinkBlock;
AACEncoderBlock-->RTMPSinkBlock; Código de ejemplo¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// Fuentes de video y audio
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1280,
Height = 720,
FrameRate = VideoFrameRate.FPS_25,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
var virtualAudioSource = new VirtualAudioSourceSettings
{
Channels = 2,
SampleRate = 44100,
};
var audioSource = new VirtualAudioSourceBlock(virtualAudioSource);
// Codificadores H264/AAC
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(videoSource.Output, h264Encoder.Input);
pipeline.Connect(audioSource.Output, aacEncoder.Input);
// Sink RTMP
var sink = new RTMPSinkBlock(new RTMPSinkSettings());
pipeline.Connect(h264Encoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Iniciar
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Facebook Live¶
Facebook Live es una función que permite transmisión en vivo de video en Facebook. La transmisión en vivo puede publicarse en perfiles personales, páginas o grupos.
Use la clase FacebookLiveSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: FacebookLiveSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/mpeg [1,2,4] | uno |
| audio/x-adpcm | ||
| PCM [U8, S16LE] | ||
| audio/x-speex | ||
| audio/x-mulaw | ||
| audio/x-alaw | ||
| audio/x-nellymoser | ||
| Entrada video | video/x-h264 | uno |
Pipeline de ejemplo¶
graph LR;
VirtualVideoSourceBlock-->H264EncoderBlock;
VirtualAudioSourceBlock-->AACEncoderBlock;
H264EncoderBlock-->FacebookLiveSinkBlock;
AACEncoderBlock-->FacebookLiveSinkBlock; Código de ejemplo¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// Fuentes de video y audio
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1280,
Height = 720,
FrameRate = VideoFrameRate.FPS_25,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
var virtualAudioSource = new VirtualAudioSourceSettings
{
Channels = 2,
SampleRate = 44100,
};
var audioSource = new VirtualAudioSourceBlock(virtualAudioSource);
// Codificadores H264/AAC
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(videoSource.Output, h264Encoder.Input);
pipeline.Connect(audioSource.Output, aacEncoder.Input);
// Sink de Facebook Live — FacebookLiveSinkSettings recibe solo la CLAVE de stream.
var sink = new FacebookLiveSinkBlock(new FacebookLiveSinkSettings("tu_clave_de_stream"));
pipeline.Connect(h264Encoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Iniciar
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
HLS¶
HLS (HTTP Live Streaming) es un protocolo de comunicaciones de transmisión adaptativa basado en HTTP desarrollado por Apple. Permite transmisión de tasa de bits adaptativa dividiendo el flujo en una secuencia de pequeños segmentos de archivo basados en HTTP.
El sink HLS soporta múltiples implementaciones: - hlssink3 (recomendado): Última implementación con segmentos MPEG-TS y características avanzadas - hlsmultivariantsink: Transmisión adaptativa multi-bitrate con generación automática de lista de reproducción maestra - hlscmafsink: Segmentos CMAF/fMP4 para mejor compatibilidad con reproductores modernos - hlssink2 (legacy): Implementación original con segmentos MPEG-TS
Use la clase HLSSinkSettings para configurar los parámetros. El sink selecciona automáticamente la mejor implementación disponible por defecto.
Información del bloque¶
Nombre: HLSSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/mpeg | uno o más |
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock1;
UniversalSourceBlock-->H264EncoderBlock2;
UniversalSourceBlock-->H264EncoderBlock3;
AACEncoderBlock-->HLSSinkBlock;
H264EncoderBlock1-->HLSSinkBlock;
H264EncoderBlock2-->HLSSinkBlock;
H264EncoderBlock3-->HLSSinkBlock; Código de ejemplo¶
Transmisión HLS Básica (modo Auto)¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// 3 codificadores de video con diferentes bitrates para transmisión adaptativa
var videoEncoderBlock1 = new H264EncoderBlock(new OpenH264EncoderSettings { Bitrate = 3000, Width = 1920, Height = 1080 });
var videoEncoderBlock2 = new H264EncoderBlock(new OpenH264EncoderSettings { Bitrate = 1500, Width = 1280, Height = 720 });
var videoEncoderBlock3 = new H264EncoderBlock(new OpenH264EncoderSettings { Bitrate = 800, Width = 854, Height = 480 });
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock1.Input);
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock2.Input);
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock3.Input);
// Configurar sink HLS con selección automática (prefiere hlssink3)
var hlsSettings = new HLSSinkSettings()
{
Location = @"c:\inetpub\wwwroot\hls\segment_%05d.ts",
PlaylistLocation = @"c:\inetpub\wwwroot\hls\playlist.m3u8",
PlaylistRoot = "http://localhost/hls/",
TargetDuration = TimeSpan.FromSeconds(6),
PlaylistLength = 5,
MaxFiles = 10,
PlaylistType = HLSPlaylistType.Event,
Custom_HTTP_Server_Enabled = true,
Custom_HTTP_Server_Port = 8080
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Conectar audio
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
// Conectar variantes de video
pipeline.Connect(videoEncoderBlock1.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock2.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock3.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Streaming CMAF/fMP4 (mejor compatibilidad)¶
// Configurar el sink HLS con segmentos CMAF/fMP4
var hlsSettings = new HLSSinkSettings()
{
SinkType = HLSSinkType.HlsCmafSink,
Location = @"c:\inetpub\wwwroot\hls\segment_%05d.m4s",
InitLocation = @"c:\inetpub\wwwroot\hls\init_%03d.mp4",
PlaylistLocation = @"c:\inetpub\wwwroot\hls\playlist.m3u8",
TargetDuration = TimeSpan.FromSeconds(6),
PlaylistType = HLSPlaylistType.Event,
EnableProgramDateTime = true,
Sync = true // Necesario para streaming en vivo con CMAF
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Conecte los streams como en el ejemplo básico
Streaming VOD (vídeo bajo demanda)¶
// Configurar el sink HLS para VOD
var hlsSettings = new HLSSinkSettings()
{
SinkType = HLSSinkType.HlsSink3,
Location = @"c:\videos\hls\segment_%05d.ts",
PlaylistLocation = @"c:\videos\hls\playlist.m3u8",
TargetDuration = TimeSpan.FromSeconds(10),
PlaylistType = HLSPlaylistType.Vod, // Modo VOD
EnableEndlist = true, // Añade la etiqueta #EXT-X-ENDLIST
PlaylistLength = 0 // Mantener todos los segmentos para VOD
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Conecte los streams como en el ejemplo básico
Streaming adaptativo multi-variante (playlist maestra)¶
// Configurar el sink HLS con soporte multivariante para streaming adaptativo real
var hlsSettings = new HLSSinkSettings()
{
SinkType = HLSSinkType.HlsMultivariantSink,
PlaylistLocation = @"c:\inetpub\wwwroot\hls\master.m3u8",
TargetDuration = TimeSpan.FromSeconds(6)
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Conectar varias variantes de video con distintas calidades
// hlsmultivariantsink crea automáticamente las playlists de variantes y la playlist maestra
pipeline.Connect(videoEncoderBlock1.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock2.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock3.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
Características del sink HLS¶
Tipos de sink¶
- Auto (predeterminado): selecciona automáticamente la mejor implementación disponible (prefiere hlssink3 → hlsmultivariantsink → hlscmafsink → hlssink2)
- HlsSink3: implementación más reciente con segmentos MPEG-TS, soporta tipos de playlist, program date time y funciones mejoradas
- HlsMultivariantSink: streaming adaptativo multi-bitrate con generación automática de playlist maestra para múltiples variantes de calidad
- HlsCmafSink: segmentos CMAF/fMP4 para mejor compatibilidad con navegadores y reproductores modernos
- HlsSink2: implementación heredada para compatibilidad hacia atrás
Tipos de playlist¶
- Unspecified: streaming en vivo sin etiqueta explícita de tipo de playlist
- Event: playlist tipo evento en la que los segmentos no se eliminan. Se añade #EXT-X-ENDLIST al final
- Vod: playlist Video on Demand. Se comporta como Event pero establece #EXT-X-PLAYLIST-TYPE:VOD al finalizar
Propiedades clave¶
| Propiedad | Descripción | Soporte por sink |
|---|---|---|
SinkType | Implementación de sink (Auto, HlsSink2, HlsSink3, HlsCmafSink, HlsMultivariantSink) | Todos |
Location | Patrón del archivo de segmento (p. ej., segment_%05d.ts o .m4s) | Todos excepto HlsMultivariantSink |
InitLocation | Patrón del segmento de init para CMAF (p. ej., init_%03d.mp4) | HlsCmafSink |
PlaylistLocation | Ruta del archivo de playlist de salida (.m3u8, master.m3u8 para multivariante) | Todos |
PlaylistRoot | URL base para los segmentos en la playlist | Todos excepto HlsMultivariantSink |
TargetDuration | Duración objetivo del segmento (TimeSpan) | Todos |
PlaylistLength | Número de segmentos en la playlist (0 = sin límite) | Todos excepto HlsMultivariantSink |
MaxFiles | Máximo de archivos conservados en disco | Todos excepto HlsMultivariantSink |
PlaylistType | Tipo de playlist (Unspecified, Event, Vod) | HlsSink3, HlsCmafSink |
EnableProgramDateTime | Añade etiquetas #EXT-X-PROGRAM-DATE-TIME | HlsSink3, HlsCmafSink |
EnableEndlist | Añade #EXT-X-ENDLIST al final | HlsSink3, HlsCmafSink |
IFramesOnly | Crea playlist de solo I-frames | HlsSink3 |
Sync | Sincroniza con el reloj (necesario para CMAF en vivo) | HlsCmafSink |
Latency | Latencia (TimeSpan) | HlsCmafSink |
SendKeyframeRequests | Solicita keyframes al codificador | HlsSink2, HlsSink3 |
Plataformas¶
Windows, macOS, Linux, iOS, Android.
MJPEG sobre HTTP¶
HTTP MJPEG (Motion JPEG) Live es un formato de transmisión de video donde cada fotograma de video se comprime por separado como una imagen JPEG y se transmite sobre HTTP. Es ampliamente usado en cámaras IP y webcams debido a su simplicidad, aunque es menos eficiente que los códecs modernos.
Construya con new HTTPMJPEGLiveSinkBlock(int port) — el bloque solo expone un constructor con puerto; la ruta de URL es fija (http://<host>:<puerto>/). No existe una clase de configuración separada.
Información del bloque¶
Nombre: HTTPMJPEGLiveSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada video | video/x-raw | uno |
| image/jpeg |
Pipeline de ejemplo¶
graph LR;
VirtualVideoSourceBlock-->MJPEGEncoderBlock;
MJPEGEncoderBlock-->HTTPMJPEGLiveSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
// Crear fuente de video virtual
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1280,
Height = 720,
FrameRate = VideoFrameRate.FPS_30,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
// Codificador MJPEG
var mjpegEncoder = new MJPEGEncoderBlock(new MJPEGEncoderSettings { Quality = 80 });
pipeline.Connect(videoSource.Output, mjpegEncoder.Input);
// Servidor HTTP MJPEG (solo puerto — escucha en http://<host>:8080/)
var sink = new HTTPMJPEGLiveSinkBlock(8080);
pipeline.Connect(mjpegEncoder.Output, sink.Input);
// Iniciar
await pipeline.StartAsync();
Console.WriteLine("Flujo MJPEG disponible en http://localhost:8080/stream");
Console.WriteLine("Presione cualquier tecla para detener...");
Console.ReadKey();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
NDI¶
NDI (Network Device Interface) es un estándar de transporte de video libre de regalías desarrollado por NewTek que permite que productos compatibles con video se comuniquen, entreguen y reciban video de calidad de transmisión de manera de alta calidad y baja latencia a través de redes Ethernet estándar.
Use la clase NDISinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: NDISinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno |
| Entrada video | video/x-raw | uno |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->NDISinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
var sinkBlock = new NDISinkBlock(new NDISinkSettings("Mi Flujo NDI"));
// NDISinkBlock expone pads dinámicos vía CreateNewInput — sin propiedades fijas AudioInput/VideoInput.
pipeline.Connect(fileSource.AudioOutput, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux.
SRT¶
SRT (Secure Reliable Transport) es un protocolo de transporte de video de código abierto que permite la entrega de video de alta calidad, seguro y de baja latencia a través de redes impredecibles como el internet público. Fue desarrollado por Haivision.
Use la clase SRTSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: SRTSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada | Cualquier formato de flujo | 1 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->SRTSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Crear sink SRT en modo caller (conectándose a un listener).
// SRTSinkBlock lleva MPEG-TS internamente — conecta flujos elementales codificados directamente.
var srtSettings = new SRTSinkSettings
{
Host = "servidor-srt.ejemplo.com",
Port = 1234,
Mode = SRTMode.Caller,
Latency = 200, // milisegundos
Passphrase = "frase-de-cifrado-opcional"
};
var srtSink = new SRTSinkBlock(srtSettings);
pipeline.Connect(fileSource.AudioOutput, srtSink.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, srtSink.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
SRT MPEG-TS¶
SRT MPEG-TS es una combinación del protocolo de transporte SRT con el formato contenedor MPEG-TS. Esto permite transporte seguro y confiable de flujos MPEG-TS sobre redes públicas, lo cual es útil para transmisión y flujos de trabajo de video profesional.
Use la clase SRTMPEGTSSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: SRTMPEGTSSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Pipeline de ejemplo¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->SRTMPEGTSSinkBlock;
H264EncoderBlock-->SRTMPEGTSSinkBlock; Código de ejemplo¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Configurar sink SRT MPEG-TS
var srtMpegtsSinkSettings = new SRTMPEGTSSinkSettings
{
Host = "servidor-srt.ejemplo.com",
Port = 1234,
Mode = SRTMode.Caller,
Latency = 200,
Passphrase = "frase-de-cifrado-opcional"
};
var sinkBlock = new SRTMPEGTSSinkBlock(srtMpegtsSinkSettings);
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
YouTube Live¶
YouTube Live es un servicio de transmisión en vivo proporcionado por YouTube. Permite a los creadores transmitir videos en vivo a su audiencia a través de la plataforma de YouTube.
Use la clase YouTubeSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: YouTubeSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/mpeg [1,2,4] | uno |
| audio/x-adpcm | ||
| PCM [U8, S16LE] | ||
| audio/x-speex | ||
| audio/x-mulaw | ||
| audio/x-alaw | ||
| audio/x-nellymoser | ||
| Entrada video | video/x-h264 | uno |
Pipeline de ejemplo¶
graph LR;
VirtualVideoSourceBlock-->H264EncoderBlock;
VirtualAudioSourceBlock-->AACEncoderBlock;
H264EncoderBlock-->YouTubeSinkBlock;
AACEncoderBlock-->YouTubeSinkBlock; Código de ejemplo¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// Fuentes de video y audio
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1920,
Height = 1080,
FrameRate = VideoFrameRate.FPS_30,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
var virtualAudioSource = new VirtualAudioSourceSettings
{
Channels = 2,
SampleRate = 48000,
};
var audioSource = new VirtualAudioSourceBlock(virtualAudioSource);
// Codificadores H264/AAC
var h264Settings = new OpenH264EncoderSettings
{
Bitrate = 4000, // 4 Mbps para 1080p
KeyframeInterval = 2 // Keyframe cada 2 segundos
};
var h264Encoder = new H264EncoderBlock(h264Settings);
var aacSettings = new AACEncoderSettings
{
Bitrate = 192 // 192 kbps para audio
};
var aacEncoder = new AACEncoderBlock(aacSettings);
pipeline.Connect(videoSource.Output, h264Encoder.Input);
pipeline.Connect(audioSource.Output, aacEncoder.Input);
// Sink de YouTube Live — YouTubeSinkSettings recibe solo la CLAVE de stream.
var sink = new YouTubeSinkBlock(new YouTubeSinkSettings("tu_clave_de_stream_youtube"));
pipeline.Connect(h264Encoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Iniciar
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Shoutcast¶
Shoutcast es un servicio para transmitir medios sobre internet a reproductores de medios, usando su propio software propietario multiplataforma. Permite que contenido de audio digital, principalmente en formato MP3 o High-Efficiency Advanced Audio Coding (HE-AAC), sea transmitido. El uso más común de Shoutcast es para crear o escuchar transmisiones de audio de Internet.
Use la clase ShoutcastSinkSettings para establecer los parámetros.
Información del bloque¶
Nombre: ShoutcastSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada audio | audio/mpeg | uno |
| audio/aac | ||
| audio/x-aac |
Pipeline de ejemplo¶
graph LR;
subgraph PipelinePrincipal
direction LR
A[Fuente de Audio ej. UniversalSourceBlock o VirtualAudioSourceBlock] --> B{Codificador de Audio Opcional ej. MP3EncoderBlock};
B --> C[ShoutcastSinkBlock];
end
subgraph AlternativaSiFuenteCodificada
A2[Fuente de Audio Codificado] --> C2[ShoutcastSinkBlock];
end Código de ejemplo¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// Fuente de audio (ej., de un archivo con MP3/AAC o audio crudo)
var universalSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync("input.mp3"));
// O usar VirtualAudioSourceBlock para entrada de audio crudo en vivo:
// var audioSource = new VirtualAudioSourceBlock(new VirtualAudioSourceSettings { Channels = 2, SampleRate = 44100 });
// Opcional: Codificador de Audio (si la fuente es audio crudo o necesita re-codificación para Shoutcast)
// Ejemplo: MP3EncoderBlock si el servidor Shoutcast espera MP3
var mp3Encoder = new MP3EncoderBlock(new MP3EncoderSettings() { Bitrate = 128000 }); // Bitrate en bps
pipeline.Connect(universalSource.AudioOutput, mp3Encoder.Input);
// Si usa VirtualAudioSourceBlock: pipeline.Connect(audioSource.Output, mp3Encoder.Input);
// Sink Shoutcast
// Configurar los detalles de conexión al servidor Shoutcast/Icecast
var shoutcastSettings = new ShoutcastSinkSettings
{
IP = "ip-servidor-shoutcast", // Nombre de host del servidor o dirección IP
Port = 8000, // Puerto del servidor
Mount = "/mountpoint", // Punto de montaje (ej., "/stream", "/live.mp3")
Password = "tu-contraseña", // Contraseña de fuente para el servidor
Protocol = ShoutProtocol.ICY, // ShoutProtocol.ICY para Shoutcast v1/v2 (ej., icy://)
// ShoutProtocol.HTTP para Icecast 2.x (ej., http://)
// ShoutProtocol.XAudiocast para Shoutcast/XAudioCast más antiguos
// Metadatos para el flujo
StreamName = "Mi Radio Stream",
Genre = "Varios",
Description = "Mi increíble estación de radio por internet",
URL = "https://mi-sitio-radio.com", // URL de página principal para tu flujo (aparece en metadatos del directorio)
Public = true, // Establecer a true para listar en directorios públicos (si el servidor soporta)
Username = "source" // Nombre de usuario para autenticación (frecuentemente "source"; verificar configuración del servidor)
// Otros parámetros del flujo como bitrate de audio, samplerate, canales son típicamente determinados
// por las propiedades del flujo de audio codificado de entrada alimentado al ShoutcastSinkBlock.
};
var shoutcastSink = new ShoutcastSinkBlock(shoutcastSettings);
// Conectar salida del codificador (o salida de audio de fuente si ya está codificada y es compatible) al sink Shoutcast
pipeline.Connect(mp3Encoder.Output, shoutcastSink.Input);
// Si la fuente ya está codificada y es compatible (ej. archivo MP3 a Shoutcast MP3):
// pipeline.Connect(universalSource.AudioOutput, shoutcastSink.Input);
// Iniciar el pipeline
await pipeline.StartAsync();
// Para propósitos de visualización, puede construir una cadena representando la conexión:
string protocolScheme = shoutcastSettings.Protocol switch
{
ShoutProtocol.ICY => "icy",
ShoutProtocol.HTTP => "http",
ShoutProtocol.XAudiocast => "xaudiocast", // Nota: el esquema real podría ser http para XAudiocast
_ => "desconocido"
};
Console.WriteLine($"Transmitiendo al servidor Shoutcast: {protocolScheme}://{shoutcastSettings.IP}:{shoutcastSettings.Port}{shoutcastSettings.Mount}");
Console.WriteLine($"URL de metadatos del flujo (para directorios): {shoutcastSettings.URL}");
Console.WriteLine("Presione cualquier tecla para detener el flujo...");
Console.ReadKey();
// Detener el pipeline (importante para desconexión elegante y limpieza de recursos)
await pipeline.StopAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
DASH¶
El DASHSinkBlock crea salida MPEG-DASH (Dynamic Adaptive Streaming over HTTP) — un manifiesto MPD y segmentos de medios — compatible con cualquier reproductor DASH. Admite modos VOD (estático) y en vivo (dinámico). Se pueden conectar múltiples flujos de video y audio simultáneamente para crear manifiestos de bitrate adaptativo.
Información del bloque¶
Nombre: DASHSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada de video | video/x-h264 | uno o más |
| video/x-h265 | ||
| video/x-vp9 | ||
| video/x-av1 | ||
| Entrada de audio | audio/mpeg | uno o más |
| audio/x-aac | ||
| audio/x-opus |
Configuración¶
Use DASHSinkSettings para configurar la salida DASH:
| Propiedad | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
MPDFilename | string | c:\inetpub\wwwroot\dash\manifest.mpd | Ruta completa del archivo de manifiesto MPD |
MPDBaseURL | string | "" | URL base antepuesta a los nombres de segmentos en el manifiesto |
TargetDuration | TimeSpan | 5 s | Duración objetivo por segmento de medios |
MinBufferTime | TimeSpan | 2 s | Tiempo mínimo de buffer anunciado en el manifiesto |
Dynamic | bool | false | false = VOD/estático; true = transmisión en vivo |
PresentationDelay | TimeSpan | 0 | Retraso de presentación (solo en vivo) |
MinimumUpdatePeriod | TimeSpan | 0 | Intervalo de actualización del MPD (solo en vivo) |
TimeShiftBufferDepth | TimeSpan | 0 | Profundidad de ventana DVR (solo en vivo) |
SendKeyframeRequests | bool | true | Solicitar keyframes en los límites de segmentos |
Custom_HTTP_Server_Enabled | bool | false | Habilitar servidor HTTP integrado para servir segmentos |
Custom_HTTP_Server_Port | int | 80 | Puerto del servidor HTTP integrado |
Llame a settings.CheckAndCreateFolders() antes de iniciar el pipeline para asegurarse de que el directorio de salida exista.
Los pines de entrada se crean dinámicamente: llame a dashSink.CreateNewInput(MediaBlockPadMediaType.Video) o dashSink.CreateNewInput(MediaBlockPadMediaType.Audio) para obtener un pin, luego conecte la salida de su codificador.
El pipeline de muestra¶
graph LR;
UniversalSourceBlock -- Video Sin Comprimir --> H264EncoderBlock;
UniversalSourceBlock -- Audio Sin Comprimir --> AACEncoderBlock;
H264EncoderBlock -- Video H.264 --> DASHSinkBlock;
AACEncoderBlock -- Audio AAC --> DASHSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var dashSettings = new DASHSinkSettings
{
MPDFilename = @"c:\output\dash\manifest.mpd",
MPDBaseURL = "http://localhost/dash/",
TargetDuration = TimeSpan.FromSeconds(5),
Dynamic = false // modo VOD/estático; establecer true para transmisión en vivo
};
dashSettings.CheckAndCreateFolders();
var dashSink = new DASHSinkBlock(dashSettings);
var universalSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync("input.mp4"));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(universalSource.VideoOutput, h264Encoder.Input);
pipeline.Connect(universalSource.AudioOutput, aacEncoder.Input);
pipeline.Connect(h264Encoder.Output, dashSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, dashSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilidad¶
Verificar disponibilidad usando DASHSinkBlock.IsAvailable(). Requiere el plugin dash de GStreamer y el paquete de redistribución SDK correcto.
Plataformas¶
Windows, macOS, Linux.
WHIP¶
El WHIPSinkBlock transmite medios a servidores WebRTC usando WHIP (WebRTC-HTTP Ingestion Protocol), permitiendo transmisión en vivo de baja latencia a servicios como MediaMTX, Janus, Cloudflare Stream y otros endpoints compatibles con WHIP. El video debe estar codificado en H.264 y el audio en Opus — el bloque maneja internamente el empaquetado RTP.
Información del bloque¶
Nombre: WHIPSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada de video | video/x-h264 | 1 |
| Entrada de audio | audio/x-opus | 1 |
Configuración¶
Use WHIPSinkSettings para configurar el endpoint WHIP:
| Propiedad | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
Location | string | http://localhost:8889/stream/whip | URL del endpoint WHIP |
AuthToken | string | null | Token Bearer enviado en el encabezado HTTP Authorization |
StunServer | string | null | URL del servidor STUN (formato: stun://hostname:port) |
TurnServer | string | null | URL del servidor TURN (formato: turn(s)://usuario:contraseña@host:port) |
UseLinkHeaders | bool | true | Configurar automáticamente servidores ICE desde encabezados Link de respuesta del servidor WHIP |
Timeout | TimeSpan | 15 s | Tiempo de espera para solicitudes HTTP WHIP |
IceTransportPolicy | WHIPIceTransportPolicy | All | All = usar STUN y TURN; Relay = solo relay TURN |
Los pines de entrada se crean dinámicamente: llame a whipSink.CreateNewInput(MediaBlockPadMediaType.Video) y whipSink.CreateNewInput(MediaBlockPadMediaType.Audio) para obtener los pines, luego conecte sus codificadores.
El pipeline de muestra¶
graph LR;
UniversalSourceBlock -- Video Sin Comprimir --> H264EncoderBlock;
UniversalSourceBlock -- Audio Sin Comprimir --> OPUSEncoderBlock;
H264EncoderBlock -- Video H.264 --> WHIPSinkBlock;
OPUSEncoderBlock -- Audio Opus --> WHIPSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var whipSettings = new WHIPSinkSettings
{
Location = "http://localhost:8889/live/whip",
AuthToken = "tu-token-bearer", // opcional
StunServer = "stun://stun.l.google.com:19302"
};
var whipSink = new WHIPSinkBlock(whipSettings);
var universalSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync("input.mp4"));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var opusEncoder = new OPUSEncoderBlock();
pipeline.Connect(universalSource.VideoOutput, h264Encoder.Input);
pipeline.Connect(universalSource.AudioOutput, opusEncoder.Input);
pipeline.Connect(h264Encoder.Output, whipSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(opusEncoder.Output, whipSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilidad¶
Verificar disponibilidad usando WHIPSinkBlock.IsAvailable(). Requiere el plugin webrtc de GStreamer y el paquete de redistribución SDK correcto.
Plataformas¶
Windows, macOS, Linux.
RIST MPEG-TS¶
El RISTMPEGTSSinkBlock multiplexa flujos de audio y video en MPEG-TS, encapsula el transporte en RTP y lo envía mediante el protocolo RIST (Reliable Internet Stream Transport). RIST añade retransmisión basada en ARQ sobre UDP, proporcionando entrega de medios fiable y de baja latencia sin la sobrecarga de TCP.
Se admiten múltiples pines de entrada de audio y video. Llame a CreateNewInput(MediaBlockPadMediaType.Video) y CreateNewInput(MediaBlockPadMediaType.Audio) para obtener los pines antes de conectar los codificadores.
Información del bloque¶
Nombre: RISTMPEGTSSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada de video | Video codificado | Dinámico |
| Entrada de audio | Audio codificado | Dinámico |
Configuración¶
Use RISTSinkSettings para configurar el destino:
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
Address | string | "localhost" | Dirección IPv4 o IPv6 de destino |
Port | uint | 5004 | Puerto RTP de destino (debe ser par; RTCP usa Puerto + 1) |
SenderBuffer | TimeSpan | 1200 ms | Tamaño de la cola de retransmisión |
BondingAddresses | string | null | Pares dirección:puerto separados por comas para bonding; reemplaza Address/Port |
BondingMethod | RISTBondingMethod | Broadcast | Broadcast = enviar a todos; RoundRobin = alternar |
MulticastInterface | string | null | Interfaz de red para multicast |
MulticastTTL | int | 1 | Tiempo de vida del multicast |
DropNullTSPackets | bool | false | Eliminar paquetes de relleno MPEG-TS nulos |
SequenceNumberExtension | bool | false | Añadir extensión de número de secuencia RTP |
MinRTCPInterval | uint | 100 | Intervalo mínimo de paquetes RTCP (ms) |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock -- Video sin procesar --> H264EncoderBlock;
UniversalSourceBlock -- Audio sin procesar --> AACEncoderBlock;
H264EncoderBlock --> RISTMPEGTSSinkBlock;
AACEncoderBlock --> RISTMPEGTSSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var source = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync("input.mp4"));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(source.VideoOutput, h264Encoder.Input);
pipeline.Connect(source.AudioOutput, aacEncoder.Input);
var ristSettings = new RISTSinkSettings
{
Address = "192.168.1.100",
Port = 5004,
SenderBuffer = TimeSpan.FromMilliseconds(1200)
};
var ristSink = new RISTMPEGTSSinkBlock(ristSettings);
pipeline.Connect(h264Encoder.Output, ristSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, ristSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilidad¶
RISTMPEGTSSinkBlock.IsAvailable() devuelve true si el plugin GStreamer rist está presente.
Plataformas¶
Windows, macOS, Linux.
UDP¶
UDP (User Datagram Protocol) es un protocolo de transporte ligero y sin conexión que proporciona streaming de baja latencia con sobrecarga mínima. A diferencia de los protocolos basados en TCP, UDP no garantiza la entrega de paquetes, lo que lo hace ideal para aplicaciones en tiempo real en las que la velocidad es crítica.
Use la clase UDPSinkSettings para configurar los parámetros.
Información del bloque¶
Nombre: UDPSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquier formato de stream | 1 |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->UDPMPEGTSSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// UDPMPEGTSSinkBlock envuelve el muxer MPEG-TS internamente —
// conecte los streams elementales codificados directamente mediante CreateNewInput.
var udpSettings = new UDPSinkSettings
{
Host = "192.168.1.100",
Port = 5004
};
var udpSink = new UDPMPEGTSSinkBlock(udpSettings);
pipeline.Connect(fileSource.AudioOutput, udpSink.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, udpSink.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
UDP MPEG-TS¶
UDP MPEG-TS combina el multiplexado MPEG-TS con el transporte UDP. Esto permite la entrega de baja latencia de streams de audio y video multiplexados sobre UDP, ampliamente utilizado en broadcast, IPTV y flujos de videovigilancia.
Use la clase UDPSinkSettings para configurar los parámetros.
Información del bloque¶
Nombre: UDPMPEGTSSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada de audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada de video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Configuración¶
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
Host | string | "localhost" | Host/IP/grupo multicast de destino |
Port | int | 5004 | Puerto de destino |
TTL | int | 64 | Time-to-live para unicast |
MulticastTTL | int | 1 | Time-to-live para multicast |
AutoMulticast | bool | true | Unirse/abandonar grupos multicast automáticamente |
MulticastInterface | string | null | Interfaz de red para multicast |
Loop | bool | true | Loopback multicast |
BufferSize | int | 0 | Tamaño del buffer de envío del kernel (0 = predeterminado) |
QosDscp | int | -1 | Valor DSCP (-1 = predeterminado) |
BindAddress | string | null | Dirección local a la que enlazar |
BindPort | int | 0 | Puerto local al que enlazar (0 = auto) |
MuxerLatency | TimeSpan | 1000 ms | Latencia del agregador del muxer MPEG-TS |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->UDPMPEGTSSinkBlock;
H264EncoderBlock-->UDPMPEGTSSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Configurar el sink UDP MPEG-TS
var udpSettings = new UDPSinkSettings
{
Host = "192.168.1.100",
Port = 5004,
TTL = 64
};
var sinkBlock = new UDPMPEGTSSinkBlock(udpSettings);
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Disponibilidad¶
UDPMPEGTSSinkBlock.IsAvailable() devuelve true si el plugin GStreamer udp está presente.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
UDP multidestino¶
El MultiUDPSinkBlock envía datos sin procesar por UDP a uno o varios destinatarios simultáneamente. Los destinos se especifican como pares host:port separados por comas y pueden gestionarse mediante métodos auxiliares en la clase de configuración.
Use la clase MultiUDPSinkSettings para configurar los parámetros.
Información del bloque¶
Nombre: MultiUDPSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquier formato de stream | 1 |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->MultiUDPMPEGTSSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// MultiUDPMPEGTSSinkBlock envuelve el muxer MPEG-TS internamente —
// registre destinos mediante AddClient y conecte los streams elementales mediante CreateNewInput.
var multiUdpSettings = new MultiUDPSinkSettings();
multiUdpSettings.AddClient("192.168.1.100", 5004);
multiUdpSettings.AddClient("192.168.1.101", 5004);
var multiUdpSink = new MultiUDPMPEGTSSinkBlock(multiUdpSettings);
pipeline.Connect(fileSource.AudioOutput, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
UDP MPEG-TS multidestino¶
El MultiUDPMPEGTSSinkBlock multiplexa streams de audio y video en MPEG-TS y envía el resultado por UDP a uno o varios destinos simultáneamente. Resulta útil para distribuir el mismo stream a múltiples receptores, servidores de grabación o endpoints redundantes.
Se admiten varios pads de entrada de audio y video. Llame a CreateNewInput(MediaBlockPadMediaType.Video) y CreateNewInput(MediaBlockPadMediaType.Audio) para obtener pads antes de conectar los codificadores.
Información del bloque¶
Nombre: MultiUDPMPEGTSSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada de audio | audio/x-raw | uno o más |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Entrada de video | video/x-raw | uno o más |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Configuración¶
Use MultiUDPSinkSettings para configurar los destinos:
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
Clients | string | "" | Pares host:port separados por comas |
SendDuplicates | bool | true | Enviar duplicados cuando se añade el mismo destino varias veces |
TTL | int | 64 | Time-to-live para unicast |
MulticastTTL | int | 1 | Time-to-live para multicast |
AutoMulticast | bool | true | Unirse/abandonar grupos multicast automáticamente |
MulticastInterface | string | null | Interfaz de red para multicast |
Loop | bool | true | Loopback multicast |
BufferSize | int | 0 | Tamaño del buffer de envío del kernel (0 = predeterminado) |
QosDscp | int | -1 | Valor DSCP (-1 = predeterminado) |
BindAddress | string | null | Dirección local a la que enlazar |
BindPort | int | 0 | Puerto local al que enlazar (0 = auto) |
MuxerLatency | TimeSpan | 1000 ms | Latencia del agregador del muxer MPEG-TS |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock -- Video sin procesar --> H264EncoderBlock;
UniversalSourceBlock -- Audio sin procesar --> AACEncoderBlock;
H264EncoderBlock --> MultiUDPMPEGTSSinkBlock;
AACEncoderBlock --> MultiUDPMPEGTSSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var source = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync("input.mp4"));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(source.VideoOutput, h264Encoder.Input);
pipeline.Connect(source.AudioOutput, aacEncoder.Input);
var multiUdpSettings = new MultiUDPSinkSettings();
multiUdpSettings.AddClient("192.168.1.100", 5004);
multiUdpSettings.AddClient("192.168.1.101", 5004);
var multiUdpSink = new MultiUDPMPEGTSSinkBlock(multiUdpSettings);
pipeline.Connect(h264Encoder.Output, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilidad¶
MultiUDPMPEGTSSinkBlock.IsAvailable() devuelve true si el plugin GStreamer udp está presente.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Sinks de Utilidad¶
Sink de Stream¶
El StreamSinkBlock escribe datos multimedia en cualquier objeto Stream de .NET, permitiendo salida flexible a búferes de memoria, archivos, conexiones de red, capas de cifrado o cualquier stream escribible.
El stream debe permanecer abierto y escribible durante toda la vida del pipeline. El bloque no elimina el stream cuando el pipeline se detiene.
Información del bloque¶
Nombre: StreamSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
using var outputStream = new FileStream("output.raw", FileMode.Create, FileAccess.Write);
var streamSink = new StreamSinkBlock(outputStream);
pipeline.Connect(fileSource.VideoOutput, streamSink.Input);
await pipeline.StartAsync();
Disponibilidad¶
StreamSinkBlock.IsAvailable() devuelve true si el elemento GStreamer appsink está disponible.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Sink de Descriptor de Archivo¶
El FDSinkBlock escribe datos multimedia en un descriptor de archivo Unix (un manejador entero). Esto es útil para enviar datos a tuberías (pipes), sockets o stdin de un proceso hijo.
Pase addQueue: true (predeterminado) para añadir una cola de búfer que evita que el pipeline se bloquee en escrituras lentas al descriptor.
El descriptor debe estar abierto y ser escribible antes de que el pipeline inicie. El bloque no lo cierra cuando el pipeline se detiene.
Información del bloque¶
Nombre: FDSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(filename));
// Escribir en stdout (fd 1)
var fdSink = new FDSinkBlock(descriptor: 1);
pipeline.Connect(fileSource.VideoOutput, fdSink.Input);
await pipeline.StartAsync();
Disponibilidad¶
FDSinkBlock.IsAvailable() devuelve true si el elemento GStreamer fdsink está disponible.
Plataformas¶
Linux, macOS. Soporte limitado en Windows.
Sink de Archivo KLV¶
El KLVFileSinkBlock escribe flujos de metadatos KLV (Key-Length-Value) en un archivo. KLV se usa en aplicaciones compatibles con MISB/STANAG 4609 — incluyendo video de UAV, vigilancia y aeroespacial — para insertar metadatos geoespaciales junto con el video.
El bloque acepta datos meta/x-klv en su entrada y los escribe directamente en el archivo especificado a través del elemento GStreamer filesink.
Información del bloque¶
Nombre: KLVFileSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | meta/x-klv | 1 |
Código de muestra¶
// El SDK no incluye un bloque fuente KLV dedicado — los flujos KLV se producen
// desde fuentes MPEG-TS / compatibles con MISB upstream o desde la propia aplicación,
// y luego se enrutan a KLVFileSinkBlock para el almacenamiento en archivo.
var pipeline = new MediaBlocksPipeline();
var klvFileSink = new KLVFileSinkBlock("output_metadata.klv");
pipeline.Connect(klvProducer.Output, klvFileSink.Input); // klvProducer = su bloque emisor de KLV
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux.
Sink de Búfer¶
El BufferSinkBlock captura datos multimedia en memoria y los entrega fotograma a fotograma mediante callbacks de eventos. A diferencia de los sinks de archivo o red, devuelve muestras de medios en crudo directamente al código de su aplicación.
Tres constructores controlan el tipo de datos capturados:
BufferSinkBlock(VideoFormatX videoFormat, bool allowFrameDrop = false)— captura fotogramas de video con conversión de formato opcional; establezcaallowFrameDrop: truepara descartar fotogramas cuando los callbacks no puedan seguir el ritmo del medio.BufferSinkBlock(AudioFormatX audioFormat, bool allowFrameDrop = false)— captura muestras de audio con remuestreo opcional.BufferSinkBlock()— detecta automáticamente el tipo de medio entrante; generaOnDataFrameBufferuOnSamplepara cualquier medio.
Eventos clave:
OnVideoFrameBuffer— se genera para cada fotograma de video decodificadoOnAudioFrameBuffer— se genera para cada muestra de audio decodificadaOnDataFrameBuffer— se genera para streams de datos que no son audio/videoOnSample— acceso de bajo nivel a la muestra GStreamer; cuando hay suscriptores suprime los tres eventos anteriores. Siempre libere la muestra después de usarla para evitar fugas de memoria.
Información del bloque¶
Nombre: BufferSinkBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
Configuración¶
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
AllowFrameDrop | bool | false | Descarta fotogramas cuando el consumidor es demasiado lento |
IsSync | bool | true | Sincroniza la entrega de búferes con el reloj del pipeline |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->BufferSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var source = new SystemVideoSourceBlock(new SystemVideoSourceSettings(/* ... */));
var bufferSink = new BufferSinkBlock(VideoFormatX.BGR);
bufferSink.OnVideoFrameBuffer += (sender, e) =>
{
// e.Frame contiene los datos de video en crudo
Console.WriteLine($"Fotograma recibido: {e.Frame.Width}x{e.Frame.Height}");
};
pipeline.Connect(source.Output, bufferSink.Input);
await pipeline.StartAsync();
Disponibilidad¶
BufferSinkBlock.IsAvailable() devuelve true si el elemento GStreamer appsink está disponible.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Sink de Cámara Virtual¶
El VirtualCameraSinkBlock expone la salida del pipeline como una cámara virtual del sistema (y un micrófono virtual), de modo que cualquier otra aplicación de Windows — Zoom, Teams, OBS, un navegador — pueda recibir el video y audio procesados como si provinieran de un dispositivo de captura real. Los fotogramas se entregan a los filtros de fuente DirectShow Virtual Camera y Virtual Audio Card de VisioForge a través de memoria compartida.
Ambas entradas son opcionales: cree una entrada de video, una entrada de audio, o ambas. Use CreateNewInput(MediaBlockPadMediaType.Video) y CreateNewInput(MediaBlockPadMediaType.Audio) para añadir los pads que necesite.
Este bloque es solo para Windows. Los filtros de fuente Virtual Camera y Virtual Audio Card deben estar registrados como COM en la máquina antes de que aparezcan los dispositivos virtuales. Use VirtualCameraSinkBlock.IsCOMRegistered() para comprobarlo, y VirtualCameraSinkBlock.COMRegisterAsAdmin() para registrarlos con una solicitud de elevación (UAC).
Configure la salida con VirtualCameraSinkSettings.
Información del bloque¶
Nombre: VirtualCameraSinkBlock.
| Dirección del pin | Tipo de medio | Cantidad de pines |
|---|---|---|
| Entrada de video | video/x-raw | cero o uno |
| Entrada de audio | audio/x-raw | cero o uno |
Configuración¶
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
Width | int | 1280 | Ancho del fotograma de video en píxeles (debe ser par) |
Height | int | 720 | Alto del fotograma de video en píxeles |
FrameRate | double | 30.0 | Tasa de fotogramas objetivo |
VideoStreamName | string | "VideoStream1" | Nombre del stream de memoria compartida; debe coincidir con el filtro de fuente de la cámara virtual |
AudioSampleRate | int | 48000 | Tasa de muestreo de audio en Hz |
AudioChannels | int | 2 | Número de canales de audio (1 = mono, 2 = estéreo) |
AudioBitsPerSample | int | 16 | Bits por muestra de audio |
AudioStreamName | string | "AudioStream1" | Nombre del stream de memoria compartida; debe coincidir con el filtro de fuente de la tarjeta de audio virtual |
CustomVideoProcessor | MediaBlock | null | Bloque opcional de procesamiento de video personalizado |
CustomAudioProcessor | MediaBlock | null | Bloque opcional de procesamiento de audio personalizado |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->VirtualCameraSinkBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var source = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync("input.mp4"));
var settings = new VirtualCameraSinkSettings
{
Width = 1280,
Height = 720,
FrameRate = 30.0
};
var virtualCameraSink = new VirtualCameraSinkBlock(settings);
// conectar video y audio (ambas entradas son opcionales)
pipeline.Connect(source.VideoOutput, virtualCameraSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(source.AudioOutput, virtualCameraSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilidad¶
VirtualCameraSinkBlock.IsAvailable() devuelve true si el sink de cámara virtual subyacente está disponible en este sistema. VirtualCameraSinkBlock.IsCOMRegistered() devuelve true cuando ambos filtros de fuente, Virtual Camera y Virtual Audio Card, están registrados.
Plataformas¶
Windows.