DirectShow

1 最简单的DirectShow应用程序 — 播放视频

1.简介
DirectShowDirectX中的一套处理媒体播放、音视频采集的开发包,在DirectX SDK Summer 2004(DirectX9.0C SDK的第一个版本,下载地址:http://download.microsoft.com/download/7/e/9/7e9f48c6-f28a-469b-9b8e-cc84032efbd4/
dxsdk_sum2004.exe
)之前的DirectX SDK中都包含有DirectShow SDK,之后的DirectShow SDKExtras的形式单独发布。
2.下载安装
这里使用了DirectX9.0b,下载地址为:
假设DirectX SDK安装在D:DXSDK目录下,开发环境使用VC++6.0
 
在这个版本的DirectX SDK中,DirectShow SDK的库文件STRMBASE.lib需要自己编译,位置在:D:DXSDKSamplesC++DirectShowBaseClasses目录下。
 
3.设置VC++6.0环境
添加D:DXSDKIncludeInclude files目录列表中。
 
4.最简单的DirectShow应用程序 - 播放视频文件
#include <windows.h>
 
#include <DShow.h>
#pragma comment(lib,"Strmiids.lib")
 
int __stdcall WinMain(
                     HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nShowCmd )
{
    //本例来自DirectX SDKHow To Play a File
    IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;
   
    // 初始化COM.
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        MessageBox(NULL,"ERROR - Could not initialize COM library",
       
"Warning",MB_OK|MB_ICONWARNING);
        return -1;
    }
   
    // Create the filter graph manager and query for interfaces.
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
        IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        MessageBox(NULL,"ERROR - Could not create the Filter Graph Manager.",
            "Warning",MB_OK|MB_ICONWARNING);
        return -1;
    }
   
    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"E:\Movie\2012\[2012].2012.2009.R5-CD2-人人影视.rmvb", NULL);
    if (SUCCEEDED(hr))
    {
        // Run the graph.
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            // Wait for completion.
            longevCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);
        }
    }
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
 
    CoUninitialize();
 
    return 0;
}
 
2 DirectShow原理
DirectShow使用Filter Graph模型来管理整个数据流的处理过程,它是一系列Filter构成的一条流水线,其中的每个Filter都是COM组件。
 
Filter主要有几个大类:
a.Filter:负责读取数据;
b.转换Filter:负责转换数据的格式,常见的视频解码器就是转换Filter
c.渲染Filter:负责输出数据,如播放或存盘操作。
 
每个Filter都有一个或几个引脚,各个Filter通过这些引脚相连形成一个Filter Graph
DirectX9.0 SDK中提供了一个工具GraphEdit,它可以演示Filter之间的连接关系,并执行这个Filter Graph
下面用GraphEdit来展示一个rmvb文件的播放过程:

真正开发的时候,其实就是把这个图用代码描述出来。

文章转自C++学习视频资料:http://blog.sina.com.cn/s/blog_4d8205e40100q4h2.html

原文地址:https://www.cnblogs.com/yangwujun/p/3320438.html