# Custom Format Output Using DirectShow Filters

Video Capture SDK .Net Video Edit SDK .Net

VideoCaptureCore VideoEditCore

This guide explains how to implement custom format output using DirectShow filters in VisioForge's .NET SDKs. The techniques described here work with both the Video Capture SDK .NET and Video Edit SDK .NET.

# Introduction

DirectShow filters enable you to create custom output formats for your video applications. The CustomOutput class serves as the foundation for configuring these custom output settings. While the examples in this guide use the VideoCaptureCore class, Video Edit SDK .NET users can apply the same principles using the VideoEditCore class instead.

To begin working with custom output, initialize the CustomOutput class:

var customOutput = new CustomOutput();

# Implementation Approaches

There are two main approaches to implementing custom format output:

  1. Using Three Independent Filters
  2. Using a Single All-in-One Filter

# Approach 1: Three Independent Filters

This approach separates the processing pipeline into three distinct components:

  • Audio codec
  • Video codec
  • Multiplexer

You can use either DirectShow filters or standard codecs for the audio and video components. Here's how to implement this approach:

# Step 1: Retrieve Available Codecs

First, populate your interface with available audio and video codecs:

// Get video codecs
foreach (string codec in VideoCapture1.Video_Codecs)
{
    cbCustomVideoCodecs.Items.Add(codec);
}

// Get audio codecs
foreach (string codec in VideoCapture1.Audio_Codecs)
{
    cbCustomAudioCodecs.Items.Add(codec);
}

// Get DirectShow filters
foreach (string directShowFilter in VideoCapture1.DirectShow_Filters)
{
    cbCustomDSFilterA.Items.Add(directShowFilter);
    cbCustomDSFilterV.Items.Add(directShowFilter);
    cbCustomMuxer.Items.Add(directShowFilter);
    cbCustomFilewriter.Items.Add(directShowFilter);
}

# Step 2: Configure Filter Selection

Set up the video and audio processing pipeline based on user selections:

// Configure video codec
if (rbCustomUseVideoCodecsCat.Checked)
{
    customOutput.Video_Codec = cbCustomVideoCodecs.Text;
    customOutput.Video_Codec_UseFiltersCategory = false;
}
else
{
    customOutput.Video_Codec = cbCustomDSFilterV.Text;
    customOutput.Video_Codec_UseFiltersCategory = true;
}

// Configure audio codec
if (rbCustomUseAudioCodecsCat.Checked)
{
    customOutput.Audio_Codec = cbCustomAudioCodecs.Text;
    customOutput.Audio_Codec_UseFiltersCategory = false;
}
else
{
    customOutput.Audio_Codec = cbCustomDSFilterA.Text;
    customOutput.Audio_Codec_UseFiltersCategory = true;
}

// Configure multiplexer
customOutput.MuxFilter_Name = cbCustomMuxer.Text;
customOutput.MuxFilter_IsEncoder = false;

# Step 3: Set Up Custom File Writer (Optional)

If your implementation requires a special file writer:

customOutput.SpecialFileWriter_Needed = cbUseSpecialFilewriter.Checked;
customOutput.SpecialFileWriter_FilterName = cbCustomFilewriter.Text;

# Approach 2: Single All-in-One Filter

This approach uses a single filter that combines the multiplexer, video codec, and audio codec. The system can automatically detect whether the filter:

  • Can write files independently
  • Requires the standard File Writer filter
  • Needs a special filter

Implementation steps:

// Get available DirectShow filters
foreach (string directShowFilter in VideoCapture1.DirectShow_Filters)
{
    cbCustomDSFilterA.Items.Add(directShowFilter);
    cbCustomDSFilterV.Items.Add(directShowFilter);
    cbCustomMuxer.Items.Add(directShowFilter);
    cbCustomFilewriter.Items.Add(directShowFilter);
}

// Configure multiplexer
customOutput.MuxFilter_Name = cbCustomMuxer.Text;
customOutput.MuxFilter_IsEncoder = true;

// Set up custom file writer if needed
customOutput.SpecialFileWriter_Needed = cbUseSpecialFilewriter.Checked;
customOutput.SpecialFileWriter_FilterName = cbCustomFilewriter.Text;

# Using the Settings Dialog

For a more user-friendly approach, you can utilize the CustomFormatSettingsDialog:

CustomFormatSettingsDialog customFormatSettingsDialog = new CustomFormatSettingsDialog(
    VideoCapture1.Video_Codecs.ToArray(),
    VideoCapture1.Audio_Codecs.ToArray(),
    VideoCapture1.DirectShow_Filters.ToArray());
customFormatSettingsDialog.SaveSettings(ref customOutput);

# Implementing the Output

After configuring your custom format settings, follow these steps to implement the output:

// Apply custom format settings
VideoCapture1.Output_Format = customOutput;

// Configure capture mode and output file
VideoCapture1.Mode = VideoCaptureMode.VideoCapture;
VideoCapture1.Output_Filename = "output.mp4";

// Start the capture process
await VideoCapture1.StartAsync();

# Required Redistributables

Ensure you have the appropriate redistributable packages installed:

Video Capture SDK .Net:

Video Edit SDK .Net:


Visit our GitHub page to get more code samples.