2

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 を介してオーディオを取得する方法はわかりません。

4

0 に答える 0