• <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

            常用鏈接

            統(tǒng)計

            最新評論

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


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            午夜人妻久久久久久久久| 久久99精品久久久久子伦| 久久国产亚洲精品| 亚洲女久久久噜噜噜熟女| 久久九九亚洲精品| 精品一二三区久久aaa片| 久久香蕉超碰97国产精品| 久久国产视屏| 99久久久国产精品免费无卡顿| 久久精品无码免费不卡| 国产91色综合久久免费| 亚洲熟妇无码另类久久久| 久久996热精品xxxx| 国产精品久久久久jk制服| 久久精品国产免费观看 | 2021国内精品久久久久久影院| 久久水蜜桃亚洲av无码精品麻豆 | 亚洲中文字幕无码久久2020| 久久国产免费直播| 99久久亚洲综合精品成人| 久久夜色精品国产噜噜亚洲AV| 一本久久免费视频| 久久精品国产精品亜洲毛片| 久久久91精品国产一区二区三区| 熟妇人妻久久中文字幕| 偷偷做久久久久网站| 亚洲国产香蕉人人爽成AV片久久| 久久国产精品二国产精品| 欧美久久综合性欧美| 久久噜噜电影你懂的| 久久免费高清视频| 伊人久久大香线蕉影院95| a级毛片无码兔费真人久久 | 色偷偷88888欧美精品久久久| 97久久国产综合精品女不卡 | 国产Av激情久久无码天堂| 久久久一本精品99久久精品66| 久久午夜无码鲁丝片| 国产精品18久久久久久vr| 久久精品国产99久久久香蕉| 亚洲欧洲久久av|