﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-书呆子 的 notepad-随笔分类-文件、图形与多媒体</title><link>http://www.cppblog.com/GUO/category/13956.html</link><description>   look to the master,
    follow the master,
    walk with the master,
    see through the master,
    become the master.</description><language>zh-cn</language><lastBuildDate>Tue, 07 Sep 2010 00:30:51 GMT</lastBuildDate><pubDate>Tue, 07 Sep 2010 00:30:51 GMT</pubDate><ttl>60</ttl><item><title>DirectShow开发基础( 三 )------DirectShow中的事件通知机制</title><link>http://www.cppblog.com/GUO/archive/2010/09/06/125473.html</link><dc:creator>书呆子</dc:creator><author>书呆子</author><pubDate>Sun, 05 Sep 2010 16:57:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/06/125473.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125473.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/06/125473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125473.html</trackback:ping><description><![CDATA[<span style="color: #20ff00; background-color: #020000;">事件通知机制</span><br>&nbsp;&nbsp;&nbsp; DirectShow中的事件通知类似于Windows中的消息队列机制。各种滤波器、滤波器链表管理器等都是通过事件通知的方式和应用程序交互、通信的。比如媒体的运行、暂停或停止状态，滤波器发送相应的事件给应用程序，以便我们做相关的处理，如打开文件、显示或重启播放等。<br><span style="color: #20ff00; background-color: #020000;">检索事件</span><br>&nbsp;&nbsp;&nbsp; 滤波器链表管理器暴露了3个接口用来处理事件通知。<br>
<ul>
    <li>IMediaEventSink:滤波器用这个接口来发布事件。</li>
    <li>IMediaEvent：应用程序用这个接口来从队列中检索事件。</li>
    <li>IMediaEventEx：IMediaEvent的继承和扩展。<br></li>
</ul>
&nbsp;&nbsp;&nbsp; 滤波器都是通过调用链表管理器的IMediaEventSink::Notify方法来通知图表管理器某种事件的发生。<br>&nbsp;&nbsp;&nbsp; 应用程序通过调用图表管理器的IMediaEvent::GetEvent方法来从事件队列中获取事件。<br>&nbsp;&nbsp;&nbsp; 为了重载滤波器链表管理器对事件的默认处理，可以使用某个事件码作为参数来调用IMediaEvent::CancelDefaultHandling，这样就可以屏蔽图表管理器对某个事件友的默认处理。<br>&nbsp;&nbsp;&nbsp; 如果要恢复，则调用IMediaEvent::RestoreDefaultHandling。<br>&nbsp;&nbsp;&nbsp; 如果图表管理器没有对某个事件码默认处理，则调用这两个函数也起不了作用。<br><br><span style="color: #20ff00; background-color: #020000;">分析事件</span><br>&nbsp;&nbsp;&nbsp; 为了处理DirectShow事件，链表管理器提供了两种方法来获取正在队列中等待的事件。<br>
<ul>
    <li>窗口通知，链表管理器发送开发者自己预定义的窗口消息到应用程序窗口。</li>
    <li>事件信息，如果队列中有DirectShow事件，链表管理器就用事件信号通知应用程序，如果队列为空就重新复位事件信号。</li>
</ul>
<br><br>  <img src ="http://www.cppblog.com/GUO/aggbug/125473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">书呆子</a> 2010-09-06 00:57 <a href="http://www.cppblog.com/GUO/archive/2010/09/06/125473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectShow开发基础( 二 )------简单的DirectShow程序</title><link>http://www.cppblog.com/GUO/archive/2010/08/31/125235.html</link><dc:creator>书呆子</dc:creator><author>书呆子</author><pubDate>Mon, 30 Aug 2010 17:00:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/31/125235.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125235.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/31/125235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125235.html</trackback:ping><description><![CDATA[编写一个DirectShow应用程序大体需要3个步骤<br>
<ol>
    <li>创建一个Filter Graph Manager的实例</li>
    <li>使用Filter Graph Manager创建一个filter graph，此时需要必备的filter</li>
    <li>使用Filter Graph Manager控制filter graph和通过这些filter的流，在这个过程中，应用程序会收到Filter Graph Manager发送的事件</li>
