DirectShow.NET を使用していますが、カスタムの字幕を表示するビデオ プレーヤーを作成する必要があります。
私のコードはサンプルの Capture.cs に基づいており、関連する部分は次のとおりです。
private void SetupGraph(string FileName, Control hWin)
{
int hr;
ISampleGrabber m_sampGrabber = null;
IGraphBuilder gb = null;
// Get the graphbuilder object
m_FilterGraph = new FilterGraph() as IFilterGraph2;
gb = m_FilterGraph as IGraphBuilder;
// Get a ICaptureGraphBuilder2 to help build the graph
ICaptureGraphBuilder2 icgb2 = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
try
{
// Link the ICaptureGraphBuilder2 to the IFilterGraph2
hr = icgb2.SetFiltergraph(gb);
DsError.ThrowExceptionForHR(hr);
// Add the filters necessary to render the file. This function will
// work with a number of different file types.
IBaseFilter sourceFilter = null;
hr = gb.AddSourceFilter(FileName, FileName, out sourceFilter);
DsError.ThrowExceptionForHR(hr);
// Get the SampleGrabber interface
m_sampGrabber = (ISampleGrabber)new SampleGrabber();
IBaseFilter baseGrabFlt = (IBaseFilter)m_sampGrabber;
// Configure the Sample Grabber
ConfigureSampleGrabber(m_sampGrabber);
// Add it to the filter
hr = gb.AddFilter(baseGrabFlt, "Ds.NET Grabber");
DsError.ThrowExceptionForHR(hr);
hr = gb.RenderFile(FileName, null);
DsError.ThrowExceptionForHR(hr);
// Configure the Video Window
IVideoWindow videoWindow = gb as IVideoWindow;
ConfigureVideoWindow(videoWindow, hWin);
// Connect the pieces together, use the default renderer
hr = icgb2.RenderStream(null, null, sourceFilter, baseGrabFlt, null);
DsError.ThrowExceptionForHR(hr);
// Now that the graph is built, read the dimensions of the bitmaps we'll be getting
SaveSizeInfo(m_sampGrabber);
// Configure the Video Window
videoWindow = gb as IVideoWindow;
ConfigureVideoWindow(videoWindow, hWin);
hr = videoWindow.put_MessageDrain(hWin.FindForm().Handle);
}
...
ご覧のとおり、現在 2 つのビデオを再生しています。1 つは RenderFile() で開いて音声を入れ、もう 1 つは RenderStream で字幕を付けられるようにします (したがって、2 つの videoWindow 構成)。
これは明らかに最適なソリューションではありませんが、RenderStream を介してオーディオを取得する方法はわかりません。