Bloques especiales¶
Introducción¶
Los bloques especiales son bloques que no encajan en ninguna otra categoría.
Null Renderer¶
El bloque null renderer envía los datos a null. Este bloque puede ser requerido si su bloque tiene salidas que no quiere usar.
Información del bloque¶
Nombre: NullRendererBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
El pipeline de muestra¶
El pipeline de muestra se muestra abajo. Lee un archivo y envía los datos de video al grabber de muestras de video, donde puede grabar cada frame de video después de decodificación. El bloque Null renderer se usa para terminar el pipeline.
graph LR;
UniversalSourceBlock-->VideoSampleGrabberBlock;
VideoSampleGrabberBlock-->NullRendererBlock; Código de muestra¶
private void Start()
{
// crear el pipeline
var pipeline = new MediaBlocksPipeline();
// crear bloque fuente universal
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
// crear bloque grabber de muestras de video y agregar el manejador de eventos
var sampleGrabber = new VideoSampleGrabberBlock();
sampleGrabber.OnVideoFrameBuffer += sampleGrabber_OnVideoFrameBuffer;
// crear bloque null renderer
var nullRenderer = new NullRendererBlock();
// conectar bloques
pipeline.Connect(fileSource.VideoOutput, sampleGrabber.Input);
pipeline.Connect(sampleGrabber.Output, nullRenderer.Input);
// iniciar el pipeline
await pipeline.StartAsync();
}
private void sampleGrabber_OnVideoFrameBuffer(object sender, VideoFrameXBufferEventArgs e)
{
// recibido nuevo frame de video
}
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Tee¶
El bloque tee divide el stream de datos de video o audio en múltiples streams que copian completamente el stream original.
Información del bloque¶
Nombre: TeeBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
| Salida | Igual a entrada | 2 o más |
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->TeeBlock;
TeeBlock-->VideoRendererBlock;
TeeBlock-->H264EncoderBlock;
H264EncoderBlock-->MP4SinkBlock; Constructor¶
TeeBlock(int numOfOutputs, MediaBlockPadMediaType mediaType, TeeQueueSettings queueSettings = null)
Parámetros:
numOfOutputs- El número inicial de pads de salida a crear (debe ser al menos 1).mediaType- El tipo de medio que manejará este tee (Video, Audio, o Auto).queueSettings- Ajustes opcionales de cola para controlar el comportamiento de buffering. Si es null, usa valores predeterminados de baja latencia.
Ajustes de cola¶
La clase TeeQueueSettings (namespace VisioForge.Core.Types.X.Special) controla el comportamiento de buffering para cada salida del tee. Por defecto, TeeBlock usa ajustes de baja latencia (1 buffer por cola) en lugar de los valores predeterminados de GStreamer (200 buffers).
Propiedades de TeeQueueSettings¶
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| MaxSizeBuffers | uint | 1 | Número máximo de buffers en la cola. Establecer a 0 para deshabilitar. Predeterminado GStreamer es 200. |
| MaxSizeBytes | uint | 0 | Máximo de bytes en cola. Establecer a 0 para deshabilitar. Predeterminado GStreamer es 10485760 (10 MB). |
| MaxSizeTime | ulong | 0 | Tiempo máximo en nanosegundos. Establecer a 0 para deshabilitar. Predeterminado GStreamer es 1000000000 (1 segundo). |
| MinThresholdBuffers | uint | 0 | Conteo mínimo de buffers antes de permitir lectura. |
| MinThresholdBytes | uint | 0 | Mínimo de bytes antes de permitir lectura. |
| MinThresholdTime | ulong | 0 | Tiempo mínimo en nanosegundos antes de permitir lectura. |
| Leaky | TeeQueueLeaky | No | Dónde la cola pierde datos cuando está llena (No, Upstream, o Downstream). |
| FlushOnEos | bool | false | Descartar todos los datos cuando se recibe EOS. |
| Silent | bool | true | Suprimir señales de cola para mejor rendimiento. |
Enum TeeQueueLeaky¶
| Valor | Descripción |
|---|---|
| No | Sin pérdida - la cola se bloquea cuando está llena. |
| Upstream | Pérdida en lado upstream (descarta buffers entrantes cuando está llena). |
| Downstream | Pérdida en lado downstream (descarta buffers antiguos cuando está llena). |
Métodos de fábrica¶
TeeQueueSettings.LowLatency()- Crea ajustes optimizados para latencia mínima (1 buffer, sin límites de bytes/tiempo). Este es el comportamiento predeterminado.TeeQueueSettings.GStreamerDefaults()- Crea ajustes que coinciden con los predeterminados de GStreamer (200 buffers, 10 MB, 1 segundo).
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var videoTee = new TeeBlock(2, MediaBlockPadMediaType.Video);
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var mp4Muxer = new MP4SinkBlock(new MP4SinkSettings(@"output.mp4"));
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(fileSource.VideoOutput, videoTee.Input);
pipeline.Connect(videoTee.Outputs[0], videoRenderer.Input);
pipeline.Connect(videoTee.Outputs[1], h264Encoder.Input);
pipeline.Connect(h264Encoder.Output, mp4Muxer.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Usando ajustes de cola personalizados¶
// Usar buffering predeterminado de GStreamer (mayor latencia, más buffering)
var gstreamerSettings = TeeQueueSettings.GStreamerDefaults();
var videoTee = new TeeBlock(2, MediaBlockPadMediaType.Video, gstreamerSettings);
// O crear ajustes personalizados
var customSettings = new TeeQueueSettings
{
MaxSizeBuffers = 50,
MaxSizeBytes = 5242880, // 5 MB
MaxSizeTime = 500000000, // 0.5 segundos
Leaky = TeeQueueLeaky.Downstream // Descartar buffers antiguos cuando está llena
};
var audioTee = new TeeBlock(3, MediaBlockPadMediaType.Audio, customSettings);
Aplicaciones de muestra¶
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Super MediaBlock¶
El Super MediaBlock permite combinar múltiples bloques en un solo bloque.
Información del bloque¶
Nombre: SuperMediaBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
| Salida | Cualquiera | 1 |
El pipeline de muestra¶
graph LR;
VirtualVideoSourceBlock-->SuperMediaBlock;
SuperMediaBlock-->NullRendererBlock; Dentro del SuperMediaBlock:
graph LR;
FishEyeBlock-->ColorEffectsBlock; Pipeline final:
graph LR;
VirtualVideoSourceBlock-->FishEyeBlock;
subgraph SuperMediaBlock
FishEyeBlock-->ColorEffectsBlock;
end
ColorEffectsBlock-->NullRendererBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var videoViewBlock = new VideoRendererBlock(pipeline, VideoView1);
var videoSource = new VirtualVideoSourceBlock(new VirtualVideoSourceSettings());
var colorEffectsBlock = new ColorEffectsBlock(VisioForge.Core.Types.X.VideoEffects.ColorEffectsPreset.Sepia);
var fishEyeBlock = new FishEyeBlock();
var superBlock = new SuperMediaBlock();
superBlock.Blocks.Add(fishEyeBlock);
superBlock.Blocks.Add(colorEffectsBlock);
superBlock.Configure(pipeline);
pipeline.Connect(videoSource.Output, superBlock.Input);
pipeline.Connect(superBlock.Output, videoViewBlock.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Bloque Encriptador¶
El bloque Encriptador cifra un stream de medios usando encriptación AES en tiempo real. Puede usarse para proteger video, audio o cualquier otro stream de datos antes de escribirlo en almacenamiento o enviarlo por la red.
Información del bloque¶
Nombre: EncryptorBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
| Salida | Cualquiera | 1 |
El pipeline de muestra¶
graph LR;
BasicFileSourceBlock-->EncryptorBlock;
EncryptorBlock-->FileSinkBlock; Constructor¶
EncryptorBlock(EncryptorDecryptorSettings settings)
Parámetros:
settings- La configuración de encriptación AES, incluyendo clave, vector de inicialización y tipo de cifrado.
Disponibilidad¶
Llame a EncryptorBlock.IsAvailable() para verificar el soporte de encriptación AES antes de crear una instancia.
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var settings = new EncryptorDecryptorSettings(
key: "1f9423681beb9a79215820f6bda73d0f",
iv: "e9aa8e834d8d70b7e0d254ff670dd718");
var fileSource = new BasicFileSourceBlock("input.mp4");
var encryptor = new EncryptorBlock(settings);
var fileSink = new FileSinkBlock("encrypted.bin", false);
pipeline.Connect(fileSource.Output, encryptor.Input);
pipeline.Connect(encryptor.Output, fileSink.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux.
Bloque Desencriptador¶
El bloque Desencriptador descifra un stream de medios cifrado con AES en tiempo real, restaurando los datos originales. La clave y el IV deben coincidir con los usados durante la encriptación. Para una solución completa de reproducción de archivos cifrados, considere usar el Bloque Reproductor Desencriptador.
Información del bloque¶
Nombre: DecryptorBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
| Salida | Cualquiera | 1 |
El pipeline de muestra¶
graph LR;
BasicFileSourceBlock-->DecryptorBlock;
DecryptorBlock-->QueueBlock;
QueueBlock-->DecodeBinBlock;
DecodeBinBlock-->VideoRendererBlock; Constructor¶
DecryptorBlock(EncryptorDecryptorSettings settings)
Parámetros:
settings- La configuración de desencriptación AES. La clave y el IV deben coincidir con los ajustes de encriptación.
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var settings = new EncryptorDecryptorSettings(
key: "1f9423681beb9a79215820f6bda73d0f",
iv: "e9aa8e834d8d70b7e0d254ff670dd718");
var fileSource = new BasicFileSourceBlock("encrypted.bin");
var decryptor = new DecryptorBlock(settings);
var queue = new QueueBlock();
var decodeBin = new DecodeBinBlock();
pipeline.Connect(fileSource.Output, decryptor.Input);
pipeline.Connect(decryptor.Output, queue.Input);
pipeline.Connect(queue.Output, decodeBin.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(decodeBin.VideoOutput, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux.
Bloque Reproductor Desencriptador¶
El bloque Reproductor Desencriptador es un bloque fuente compuesto que combina lectura de archivo, desencriptación AES, cola y decodificación en un único bloque fácil de usar. No tiene pad de entrada externo — lee y descifra el archivo internamente. Conecte sus pads de salida directamente a renderizadores o bloques de procesamiento adicionales.
Pipeline interno: BasicFileSourceBlock → DecryptorBlock → QueueBlock → DecodeBinBlock
Información del bloque¶
Nombre: DecryptorPlayerBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Salida de video | Video sin comprimir | 1 |
| Salida de audio | Audio sin comprimir | 1 |
| Salida de subtítulos | Datos de subtítulos | 1 (opcional) |
El pipeline de muestra¶
graph LR;
DecryptorPlayerBlock-->VideoRendererBlock;
DecryptorPlayerBlock-->AudioRendererBlock; Constructor¶
DecryptorPlayerBlock(MediaBlocksPipeline pipeline, string filename, string key, string iv,
bool renderVideo = true, bool renderAudio = true, bool renderSubtitle = false)
Parámetros:
pipeline- La instancia del pipeline padre.filename- Ruta al archivo de medios cifrado con AES.key- Clave de encriptación como cadena hexadecimal (32 caracteres para AES-128, 64 para AES-256).iv- Vector de inicialización como cadena hexadecimal (siempre 32 caracteres hex / 16 bytes).renderVideo- Si exponer el pad de salida de video. Predeterminado:true.renderAudio- Si exponer el pad de salida de audio. Predeterminado:true.renderSubtitle- Si exponer el pad de salida de subtítulos. Predeterminado:false.
Pads de salida¶
VideoOutput- Frames de video decodificados (disponible cuandorenderVideoestrue).AudioOutput- Muestras de audio decodificadas (disponible cuandorenderAudioestrue).SubtitleOutput- Datos de subtítulos decodificados (disponible cuandorenderSubtitleestrue).
Disponibilidad¶
Llame a DecryptorPlayerBlock.IsAvailable() para verificar el soporte de desencriptación antes de crear una instancia.
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var decryptorPlayer = new DecryptorPlayerBlock(
pipeline,
filename: "encrypted.bin",
key: "1f9423681beb9a79215820f6bda73d0f",
iv: "e9aa8e834d8d70b7e0d254ff670dd718");
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
var audioRenderer = new AudioRendererBlock();
pipeline.Connect(decryptorPlayer.VideoOutput, videoRenderer.Input);
pipeline.Connect(decryptorPlayer.AudioOutput, audioRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux.
Bloque Encriptador SRTP¶
El bloque Encriptador SRTP cifra streams RTP usando SRTP (Protocolo de Transporte en Tiempo Real Seguro) según se define en RFC 3711. Proporciona confidencialidad, autenticación de mensajes y protección contra reproducción para streams de medios en tiempo real como videoconferencias o transmisiones en vivo.
Información del bloque¶
Nombre: SRTPEncryptorBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | RTP | 1 |
| Salida | SRTP | 1 |
El pipeline de muestra¶
graph LR;
RTPSourceBlock-->SRTPEncryptorBlock;
SRTPEncryptorBlock-->RTPSinkBlock; Constructor¶
SRTPEncryptorBlock(SRTPSettings settings)
Parámetros:
settings- Configuración de encriptación SRTP incluyendo clave maestra, suite de cifrado y método de autenticación.
Disponibilidad¶
Llame a SRTPEncryptorBlock.IsAvailable() para verificar el soporte SRTP antes de crear una instancia.
Código de muestra¶
var settings = new SRTPSettings("000102030405060708090A0B0C0D0E0F")
{
Cipher = SRTPCipher.AES_128_ICM,
Auth = SRTPAuth.HMAC_SHA1_80
};
var encryptor = new SRTPEncryptorBlock(settings);
Plataformas¶
Windows, macOS, Linux.
Bloque Desencriptador SRTP¶
El bloque Desencriptador SRTP descifra streams RTP cifrados con SRTP de vuelta a RTP en texto plano. Los ajustes deben coincidir con los usados por el encriptador. También verifica las etiquetas de autenticación de mensajes y proporciona protección contra ataques de reproducción.
Información del bloque¶
Nombre: SRTPDecryptorBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | SRTP | 1 |
| Salida | RTP | 1 |
El pipeline de muestra¶
graph LR;
NetworkSourceBlock-->SRTPDecryptorBlock;
SRTPDecryptorBlock-->RTPDecoderBlock; Constructor¶
SRTPDecryptorBlock(SRTPSettings settings)
Parámetros:
settings- Configuración de desencriptación SRTP. Debe coincidir con los ajustes de encriptación usados en el lado del emisor.
Disponibilidad¶
Llame a SRTPDecryptorBlock.IsAvailable() para verificar el soporte SRTP antes de crear una instancia.
Código de muestra¶
var settings = new SRTPSettings("000102030405060708090A0B0C0D0E0F");
var decryptor = new SRTPDecryptorBlock(settings);
Plataformas¶
Windows, macOS, Linux.
SRTPSettings¶
La clase SRTPSettings proporciona configuración para operaciones de encriptación y desencriptación SRTP.
Propiedades¶
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| Key | string | — | Clave maestra como cadena hex. 32 caracteres hex (16 bytes) para AES-128-ICM; 64 caracteres hex (32 bytes) para AES-256-ICM. |
| Cipher | SRTPCipher | AES_128_ICM | Algoritmo de encriptación. |
| Auth | SRTPAuth | HMAC_SHA1_80 | Método de autenticación. |
| SSRC | uint | 0 | Identificador de Fuente de Sincronización RTP. Use 0 para coincidir con cualquier SSRC. |
Constructores¶
SRTPSettings()- Crea ajustes con cifrado AES-128-ICM y autenticación HMAC-SHA1-80.SRTPSettings(string key)- Crea ajustes con la clave maestra especificada y valores predeterminados.
Plataformas¶
Windows, macOS, Linux.
SRTPCipher¶
El enum SRTPCipher define los algoritmos de encriptación disponibles para SRTP.
Valores del Enum¶
NULL- Sin encriptación. Solo proporciona autenticación.AES_128_ICM- AES-128 en Modo Contador Entero. Opción más común; requiere una clave de 16 bytes (32 caracteres hex).AES_256_ICM- AES-256 en Modo Contador Entero. Seguridad máxima; requiere una clave de 32 bytes (64 caracteres hex).
Plataformas¶
Windows, macOS, Linux.
SRTPAuth¶
El enum SRTPAuth define los métodos de autenticación de mensajes disponibles para SRTP.
Valores del Enum¶
NULL- Sin autenticación. No recomendado para uso en producción.HMAC_SHA1_80- HMAC-SHA1 con etiqueta de autenticación de 80 bits. Recomendado para la mayoría de las aplicaciones.HMAC_SHA1_32- HMAC-SHA1 con etiqueta de autenticación de 32 bits. Menor sobrecarga de ancho de banda para redes con restricciones.
Plataformas¶
Windows, macOS, Linux.
AESCipher¶
El enum AESCipher define los tipos de cifrados AES que pueden usarse. (Fuente: VisioForge.Core/Types/X/Special/AESCipher.cs)
Valores del Enum¶
AES_128: Clave de cifrado AES 128-bit usando método CBC.AES_256: Clave de cifrado AES 256-bit usando método CBC.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
EncryptorDecryptorSettings¶
La clase EncryptorDecryptorSettings contiene ajustes para operaciones de encriptación y desencriptación. (Fuente: VisioForge.Core/Types/X/Special/EncryptorDecryptorSettings.cs)
Propiedades¶
Cipher(AESCipher): Obtiene o establece el tipo de cifrado AES. PredeterminadoAES_128.Key(string): Obtiene o establece la clave de encriptación.IV(string): Obtiene o establece el vector de inicialización (16 bytes como hex).SerializeIV(bool): Obtiene o establece un valor indicando si serializar el IV.
Constructor¶
EncryptorDecryptorSettings(string key, string iv): Inicializa una nueva instancia con la clave y vector de inicialización dados.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
CustomMediaBlockPad¶
La clase CustomMediaBlockPad define información para un pad dentro de un CustomMediaBlock. (Fuente: VisioForge.Core/Types/X/Special/CustomMediaBlockPad.cs)
Propiedades¶
Direction(MediaBlockPadDirection): Obtiene o establece la dirección del pad (entrada/salida).MediaType(MediaBlockPadMediaType): Obtiene o establece el tipo de medio del pad (ej. Audio, Video).CustomCaps(Gst.Caps): Obtiene o establece capacidades GStreamer personalizadas para un pad de salida.
Constructor¶
CustomMediaBlockPad(MediaBlockPadDirection direction, MediaBlockPadMediaType mediaType): Inicializa una nueva instancia con la dirección y tipo de medio especificados.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
CustomMediaBlockSettings¶
La clase CustomMediaBlockSettings proporciona ajustes para configurar un bloque de medios personalizado, potencialmente envolviendo elementos GStreamer. (Fuente: VisioForge.Core/Types/X/Special/CustomMediaBlockSettings.cs)
Propiedades¶
ElementName(string): Obtiene el nombre del elemento GStreamer o elemento SDK Media Blocks. Para crear un Bin GStreamer personalizado, incluir corchetes, ej."[ videotestsrc ! videoconvert ]".UsePadAddedEvent(bool): Obtiene o establece un valor indicando si usar el eventopad-addedpara pads GStreamer creados dinámicamente.ElementParams(Dictionary<string, object>): Obtiene los parámetros para el elemento.Pads(List<CustomMediaBlockPad>): Obtiene la lista de definicionesCustomMediaBlockPadpara el bloque.ListProperties(bool): Obtiene o establece un valor indicando si listar propiedades del elemento a la ventana Debug después de creación. Predeterminadofalse.
Constructor¶
CustomMediaBlockSettings(string elementName): Inicializa una nueva instancia con el nombre de elemento especificado.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
InputSelectorSyncMode¶
El enum InputSelectorSyncMode define cómo un selector de entrada (usado por SourceSwitchSettings) sincroniza buffers cuando está en modo sync-streams. (Fuente: VisioForge.Core/Types/X/Special/SourceSwitchSettings.cs)
Valores del Enum¶
ActiveSegment(0): Sincronizar usando el segmento activo actual.Clock(1): Sincronizar usando el reloj.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
SourceSwitchSettings¶
La clase SourceSwitchSettings configura un bloque que puede cambiar entre múltiples fuentes de entrada. (Fuente: VisioForge.Core/Types/X/Special/SourceSwitchSettings.cs)
El resumen "Representa el pad sink activo actualmente" del código podría ser ligeramente engañoso o incompleto para el nombre de clase SourceSwitchSettings. Las propiedades sugieren que es para configurar un conmutador de fuente.
Propiedades¶
PadsCount(int): Obtiene o establece el número de pads de entrada. Predeterminado2.DefaultActivePad(int): Obtiene o establece el pad sink inicialmente activo.CacheBuffers(bool): Obtiene o establece si el pad activo almacena en caché buffers para evitar perder frames cuando se reactiva. Predeterminadofalse.DropBackwards(bool): Obtiene o establece si descartar buffers que van hacia atrás relativo al último buffer de salida pre-conmutación. Predeterminadofalse.SyncMode(InputSelectorSyncMode): Obtiene o establece cómo el selector de entrada sincroniza buffers en modosync-streams. PredeterminadoInputSelectorSyncMode.ActiveSegment.SyncStreams(bool): Obtiene o establece si todos los streams inactivos serán sincronizados al tiempo de ejecución del stream activo o al reloj actual. Predeterminadotrue.CustomName(string): Obtiene o establece un nombre personalizado para logging. Predeterminado"SourceSwitch".
Constructor¶
SourceSwitchSettings(int padsCount = 2): Inicializa una nueva instancia, opcionalmente especificando el número de pads.
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Bloque Queue¶
El bloque Queue proporciona buffering entre elementos del pipeline para suavizar variaciones de procesamiento y habilitar flujo de datos asíncrono.
Información del bloque¶
Nombre: QueueBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | 1 |
| Salida | cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var queue = new QueueBlock();
pipeline.Connect(fileSource.VideoOutput, queue.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(queue.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Bloque MultiQueue¶
El bloque MultiQueue proporciona buffering sincronizado para múltiples streams, esencial para mantener sincronía A/V en pipelines complejos.
Información del bloque¶
Nombre: MultiQueueBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | múltiple |
| Salida | cualquiera | múltiple |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var multiqueue = new MultiQueueBlock();
var videoInput = multiqueue.CreateNewInput(MediaBlockPadMediaType.Video);
var audioInput = multiqueue.CreateNewInput(MediaBlockPadMediaType.Audio);
pipeline.Connect(fileSource.VideoOutput, videoInput);
pipeline.Connect(fileSource.AudioOutput, audioInput);
// Conectar salidas a codificadores/renderizadores
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Source Switch¶
El bloque SourceSwitch permite cambio dinámico entre múltiples fuentes de entrada sin interrumpir el pipeline.
Información del bloque¶
Nombre: SourceSwitchBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | múltiple |
| Salida | cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var source1 = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("video1.mp4")));
var source2 = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("video2.mp4")));
var switchSettings = new SourceSwitchSettings(2) { DefaultActivePad = 0 };
var sourceSwitch = new SourceSwitchBlock(switchSettings);
pipeline.Connect(source1.VideoOutput, sourceSwitch.Input);
pipeline.Connect(source2.VideoOutput, sourceSwitch.CreateNewInput(MediaBlockPadMediaType.Video));
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(sourceSwitch.Output, videoRenderer.Input);
await pipeline.StartAsync();
// Cambiar a segunda fuente
sourceSwitch.SetActivePad(1);
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Universal Decoder¶
El bloque UniversalDecoder detecta y decodifica automáticamente diversos formatos de audio y video comprimidos.
Información del bloque¶
Nombre: UniversalDecoderBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | medio comprimido | 1 |
| Salida | medio sin comprimir | múltiple |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var decoder = new UniversalDecoderBlock();
pipeline.Connect(fileSource.VideoOutput, decoder.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(decoder.VideoOutput, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Universal Demux Decoder¶
El bloque UniversalDemuxDecoder combina demuxing y decodificación en un solo bloque para construcción simplificada de pipeline.
Información del bloque¶
Nombre: UniversalDemuxDecoderBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | formato contenedor | 1 |
| Salida de video | video sin comprimir | 1 |
| Salida de audio | audio sin comprimir | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var demuxDecoder = new UniversalDemuxDecoderBlock("test.mp4");
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(demuxDecoder.VideoOutput, videoRenderer.Input);
var audioRenderer = new AudioRendererBlock();
pipeline.Connect(demuxDecoder.AudioOutput, audioRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Barcode Detector¶
El bloque BarcodeDetector detecta y decodifica diversos formatos de códigos de barras (códigos QR, DataMatrix, Code128, EAN-13, y más) en streams de video en tiempo real.
Para una guía completa con ejemplos multiplataforma, consulte la Guía de Escáner de Códigos de Barras y QR.
Información del bloque¶
Nombre: BarcodeDetectorBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | video sin comprimir | 1 |
| Salida | video sin comprimir | 1 (modo InputOutput) o 0 (modo InputOnly) |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var videoSource = new SystemVideoSourceBlock(videoSettings);
var barcodeDetector = new BarcodeDetectorBlock(BarcodeDetectorMode.InputOutput);
barcodeDetector.OnBarcodeDetected += (sender, args) =>
{
Console.WriteLine($"Código de barras detectado: {args.BarcodeType} - {args.Value}");
};
pipeline.Connect(videoSource.Output, barcodeDetector.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(barcodeDetector.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
DataMatrix Decoder¶
El bloque DataMatrixDecoder detecta y decodifica códigos de barras 2D DataMatrix en streams de video.
Información del bloque¶
Nombre: DataMatrixDecoderBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | video sin comprimir | 1 |
| Salida | video sin comprimir | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var videoSource = new SystemVideoSourceBlock(videoSettings);
var dataMatrixDecoder = new DataMatrixDecoderBlock();
dataMatrixDecoder.OnDataMatrixDetected += (sender, args) =>
{
Console.WriteLine($"DataMatrix detectado: {args.Data}");
};
pipeline.Connect(videoSource.Output, dataMatrixDecoder.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(dataMatrixDecoder.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Frame Doubler¶
El bloque FrameDoubler duplica frames de video para aumentar la tasa de frames efectiva.
Información del bloque¶
Nombre: FrameDoublerBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | video sin comprimir | 1 |
| Salida | video sin comprimir | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var frameDoubler = new FrameDoublerBlock();
pipeline.Connect(fileSource.VideoOutput, frameDoubler.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(frameDoubler.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Video Enhancement¶
El bloque VideoEnhancement aplica mejora y upscaling de video basado en IA.
Información del bloque¶
Nombre: VideoEnhancementBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | video sin comprimir | 1 |
| Salida | video sin comprimir | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var enhancementSettings = new VideoEnhancementSettings
{
UpscaleFactor = 2,
DenoiseStrength = 0.5
};
var enhancement = new VideoEnhancementBlock(enhancementSettings);
pipeline.Connect(fileSource.VideoOutput, enhancement.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(enhancement.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux (requiere modelos IA apropiados).
Decode Bin¶
El bloque DecodeBin selecciona y gestiona automáticamente decodificadores apropiados para streams de medios.
Información del bloque¶
Nombre: DecodeBinBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | medio comprimido | 1 |
| Salida | medio sin comprimir | dinámico |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var decodeBin = new DecodeBinBlock();
pipeline.Connect(fileSource.VideoOutput, decodeBin.Input);
// DecodeBin creará pads de salida dinámicamente a medida que se descubran streams
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Parse Bin¶
El bloque ParseBin analiza automáticamente streams de medios y expone streams elementales.
Información del bloque¶
Nombre: ParseBinBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | medio comprimido | 1 |
| Salida | streams analizados | dinámico |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var parseBin = new ParseBinBlock();
pipeline.Connect(fileSource.VideoOutput, parseBin.Input);
// ParseBin creará pads de salida para cada stream descubierto
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Custom Transform¶
El bloque CustomTransform permite integración de lógica de transformación personalizada en el pipeline.
Información del bloque¶
Nombre: CustomTransformBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | 1 |
| Salida | cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var customSettings = new CustomTransformSettings
{
ElementName = "videoscale", // Nombre de elemento GStreamer
Properties = new Dictionary<string, object>
{
{ "method", 0 }
}
};
var customTransform = new CustomTransformBlock(customSettings);
pipeline.Connect(fileSource.VideoOutput, customTransform.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(customTransform.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Data Sample Grabber¶
El bloque DataSampleGrabber intercepta y proporciona acceso a buffers de datos fluyendo a través del pipeline.
Información del bloque¶
Nombre: DataSampleGrabberBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | 1 |
| Salida | cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var dataSG = new DataSampleGrabberBlock();
dataSG.OnDataBuffer += (sender, args) =>
{
// Procesar datos del buffer
var bufferSize = args.BufferSize;
var bufferData = args.BufferData;
};
pipeline.Connect(fileSource.VideoOutput, dataSG.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(dataSG.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Debug Timestamp¶
El bloque DebugTimestamp registra información detallada de timestamp para depuración de problemas de sincronización.
Información del bloque¶
Nombre: DebugTimestampBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | 1 |
| Salida | cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var debugTimestamp = new DebugTimestampBlock();
pipeline.Connect(fileSource.VideoOutput, debugTimestamp.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(debugTimestamp.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Data Processor¶
El bloque DataProcessor proporciona capacidades de procesamiento de datos personalizadas para formatos de datos no estándar.
Información del bloque¶
Nombre: DataProcessorBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | cualquiera | 1 |
| Salida | cualquiera | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var dataSource = new CustomDataSource();
var dataProcessor = new DataProcessorBlock();
pipeline.Connect(dataSource.Output, dataProcessor.Input);
// Procesar y reenviar datos
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Espacio de Color Personalizado¶
El CustomColorspaceXBlock convierte video sin procesar de RGB a YV12 (YUV 4:2:0 planar) usando un plugin de GStreamer en C# integrado. La conversión aplica coeficientes ITU-R BT.601 con promediado de bloque 2×2 para submuestreo de croma.
Las propiedades opcionales Width, Height y FrameRate restringen la negociación de caps; déjelas sin configurar para negociación automática. Los valores de ancho y alto deben ser números pares.
CustomColorspaceXBlock.IsAvailable() siempre devuelve true — el plugin está implementado en código administrado y no requiere ninguna dependencia externa de GStreamer.
Información del bloque¶
Nombre: CustomColorspaceXBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | video/x-raw (RGB) | 1 |
| Salida | video/x-raw (YV12) | 1 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var colorspace = new CustomColorspaceXBlock(width: 1280, height: 720);
pipeline.Connect(fileSource.VideoOutput, colorspace.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(colorspace.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Sincronización en Vivo¶
El LiveSyncBlock envuelve el elemento GStreamer livesync para mantener un pipeline en vivo en tiempo real. Descarta los fotogramas que llegan tarde y duplica el último fotograma cuando la fuente se detiene, manteniendo una salida en tiempo real fluida sin bloqueos del pipeline. Se admiten tanto flujos de audio como de video.
Use este bloque en pipelines de transmisión en vivo o captura para absorber el jitter de temporización de fuentes de red o hardware.
Información del bloque¶
Nombre: LiveSyncBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Cualquiera | 1 |
| Salida | Cualquiera | 1 |
Disponibilidad¶
LiveSyncBlock.IsAvailable() devuelve true si el elemento GStreamer livesync está presente.
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var rtmpSettings = await RTMPSourceSettings.CreateAsync(new Uri("rtmp://example.com/live/stream"));
var rtmpSource = new RTMPSourceBlock(rtmpSettings);
var liveSync = new LiveSyncBlock();
pipeline.Connect(rtmpSource.VideoOutput, liveSync.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(liveSync.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux.
Custom Media Block¶
El CustomMediaBlock es un puente flexible entre la capa de abstracción de MediaBlocks y los elementos GStreamer sin procesar. Puede envolver cualquier elemento GStreamer por nombre de fábrica o una descripción de pipeline bin, siendo útil para integrar plugins de terceros, elementos experimentales o funcionalidades aún no cubiertas por una clase MediaBlocks dedicada.
La configuración y tipos de pads asociados (CustomMediaBlockSettings, CustomMediaBlockPad) están documentados en las secciones CustomMediaBlockSettings y CustomMediaBlockPad anteriores.
Información del bloque¶
Nombre: CustomMediaBlock.
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada | Definida por configuración | 0…N |
| Salida | Definida por configuración | 0…N |
Características principales¶
- Envolver cualquier elemento GStreamer por nombre (p. ej.,
"videoscale") o como descripción bin (p. ej.,"[ videoscale ! videoconvert ]"). - Establecer propiedades del elemento mediante el diccionario
ElementParamsantes de iniciar el pipeline. - Recibir el
Gst.Elementsin procesar mediante el eventoOnElementAddedpara configuración adicional. - Usar
UsePadAddedEvent = truepara elementos con pads dinámicos (p. ej., demuxers). - Aplicar filtros de caps opcionales en pads de salida mediante
CustomMediaBlockPad.CustomCaps.
Eventos¶
OnElementAdded— se dispara inmediatamente después de que el elemento GStreamer es creado y añadido al pipeline, permitiendo configuración directa de propiedades o señales en el elemento nativo.
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->CustomMediaBlock;
CustomMediaBlock-->VideoRendererBlock; Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
// Envolver el elemento GStreamer videoscale con una propiedad
var settings = new CustomMediaBlockSettings("videoscale");
settings.ElementParams["method"] = 0; // vecino más cercano
settings.Pads.Add(new CustomMediaBlockPad(MediaBlockPadDirection.In, MediaBlockPadMediaType.Video));
settings.Pads.Add(new CustomMediaBlockPad(MediaBlockPadDirection.Out, MediaBlockPadMediaType.Video));
var customBlock = new CustomMediaBlock(settings);
customBlock.OnElementAdded += (sender, element) =>
{
// Configuración adicional del elemento después de su creación
};
pipeline.Connect(fileSource.VideoOutput, customBlock.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(customBlock.Output, videoRenderer.Input);
await pipeline.StartAsync();
Ejemplo con descripción bin¶
// Envolver un pipeline multi-elemento de GStreamer como un solo bloque
var settings = new CustomMediaBlockSettings("[ videoscale ! videoconvert ]");
settings.Pads.Add(new CustomMediaBlockPad(MediaBlockPadDirection.In, MediaBlockPadMediaType.Video));
settings.Pads.Add(new CustomMediaBlockPad(MediaBlockPadDirection.Out, MediaBlockPadMediaType.Video));
var customBlock = new CustomMediaBlock(settings);
Plataformas¶
Windows, macOS, Linux, iOS, Android.
Universal Transform Block¶
El UniversalTransformBlock es una clase base abstracta para implementar transformaciones personalizadas de fotogramas de video en código C# administrado. Soporta transformaciones de 1:N fotogramas: un único fotograma de entrada puede producir cero, uno o múltiples fotogramas de salida, habilitando casos de uso como eliminación de fotogramas, duplicación, división o conversión de formato.
Cree una subclase de UniversalTransformBlock, proporcione cadenas de caps GStreamer para entrada y salida, y sobreescriba OnTransformFrame para implementar la lógica de transformación.
Información del bloque¶
Nombre: (subclase definida por el usuario).
| Dirección del pin | Tipo de medio | Conteo de pines |
|---|---|---|
| Entrada de video | Video sin comprimir | 1 |
| Salida de video | Video sin comprimir | 1 |
Constructor (protegido)¶
protected UniversalTransformBlock(string inputCaps, string outputCaps)
Parámetros:
inputCaps— cadena de caps GStreamer que describe el formato de entrada aceptado (p. ej.,"video/x-raw,format=RGB,width=1920,height=1080,framerate=30/1").outputCaps— cadena de caps GStreamer que describe el formato de salida producido.
Método abstracto a sobreescribir¶
protected abstract List<Gst.Buffer> OnTransformFrame(
Gst.Buffer inputBuffer,
Gst.Caps inputCaps,
Gst.Caps outputCaps);
Semántica del valor de retorno:
- Lista vacía — eliminar el fotograma (no se produce salida).
- Un buffer — transformación estándar 1:1.
- Múltiples buffers — transformación 1:N (p. ej., duplicación o división de fotogramas).
Métodos auxiliares¶
CreateBuffer(byte[] data, ulong pts, ulong dts, ulong duration)— crea unGst.Bufferdesde un array de bytes administrado.GetVideoInfo(Caps caps, out string format, out int width, out int height, out int frameRateNum, out int frameRateDen)— analiza formato de video, dimensiones y tasa de fotogramas desde un objeto caps.
El pipeline de muestra¶
graph LR;
UniversalSourceBlock-->CustomTransformBlock;
CustomTransformBlock-->VideoRendererBlock; Código de muestra¶
// Definir una transformación personalizada: invertir cada fotograma (RGB → RGB)
public class InvertTransformBlock : UniversalTransformBlock
{
public InvertTransformBlock()
: base(
inputCaps: "video/x-raw,format=RGB",
outputCaps: "video/x-raw,format=RGB")
{
}
protected override List<Gst.Buffer> OnTransformFrame(
Gst.Buffer inputBuffer,
Gst.Caps inputCaps,
Gst.Caps outputCaps)
{
// Mapear el buffer de entrada, invertir píxeles, retornar nuevo buffer
using var map = inputBuffer.Map(Gst.MapFlags.Read);
var data = map.Data.ToArray();
for (int i = 0; i < data.Length; i++)
data[i] = (byte)(255 - data[i]);
var output = CreateBuffer(data, inputBuffer.Pts, inputBuffer.Dts, inputBuffer.Duration);
return new List<Gst.Buffer> { output };
}
}
// Usar en un pipeline
var pipeline = new MediaBlocksPipeline();
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("test.mp4")));
var transform = new InvertTransformBlock();
pipeline.Connect(fileSource.VideoOutput, transform.Input);
var videoRenderer = new VideoRendererBlock(pipeline, VideoView1);
pipeline.Connect(transform.Output, videoRenderer.Input);
await pipeline.StartAsync();
Plataformas¶
Windows, macOS, Linux, iOS, Android.