</ol>
&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/guo/directshowApp.jpg" border="0"> <br>&nbsp; 完成上述几步后，最后需要释放这个Filter Graph Manager和所有的Filter资源。<br>示例(头文件和库文件已在安装vs2008时配置好了，在$(FrameworkSDKDir)include,即C:\Program Files\Microsoft SDKs\Windows\v6.0A里)： &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">stdafx.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">DShow.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">引入DirectShow头文件</span><span style="color: #008000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">引入DirectShow库文件,这里采用从源程序引入，也可以配置开发环境来引入</span><span style="color: #008000;"><br></span><span style="color: #000000;"></span><span style="color: #000000;">#pragma&nbsp;comment(lib,</span><span style="color: #000000;">"</span><span style="color: #000000;">strmiids.lib</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp; </span><span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_tmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;IGraphBuilder&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pGraph&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">图表管理器接口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;IMediaControl&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pControl&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">媒体控制接口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;IMediaEvent&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pEvent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">媒体事件接口<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化COM库</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CoInitialize(NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(FAILED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR&nbsp;-&nbsp;Could&nbsp;not&nbsp;initialize&nbsp;COM&nbsp;library.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建滤波器链表管理器</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pGraph);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(FAILED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR&nbsp;-&nbsp;Could&nbsp;not&nbsp;create&nbsp;the&nbsp;Filter&nbsp;Graph&nbsp;Manager.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查询媒体控制和媒体事件接口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pGraph</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">QueryInterface(IID_IMediaControl,(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pControl);<br>&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pGraph</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">QueryInterface(IID_IMediaEvent,(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pEvent);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">建立链表</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pGraph&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">RenderFile(L</span><span style="color: #000000;">"</span><span style="color: #000000;">E:\\MicroMouse\\MicroMouse615走迷宫演示.WMV</span><span style="color: #000000;">"</span><span style="color: #000000;">,NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(SUCCEEDED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">运行链表</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pControl</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Run();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(SUCCEEDED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">等待回放结束事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;evCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">事件码</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEvent</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">WaitForCompletion(INFINITE,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">evCode);</span><span style="color: #008000;">//</span><span style="color: #008000;">无限时间的等待，直到媒体播放结束</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">释放所有资源和关闭COM库</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pControl</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;pEvent</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;pGraph</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
<br>         <img src ="http://www.cppblog.com/GUO/aggbug/125235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">书呆子</a> 2010-08-31 01:00 <a href="http://www.cppblog.com/GUO/archive/2010/08/31/125235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SceneLib图形库</title><link>http://www.cppblog.com/GUO/archive/2010/08/29/125102.html</link><dc:creator>书呆子</dc:creator><author>书呆子</author><pubDate>Sat, 28 Aug 2010 18:35:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/29/125102.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125102.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/29/125102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125102.html</trackback:ping><description><![CDATA[SceneLib:<br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib5.JPG" border="0"><br><br>C/C++的win32编程库，可以创建智能的图形窗口，以及标准的2D和基于 OpenGL的实时3D图形，不必在真实的WIN32窗口里进行任何WINDOWS编程去建立2D和3D图形.<br>如下：<br><a href="http://www.cppblog.com/Files/GUO/scenelib.JPG"></a><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib1.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib2.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib3.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib4.JPG" border="0"><br><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot.png" alt=""><br>     <img src ="http://www.cppblog.com/GUO/aggbug/125102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">书呆子</a> 2010-08-29 02:35 <a href="http://www.cppblog.com/GUO/archive/2010/08/29/125102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectShow开发基础( 一 )------DirectShow简介</title><link>http://www.cppblog.com/GUO/archive/2010/08/29/125100.html</link><dc:creator>书呆子</dc:creator><author>书呆子</author><pubDate>Sat, 28 Aug 2010 17:45:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/29/125100.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125100.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/29/125100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125100.html</trackback:ping><description><![CDATA[DirectShow：我们熟悉的 DirectX家族中的一个组件，主要针对程序员开发数字音/视频程序提供支持。<br>使用DirectShow可以在很短的时间内搭建自己的视频播放、捕获和编辑应用程序，不必对有关视频硬件如显卡、视频捕获设备、视频编码算法、解码算法、音/视频数据同步等复杂技术做细节的掌握。<br>一、DirectShow SDK<br>DirectX中的一个组件，DX是Microsoft为流媒体应用开发的一套基于Windows的API。<br>DX包括:<br>
<ol>
    <li>DirectX Graphics,集成了以前的DirectDraw和Direct3D技术；</li>
    <li>DirectDraw,主要负责2D加速，以实现对显卡内存和系统内存的直接操作；</li>
    <li>DirectInput，支持输入服务（包括鼠标、键盘、游戏杆等），同时支持输出设备；</li>
    <li>DirectPlay，提供多人网络游戏的通信、组织功能；</li>
    <li>DirectSetup，提供自动安装DirectX组件的API功能；</li>
    <li>DirectMusic，支持音频的捕获、回放功能；</li>
    <li>DirectSound，提供音频捕捉、回放、音效处理、硬件加速和直接设备访问等功能；</li>
    <li>DirectShow，在Windows平台上处理各种格式的媒体文件的回放、音/视频采集、非线性编辑等高性能要求的多媒 体应用，提供了完整的解决方案；</li>
    <li>DirectX Media Objects，DirectShow Filter的简化模型，提供更方便的媒体流数据处理方案。</li>
