最简单的DirectShow应用程序(转载)

转自:http://blog.sina.com.cn/s/blog_4d8205e40100q4gw.html

正文:

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

1.简介
DirectShow是DirectX中的一套处理媒体播放、音视频采集的开发包,在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 SDK以Extras的形式单独发布。
2.下载安装
这里使用了DirectX9.0b,下载地址为:
假设DirectX SDK安装在D:\DXSDK目录下,开发环境使用VC++6.0。
 
在这个版本的DirectX SDK中,DirectShow SDK的库文件STRMBASE.lib需要自己编译,位置在:D:\DXSDK\Samples\C++\DirectShow\BaseClasses目录下。
 
3.设置VC++6.0环境
添加D:\DXSDK\Include到Include 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 SDK:How 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 文件的播放过程:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值