Method 1: LibVLCSharp.WinForms Implementation
LibVLCSharp offers a comperhensive wrapper for VLC media player capabilities in WinForms.
Required Packages
Install the LibVLCSharp.WinForms NuGet package and its associated native libraries.
Control Configurtaion
public class VlcStreamViewer : UserControl
{
private LibVLC _mediaCore;
private MediaPlayer _streamPlayer;
private VideoView _videoOutput;
public VlcStreamViewer()
{
if (!DesignMode)
{
Core.Initialize();
}
_mediaCore = new LibVLC();
_streamPlayer = new MediaPlayer(_mediaCore)
{
Volume = 0,
EnableHardwareDecoding = true
};
_videoOutput = new VideoView { Dock = DockStyle.Fill };
_videoOutput.MediaPlayer = _streamPlayer;
Controls.Add(_videoOutput);
Load += Viewer_Load;
Disposed += Viewer_Disposed;
}
private void Viewer_Load(object sender, EventArgs e)
{
DoubleBuffered = true;
}
private void Viewer_Disposed(object sender, EventArgs e)
{
_streamPlayer?.Stop();
_streamPlayer?.Dispose();
_mediaCore?.Dispose();
}
}
Stream Initialization
public void ConnectStream(string url)
{
var configOptions = new[]
{
"--no-audio",
"--file-caching=300",
"--live-caching=300",
"--network-caching=333",
"--avcodec-hw=any"
};
using (var media = new Media(_mediaCore, url, FromType.FromLocation, configOptions))
{
_streamPlayer.Play(media);
}
}
Disconnection
public void DisconnectStream()
{
if (_streamPlayer.IsPlaying)
{
_streamPlayer.Stop();
}
}
Method 2: Emgu.CV Itnegration
Emgu.CV provides OpenCV bindings for real-time video capture and processing.
Required Packages
Add Emgu.CV.UI and Emgu.CV.runtime.windows to your project via NuGet.
Display Setup
public class CvStreamPanel : UserControl
{
private ImageBox _previewBox;
private VideoCapture _captureDevice;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_previewBox = new ImageBox
{
SizeMode = PictureBoxSizeMode.Zoom,
Dock = DockStyle.Fill
};
Controls.Add(_previewBox);
DoubleBuffered = true;
}
}
Capture and Display
public void StartCapture(string rtspAddress)
{
_captureDevice = new VideoCapture(rtspAddress);
_captureDevice.ImageGrabbed += ProcessFrame;
_captureDevice.Start();
}
private void ProcessFrame(object sender, EventArgs e)
{
using (var retrievedFrame = new Mat())
{
if (_captureDevice.Retrieve(retrievedFrame) && !retrievedFrame.IsEmpty)
{
var displayImage = retrievedFrame.Clone();
Invoke(new Action(() =>
{
_previewBox.Image?.Dispose();
_previewBox.Image = displayImage;
}));
}
}
}
Capture Termination
public void StopCapture()
{
if (_captureDevice != null)
{
_captureDevice.ImageGrabbed -= ProcessFrame;
_captureDevice.Stop();
_captureDevice.Dispose();
_captureDevice = null;
}
}