</ol>
<br>DirectShow SDK从VC++开发人员的角度来看是SDK，更直接点讲就是静态（LIB）、动态链接库（DLL）。从计算机专业角度来讲是COM组件，使用DirectShow开发的应用程序是COM组件的客户程序。<br><br>使用DirectShow能够完成以下工作：<br>
<ul>
    <li>音/视频多媒体的捕获和预览；</li>
    <li>支持多种多媒体格式ASF、MPEG、AVI、MP3、WAVE的回放；</li>
    <li>集成其它DX技术，增强音/视频硬件如声卡、显卡的性能；</li>
    <li>视频文件的回放、非线性编辑等；</li>
    <li>支持DVD、DV等设备；</li>
    <li>定制自己的Filter。</li>
</ul>
DirectX SDK 9.0以后的版本DirectShow被移出了DX，另DirectX 9.0C SDK并不包含DirectShow SDK，而DX 9.0B SDK（2003 年发布） 则包含。<br><br>使用DirectShow SDK开发用户自己的应用程序需要几个静态链接库quartz.lib、 strmbasd.lib、 strmbase.lib、 strmiids.lib。中间两个lib需要用户自己编译生成，而其它两个Microsoft已经提供。<br>
<table style="width: 632px; height: 166px;" border="1">
    <tbody>
        <tr>
            <td style="background-color: #020000;"><span style="color: #00ff0f; background-color: #020000;">库名</span><br></td>
            <td style="color: #00ff0f;"><span style="background-color: #020000;">功能说明</span></td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;strmiids.lib</td>
            <td valign="middle" align="left">&nbsp;定义了DirectShow标准的输出类标识（CLSID）和接口标识（IID）</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;strmbasd.lib</td>
            <td valign="middle" align="left">&nbsp;流媒体开发用到的库，Debug、Debug_Unicode版本</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;strmbase.lib</td>
            <td valign="middle" align="left">&nbsp;流媒体开发用到的库，Release、Release_Unicode版本</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;quartz.lib</td>
            <td valign="middle" align="left">&nbsp;定义了导出函数AMGetErrorText</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;winmm.lib</td>
            <td valign="middle" align="left">&nbsp;使用Windows多媒体编程用到的库</td>
        </tr>
    </tbody>
