• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            In my way

            On my way

            常用鏈接

            統計

            最新評論

            How To Play a File use DirectShow?


            DirectShow application always performs the same basic steps:
            1. Create an instance of the Filter Graph Manager.
            2. Use the Filter Graph Manager to build a filter graph.
            3. Run the graph, causing data to move through the filters.

            Start by calling CoInitialize to initialize the COM library:

            HRESULT hr = CoInitialize(NULL);
            if (FAILED(hr))
            {
            // Add error-handling code here. (Omitted for clarity.)
            }
            

            To keep things simple, this example ignores the return value, but you should always check the HRESULT value from any method call.

            Next, call CoCreateInstance to create the Filter Graph Manager:

            IGraphBuilder *pGraph;
            HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
            CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
            

            As shown, the class identifier (CLSID) is CLSID_FilterGraph. The Filter Graph Manager is provided by an in-process DLL, so the execution context is CLSCTX_INPROC_SERVER. DirectShow supports the free-threading model, so you can also call CoInitializeEx with the COINIT_MULTITHREADED flag.

            The call to CoCreateInstance returns the IGraphBuilder interface, which mostly contains methods for building the filter graph. Two other interfaces are needed for this example:

            • IMediaControl controls streaming. It contains methods for stopping and starting the graph.
            • IMediaEvent has methods for getting events from the Filter Graph Manager. In this example, the interface is used to wait for playback to complete.

            Both of these interfaces are exposed by the Filter Graph Manager. Use the returned IGraphBuilder pointer to query for them:

            IMediaControl *pControl;
            IMediaEvent   *pEvent;
            hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
            hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
            

            Now you can build the filter graph. For file playback, this is done by a single method call:

            hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);
            

            The IGraphBuilder::RenderFile method builds a filter graph that can play the specified file. The first parameter is the file name, represented as a wide character (2-byte) string. The second parameter is reserved and must equal NULL.

            This method can fail if the specified file does not exist, or the file format is not recognized. Assuming that the method succeeds, however, the filter graph is now ready for playback. To run the graph, call the IMediaControl::Run method:

            hr = pControl->Run();
            

            When the filter graph runs, data moves through the filters and is rendered as video and audio. Playback occurs on a separate thread. You can wait for playback to complete by calling the IMediaEvent::WaitForCompletion method:

            long evCode = 0;
            pEvent->WaitForCompletion(INFINITE, &evCode);
            

            This method blocks until the file is done playing, or until the specified time-out interval elapses. The value INFINITE means the application blocks indefinitely until the file is done playing. For a more realistic example of event handling, see Responding to Events.

            When the application is finished, release the interface pointers and close the COM library:

            pControl->Release();
            pEvent->Release();
            pGraph->Release();
            CoUninitialize();
            

            Sample Code

            Here is the complete code for the example described in this article:



            #include 
            <dshow.h>
            void main(void)
            {
                IGraphBuilder 
            *pGraph = NULL;
                IMediaControl 
            *pControl = NULL;
                IMediaEvent   
            *pEvent = NULL;

                
            // Initialize the COM library.
                HRESULT hr = CoInitialize(NULL);
                
            if (FAILED(hr))
                
            {
                    printf(
            "ERROR - Could not initialize COM library");
                    
            return;
                }


                
            // Create the filter graph manager and query for interfaces.
                hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                                    IID_IGraphBuilder, (
            void **)&pGraph);
                
            if (FAILED(hr))
                
            {
                    printf(
            "ERROR - Could not create the Filter Graph Manager.");
                    
            return;
                }


                hr 
            = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
                hr 
            = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

                
            // Build the graph. IMPORTANT: Change this string to a file on your system.
                hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);
                
            if (SUCCEEDED(hr))
                
            {
                    
            // Run the graph.
                    hr = pControl->Run();
                    
            if (SUCCEEDED(hr))
                    
            {
                        
            // Wait for completion.
                        long evCode;
                        pEvent
            ->WaitForCompletion(INFINITE, &evCode);

                        
            // Note: Do not use INFINITE in a real application, because it
                        
            // can block indefinitely.
                    }

                }

                pControl
            ->Release();
                pEvent
            ->Release();
                pGraph
            ->Release();
                CoUninitialize();
            }



            posted on 2009-04-09 10:26 谷主 閱讀(549) 評論(0)  編輯 收藏 引用

            日本欧美国产精品第一页久久| 国产L精品国产亚洲区久久 | 久久精品国产亚洲AV无码娇色| 亚洲va中文字幕无码久久不卡| 香蕉久久夜色精品升级完成| 久久免费视频观看| 激情五月综合综合久久69| 亚洲精品无码久久久久AV麻豆| 日产精品久久久久久久| 99久久成人18免费网站| 亚洲国产天堂久久久久久| 久久99精品久久久久久动态图| 欧美成a人片免费看久久| 青草国产精品久久久久久| 久久久WWW免费人成精品| 久久夜色精品国产噜噜亚洲AV| 久久国产精品二国产精品| 久久综合噜噜激激的五月天| 久久天天躁狠狠躁夜夜不卡| 狠狠色丁香婷婷久久综合不卡| 一本色道久久88精品综合| 国内精品欧美久久精品| 99精品国产在热久久无毒不卡| 狠狠色综合网站久久久久久久高清 | 精品综合久久久久久97超人| 久久精品极品盛宴观看| 久久99热国产这有精品| 亚洲国产一成人久久精品| 香蕉99久久国产综合精品宅男自 | 996久久国产精品线观看| 一个色综合久久| 久久精品中文字幕有码| 国产福利电影一区二区三区,免费久久久久久久精| 久久男人AV资源网站| 大香网伊人久久综合网2020| 亚洲AV无码久久精品成人| 狠狠色婷婷久久综合频道日韩 | 久久精品国产亚洲麻豆| 久久99精品久久久久久久不卡| 亚洲伊人久久精品影院| 亚洲国产精品无码久久98|