2025-08-07 18:34:45 +08:00
|
|
|
using DirectShowLib;
|
|
|
|
using System;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
namespace DualScreenDemo.Services
|
|
|
|
{
|
2025-08-08 16:42:15 +08:00
|
|
|
public class MediaServicePrimary : Video
|
2025-08-07 18:34:45 +08:00
|
|
|
{
|
|
|
|
IGraphBuilder graphBuilder;
|
|
|
|
IBaseFilter lavSplitter;
|
|
|
|
IBaseFilter lavVideoDecoder;
|
2025-08-11 17:36:01 +08:00
|
|
|
public IBaseFilter videoRenderer;
|
2025-08-07 18:34:45 +08:00
|
|
|
IMediaControl mediaControl;
|
2025-08-08 16:42:15 +08:00
|
|
|
IBaseFilter sourceFilter;
|
|
|
|
public MediaServicePrimary() { }
|
2025-08-07 18:34:45 +08:00
|
|
|
|
2025-08-11 17:36:01 +08:00
|
|
|
public int Run() => (mediaControl != null) ? mediaControl.Run() : 0;
|
|
|
|
public int Stop() => (mediaControl != null)? mediaControl.Stop() : 0;
|
|
|
|
public int Pause() => (mediaControl != null) ? mediaControl.Pause() : 0;
|
2025-08-07 18:34:45 +08:00
|
|
|
|
|
|
|
public void StopAndReleaseResources()
|
|
|
|
{
|
|
|
|
if (mediaControl != null)
|
|
|
|
{
|
|
|
|
mediaControl.Stop();
|
|
|
|
SafeRelease(ref mediaControl);
|
|
|
|
}
|
|
|
|
SafeRelease(ref videoRenderer);
|
|
|
|
SafeRelease(ref sourceFilter);
|
|
|
|
SafeRelease(ref lavVideoDecoder);
|
|
|
|
SafeRelease(ref lavSplitter);
|
|
|
|
SafeRelease(ref graphBuilder);
|
|
|
|
}
|
|
|
|
|
2025-08-11 17:36:01 +08:00
|
|
|
public void RenderMediaFile(string filePath)
|
2025-08-07 18:34:45 +08:00
|
|
|
{
|
|
|
|
StopAndReleaseResources();
|
2025-08-11 17:36:01 +08:00
|
|
|
|
2025-08-07 18:34:45 +08:00
|
|
|
|
|
|
|
int hr;
|
|
|
|
graphBuilder = (IGraphBuilder)new FilterGraph();
|
|
|
|
if (graphBuilder == null)
|
|
|
|
throw new Exception("Failed to create FilterGraph for primary monitor.");
|
|
|
|
|
|
|
|
graphBuilder.AddSourceFilter(filePath, "Source", out sourceFilter);
|
|
|
|
try
|
|
|
|
{
|
|
|
|
lavSplitter = AddFilterByClsid(graphBuilder, "LAV Splitter", Clsid.LAVSplitter);
|
|
|
|
lavVideoDecoder = AddFilterByClsid(graphBuilder, "LAV Video Decoder", Clsid.LAVVideoDecoder);
|
|
|
|
videoRenderer = AddFilterByClsid(graphBuilder, "Primary Video Renderer", Clsid.VideoRenderer);
|
|
|
|
hr = graphBuilder.AddFilter(videoRenderer, "Primary Video Renderer");
|
|
|
|
DsError.ThrowExceptionForHR(hr);
|
2025-08-11 17:58:19 +08:00
|
|
|
mediaControl = (IMediaControl)graphBuilder;
|
2025-08-07 18:34:45 +08:00
|
|
|
|
|
|
|
hr = ConnectFilters(graphBuilder, sourceFilter, "Output", lavSplitter, "Input");
|
|
|
|
DsError.ThrowExceptionForHR(hr);
|
|
|
|
hr = ConnectFilters(graphBuilder, lavSplitter, "Video", lavVideoDecoder, "Input");
|
|
|
|
DsError.ThrowExceptionForHR(hr);
|
|
|
|
hr = ConnectFilters(graphBuilder, lavVideoDecoder, "Output", videoRenderer, "VMR Input0");
|
|
|
|
DsError.ThrowExceptionForHR(hr);
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
|
|
|
Console.WriteLine("Error initializing graph builder for primary monitor: " + ex.Message);
|
|
|
|
}
|
|
|
|
}
|
2025-08-08 16:42:15 +08:00
|
|
|
|
2025-08-07 18:34:45 +08:00
|
|
|
}
|
|
|
|
}
|