#
Special blocks
#
Introduction
Special blocks are blocks that do not fit into any other category.
#
Null Renderer
The null renderer block sends the data to null. This block may be required if your block has outputs you do not want to use.
#
Block info
Name: NullRendererBlock.
#
The sample pipeline
The sample pipeline is shown below. It reads a file and sends the video data to the video samples grabber, where you can grab each video frame after decoding. The Null renderer block is used to end the pipeline.
graph LR; UniversalSourceBlock-->VideoSampleGrabberBlock; VideoSampleGrabberBlock-->NullRendererBlock;
#
Sample code
private void Start()
{
// create the pipeline
var pipeline = new MediaBlocksPipeline();
// create universal source block
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
// create video sample grabber block and add the event handler
var sampleGrabber = new VideoSampleGrabberBlock();
sampleGrabber.OnVideoFrameBuffer += sampleGrabber_OnVideoFrameBuffer;
// create null renderer block
var nullRenderer = new NullRendererBlock();
// connect blocks
pipeline.Connect(fileSource.VideoOutput, sampleGrabber.Input);
pipeline.Connect(sampleGrabber.Output, nullRenderer.Input);
// start the pipeline
await pipeline.StartAsync();
}
private void sampleGrabber_OnVideoFrameBuffer(object sender, VideoFrameXBufferEventArgs e)
{
// received new video frame
}
#
Platforms
Windows, macOS, Linux, iOS, Android.
#
Tee
The tee block splits the video or audio data stream into multiple streams that completely copy the original stream.
#
Block info
Name: TeeBlock.
#
The sample pipeline
graph LR; UniversalSourceBlock-->TeeBlock; TeeBlock-->VideoRendererBlock; TeeBlock-->H264EncoderBlock; H264EncoderBlock-->MP4SinkBlock;
#
Sample code
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();
#
Sample applications
#
Platforms
Windows, macOS, Linux, iOS, Android.
#
Super MediaBlock
The Super MediaBlock allows you to combine multiple blocks into a single block.
#
Block info
Name: SuperMediaBlock.
#
The sample pipeline
graph LR; VirtualVideoSourceBlock-->SuperMediaBlock; SuperMediaBlock-->NullRendererBlock;
Inside the SuperMediaBlock:
graph LR; FishEyeBlock-->ColorEffectsBlock;
Final pipeline:
graph LR; VirtualVideoSourceBlock-->FishEyeBlock; subgraph SuperMediaBlock FishEyeBlock-->ColorEffectsBlock; end ColorEffectsBlock-->NullRendererBlock;
#
Sample code
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();
#
Platforms
Windows, macOS, Linux, iOS, Android.