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;
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);
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();
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.
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 en streams de video.
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 |
Código de muestra¶
var pipeline = new MediaBlocksPipeline();
var videoSource = new SystemVideoSourceBlock(videoSettings);
var barcodeDetector = new BarcodeDetectorBlock();
barcodeDetector.OnBarcodeDetected += (sender, args) =>
{
Console.WriteLine($"Código de barras detectado: {args.Type} - {args.Data}");
};
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.