• <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 谷主 閱讀(543) 評論(0)  編輯 收藏 引用

            久久亚洲欧洲国产综合| 精品无码久久久久久午夜| 91麻精品国产91久久久久| 狠狠人妻久久久久久综合| 国产精品一区二区久久精品涩爱| 精品综合久久久久久88小说| 色欲综合久久躁天天躁| 婷婷久久久亚洲欧洲日产国码AV | 久久福利青草精品资源站| 亚洲AV伊人久久青青草原| 久久久久黑人强伦姧人妻| 久久99国产精品成人欧美| 国产成人无码精品久久久免费 | 国产免费福利体检区久久| 91亚洲国产成人久久精品网址| 国产欧美久久久精品| 色综合久久精品中文字幕首页| 国产精品久久久久久久久久影院| 四虎国产精品成人免费久久| 免费精品国产日韩热久久| 久久久噜噜噜www成人网| 成人精品一区二区久久| 无码人妻少妇久久中文字幕| 亚洲欧美伊人久久综合一区二区| 69SEX久久精品国产麻豆| 国内精品久久久久久久久电影网| 香蕉久久夜色精品国产尤物| 久久99精品国产自在现线小黄鸭| 7国产欧美日韩综合天堂中文久久久久| 久久AⅤ人妻少妇嫩草影院| 77777亚洲午夜久久多喷| 一本伊大人香蕉久久网手机| 久久综合九色欧美综合狠狠 | 久久综合久久综合九色| 97香蕉久久夜色精品国产 | 亚洲精品高清久久| 久久精品国产亚洲av麻豆蜜芽| 嫩草影院久久国产精品| 伊人久久大香线焦AV综合影院| 国产成人久久精品二区三区| 激情伊人五月天久久综合|