zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SpringMVC详解
    java设计模式
    运行时异常与一般异常区别
    oracle基本操作大全
    get post 区别
    hibernate
    Spring框架
    http和https
    JDBC详解
    (转)Entity Framework4.1实现动态多条件查询、分页和排序
  • 原文地址:https://www.cnblogs.com/yangwujun/p/3320438.html
Copyright © 2011-2022 走看看