• <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)  編輯 收藏 引用

            久久久WWW成人免费精品| 亚洲国产精品一区二区久久| 久久久久这里只有精品| 久久亚洲国产成人影院网站| 亚洲午夜精品久久久久久app| 久久久久久精品免费免费自慰| 奇米影视7777久久精品| 91精品免费久久久久久久久| 开心久久婷婷综合中文字幕| 伊人久久久AV老熟妇色| 日韩亚洲欧美久久久www综合网| 深夜久久AAAAA级毛片免费看| 色婷婷综合久久久中文字幕| 国产毛片久久久久久国产毛片| 久久精品国产久精国产果冻传媒 | 精品久久久久中文字幕日本| 99久久人人爽亚洲精品美女| 伊人久久五月天| 久久香蕉国产线看观看乱码| 久久午夜无码鲁丝片秋霞| 91精品无码久久久久久五月天| 丁香色欲久久久久久综合网| 久久精品国产国产精品四凭| 97超级碰碰碰久久久久| 久久久国产打桩机| 久久天天躁狠狠躁夜夜躁2014| 国产激情久久久久影院老熟女免费| 日韩精品久久无码人妻中文字幕 | 精品久久人妻av中文字幕| 久久精品无码一区二区WWW| 久久强奷乱码老熟女网站| 久久国产精品二国产精品| 伊人久久大香线蕉精品| 久久99国内精品自在现线| 久久久久人妻一区精品色| 亚洲中文久久精品无码| 亚洲愉拍99热成人精品热久久| 97久久婷婷五月综合色d啪蜜芽| 99久久国产综合精品女同图片| 欧美激情一区二区久久久| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 |