</table>
<br>DirectShow SDK系统框图<br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/directshownote1.jpg" border="0"><br><br>&nbsp;&nbsp;&nbsp; 源过滤器主要负责从文件、网络或各种WDM/VFW驱动模式的视频捕获设备、数字照相机DC、数字摄像机DV等获取数据<br>&nbsp;&nbsp;&nbsp; 变换过滤器主要负责数据格式的转换，例如我们常说的音/视频编/解码、数据流（音频和视频）的分离或合成、特定的处理如图像增强、滤波等<br>&nbsp;&nbsp;&nbsp; 提交过滤器主要负责数据的最终流向，送到显卡显示或声卡播放，把处理结束的最后结果存储到文件当中去<br><br>基于DirectShow SDK开发的应用程序通过&#8220;命令&#8221;(command)和&#8220;事件&#8221;(event)来与DirectShow通信。用户调用DirectShow的函数对DirectShow发命令如打开文件、枚举系统设备、采集音/视频、回放数据等，DirectShow根据设备和系统的状态以事件的方式通知应用程序。<br><br>       <img src ="http://www.cppblog.com/GUO/aggbug/125100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">书呆子</a> 2010-08-29 01:45 <a href="http://www.cppblog.com/GUO/archive/2010/08/29/125100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>INI文件</title><link>http://www.cppblog.com/GUO/archive/2010/06/01/116906.html</link><dc:creator>书呆子</dc:creator><author>书呆子</author><pubDate>Tue, 01 Jun 2010 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/06/01/116906.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/116906.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/06/01/116906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/116906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/116906.html</trackback:ping><description><![CDATA[<p>利用Windows系统提供的对.ini文件操作的API函数：<br><br>WritePrivateProfileString&nbsp;&nbsp;&nbsp;向.ini文件中写入指定节、指定键名的字符串信息<br>WritePrivateProfileSection<br>WritePrivateProfileStruct<br>GetPrivateProfileString&nbsp;&nbsp;&nbsp;从.ini文件中获取指定节、指定键名的字符串信息<br>GetPrivateProfileInt<br>GetPrivateProfileSection<br>GetPrivateProfileSectionNames<br>GetPrivateProfileStruct<br><br>&nbsp;MFC对话框工程 ，命名为PrivateString<br></p>
添加控件如下：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/guo/PrivateString1.png"><br>在OnInitDialog函数里添加如下代码，在程序开始运行时生成一个.ini文件，先在OnInitDialog定义前声明一个char buf[256]，用来保存list.ini的绝对路径：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">::GetCurrentDirectory(</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">,buf);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;strcat(buf,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\list.ini</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;handle</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CreateFile(buf,GENERIC_READ</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(handle</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br><img style="DISPLAY: inline" id=Codehighlighter1_203_229_Open_Image onclick="this.style.display='none'; Codehighlighter1_203_229_Open_Text.style.display='none'; Codehighlighter1_203_229_Closed_Image.style.display='inline'; Codehighlighter1_203_229_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_203_229_Closed_Image onclick="this.style.display='none'; Codehighlighter1_203_229_Closed_Text.style.display='none'; Codehighlighter1_203_229_Open_Image.style.display='inline'; Codehighlighter1_203_229_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_203_229_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="DISPLAY: inline" id=Codehighlighter1_203_229_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(handle);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>实现按钮事件：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CPrivateStringDlg::OnButton1()&nbsp;<br><img style="DISPLAY: inline" id=Codehighlighter1_37_332_Open_Image onclick="this.style.display='none'; Codehighlighter1_37_332_Open_Text.style.display='none'; Codehighlighter1_37_332_Closed_Image.style.display='inline'; Codehighlighter1_37_332_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_37_332_Closed_Image onclick="this.style.display='none'; Codehighlighter1_37_332_Closed_Text.style.display='none'; Codehighlighter1_37_332_Open_Image.style.display='inline'; Codehighlighter1_37_332_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_37_332_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="DISPLAY: inline" id=Codehighlighter1_37_332_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;edit1,edit2,edit3;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_EDIT1)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(edit1);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_EDIT2)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(edit2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_EDIT3)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(edit3);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;::WritePrivateProfileString(_T(edit1),_T(edit2),_T(edit3),_T(buf));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>
<img src ="http://www.cppblog.com/GUO/aggbug/116906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">书呆子</a> 2010-06-01 16:15 <a href="http://www.cppblog.com/GUO/archive/2010/06/01/116906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>