﻿<?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++博客-kenlistian-随笔分类-directx</title><link>http://www.cppblog.com/kenlistian/category/9061.html</link><description>厚积薄发.
勤为桨,思为帆



</description><language>zh-cn</language><lastBuildDate>Sat, 14 Mar 2009 02:17:02 GMT</lastBuildDate><pubDate>Sat, 14 Mar 2009 02:17:02 GMT</pubDate><ttl>60</ttl><item><title>Filter知识点滴</title><link>http://www.cppblog.com/kenlistian/archive/2009/03/13/76502.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Fri, 13 Mar 2009 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/03/13/76502.html</guid><description><![CDATA[<p><a title=来自http://blog.cnii.com.cn/?75821/viewspace-19610.html的开发资料 href="http://blog.cnii.com.cn/?75821/viewspace-19610.html">来自http://blog.cnii.com.cn/?75821/viewspace-19610.html的开发filter介绍</a><br><br>&nbsp;<a title=札记 href="http://www.cppblog.com/Files/kenlistian/Filter_know1.pdf">pdf<br></a></p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/76502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-03-13 19:45 <a href="http://www.cppblog.com/kenlistian/archive/2009/03/13/76502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pin 连接内部处理</title><link>http://www.cppblog.com/kenlistian/archive/2009/03/09/76040.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 09 Mar 2009 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/03/09/76040.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/76040.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2009/03/09/76040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/76040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/76040.html</trackback:ping><description><![CDATA[<p>对于pin的连接过程,总结下.</p>
<p>&nbsp;&nbsp; 1.<br>&nbsp;&nbsp; 应用程序通过调用filter graph 管理器方法来连接filter.<br>&nbsp;&nbsp; 应用程序调用IFilterGraph::ConnectDirect <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IGraphBuilder::Connect来指定不同的filter直接连接，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也可用IGraphBuilder::RenderFile自动实现连接<br>&nbsp;&nbsp; 应用程序可以通过IFilterGraph::AddFilter将filter 添加graph中，<br>&nbsp;&nbsp; 当一个filter被添加到graph中时，filter图表管理器通过IBaseFilter::JoinFilterGraph来通知filter.</p>
<p>&nbsp;&nbsp; 这点说明, 不是filter的直接连接函数相互链接,而是在以上内部调用实现的.</p>
<p>&nbsp;&nbsp; 2. 考虑到以前描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterA ----&gt;FilterB<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的连接检查媒体类型 逻辑基本就是这样:</p>
<p>&nbsp;循环FilterA的输出pin,再循环FilterB的输入Pin媒体类型是否和pmt媒体类型<br>&nbsp;匹配</p>
<p>&nbsp;for (j = 0 ; j&lt;FilterB.PinIn.MediaTypeCount; j++)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FilterB.PinIn.MediaType[j] = pmt )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(FilterA.PinIn.ReceiveConnection(FilterA.PinOut, FilterB.MediaType[i]) = OK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i= 0; i&lt; FilterA.PinOut.MediaTypeCount; i++)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FilterA.PinOut.MediaType[i] 是否在FilterB.PinIn中是否支持)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FilterA.PinIn.ReceiveConnection(FilterA.PinOut, FilterA.MediaType[i]) = OK)<br>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp;}</p>
<p>&nbsp; 在实现上,调用次序以下过程:</p>
<p><br>filterGraph首先调用FilterA.PinOut::Connect().</p>
<p>FilterA.IPinOut::Connect()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原型:IPin::Connect(IPin* pReceivePin, const AM_MEDIA_TYPE * pmt)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该Connect参数为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pReceivePin 为 FilterB的输入Pin,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pmt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是FilterA的当前媒体类型.<br>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在内部调用(主要)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = AgreeMediaType(pReceivePin, pmt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查pReceivePin 有否pmt的媒体类型.</p>
<p>&nbsp; 有,则自然ok<br>&nbsp; 没有,失败,退出该函数.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则在AgreeMediaType做了以上逻辑循环.</p>
<p>&nbsp;&nbsp; <br>&nbsp;&nbsp; IPin::AgreeMediaType函数处理如下:<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.判断pmt 是否是完全媒体类型,是则按全媒体类型模式出来<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.非完全媒体类型<br>&nbsp;&nbsp;&nbsp; &nbsp;IPin::EnumMediaTypes(IEnumMediaTypes** pEnum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取枚举指针(指向Pin中的媒体类型集合).<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先枚举filterB的输入Pin的媒体类型的枚举集,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;调用TryMediaTypes 函数去判断是否匹配.<br>&nbsp;&nbsp;&nbsp; 还不匹配,取出FilterA的枚举类指针.再调用TryMediaTyes<br>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; IPin::TryMediaType()处理<br>&nbsp;&nbsp;&nbsp; 原型:<br>&nbsp;&nbsp; HRESULT CBasePin::TryMediaTypes(IPin*pReceivePin, const CMediaType*pmt, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IEnumMediaType *pEnum)</p>
<p>&nbsp;&nbsp;&nbsp; 在该函数处理:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (pmt in 所有该枚举集中的枚举媒体类型 )<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; AttemptConnect(pReceivePin, pmt)<br>&nbsp; }</p>
<p><br>&nbsp;&nbsp;&nbsp; 在AttemptConnection中调用<br>&nbsp;&nbsp;&nbsp; CBasePin::AttemptConnection(IPin* pReceivePin, const CMediaType*pmt)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查FilterA 的CheckConnect(pReceivePin)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterA的PInOut::CheckMediaType(pmt)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok,return<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterA的PinOut::SetMediaType(pmt)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pReceivePin-&gt;ReceiveConnection(...)&nbsp; (filterB 的PinIn)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok,return<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterA的PinOut::CompleteConnect(pReceivePin)<br></p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/76040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-03-09 22:36 <a href="http://www.cppblog.com/kenlistian/archive/2009/03/09/76040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个音频格式细节备记(混)</title><link>http://www.cppblog.com/kenlistian/archive/2009/01/05/71221.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 05 Jan 2009 06:16:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2009/01/05/71221.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/71221.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2009/01/05/71221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/71221.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/71221.html</trackback:ping><description><![CDATA[<p><br>几个格式细节备记(混)</p>
<p><br>typedef struct&#160; _MediaType {<br>&#160;&#160;&#160; GUID&#160;&#160;&#160;&#160;&#160; majortype;&#160; <br>&#160;&#160;&#160; GUID&#160;&#160;&#160;&#160;&#160; subtype;<br>&#160;&#160;&#160; BOOL&#160;&#160;&#160;&#160;&#160; bFixedSizeSamples;<br>&#160;&#160;&#160; BOOL&#160;&#160;&#160;&#160;&#160; bTemporalCompression;<br>&#160;&#160;&#160; ULONG&#160;&#160;&#160;&#160; lSampleSize;<br>&#160;&#160;&#160; GUID&#160;&#160;&#160;&#160;&#160; formattype;<br>&#160;&#160;&#160; IUnknown&#160; *pUnk;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //not use<br>&#160;&#160;&#160; ULONG&#160;&#160;&#160;&#160; cbFormat;<br>&#160;&#160;&#160; BYTE *pbFormat;<br>} AM_MEDIA_TYPE;</p>
<p>主要有<br>&#160;&#160; majortype&#160; 媒体类型大致说明<br>&#160;&#160; subtype&#160;&#160;&#160; 更一步的细致说明<br>&#160;&#160; formattype&#160; <br>&#160;&#160;&#160;&#160;&#160; 包括有以下：其对应的不同的数据格式<br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_None <br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_DvInfo <br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_MPEGVideo <br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_MPEG2Video<br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_VideoInfo <br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_VideoInfo2&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160; FORMAT_WaveFormatEx&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160; GUID_NULL </p>
<p>&#160; cbForamt成员指定了格式块pbFormat的大小.<br>&#160; pbFormat指针指向格式子块。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pbFormat是一个void*的指针，因为格式块会因为媒体类型 <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 的不同而有不同的指向。如音频填充的是WAVEFORMATEX结构<br>&#160;&#160;&#160;&#160; 数据.</p>
<p>&#160;&#160;&#160;&#160; 可以从中取出传来的数据格式。<br>&#160;&#160;&#160;&#160; </p>
<p>&#160;</p>
<p>//TWaveFormatEx 结构:<br>TWaveFormatEx = packed record<br>&#160; wFormatTag: Word;&#160;&#160;&#160;&#160;&#160;&#160; {指定格式类型; 默认 WAVE_FORMAT_PCM = 1;}<br>&#160; nChannels: Word;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {指出波形数据的通道数; 单声道为 1, 立体声为 2}<br>&#160; nSamplesPerSec: DWORD;&#160; {指定样本速率(每秒的样本数)}一般为8000<br>&#160; nAvgBytesPerSec: DWORD; {指定数据传输的平均速率(每秒的字节数)} 每秒的字节数: <br>&#160; nBlockAlign: Word;&#160;&#160;&#160;&#160;&#160; {指定块对齐(单位字节), 块对齐是数据的最小单位}<br>&#160; wBitsPerSample: Word;&#160;&#160; {采样大小(字节)}每个样本的BIT数目，一般为16<br>&#160; cbSize: Word;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {应该是该结构的大小}<br>end;</p>
<p>nChannels&#160;&#160;&#160;&#160;&#160;&#160; :&#160;&#160; 对于pcm,其nchannels不超过2,对于非pcm格式,则超过2.<br>nSamplesPerSec&#160; :&#160;&#160; 通常为8kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz. <br>nAvgBytesPerSec :&#160;&#160; 每秒传送字节数 = nSamplesPerSec * nBlockAlign<br>nBlockAlign&#160;&#160;&#160;&#160; :&#160;&#160; 对齐字节&#160; = nChannels * wBitsPerSample / 8<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 就是表示一个样本的最小字节.<br>wBitsPerSample&#160; :&#160;&#160; 在格式默认情况下,一般为8,16,表示的是样本的bit 数</p>
<p>对于一个8位,11k传输的立体声则<br>nChannels&#160; = 2<br>nSamplesPerSec(每秒的样本数) = 11025&#160; 就是取样数<br>nBlockAlign&#160; = 2 * 8 / 8= 2&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 对齐字节，最小样本字节数<br>nAvgBytesPerSec = 11025 *&#160; 2 = 22050 <br>wBitsPerSample&#160; = 8<br>&#160;</p>
<p>&#160;下面的图列清楚从另一个方面表达样本<br>
<table style="WIDTH: 650px; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 8pt"></td>
            <td style="FONT-SIZE: 8pt; WIDTH: 278px; HEIGHT: 25px">&#160;样本1&#160;</td>
            <td style="FONT-SIZE: 8pt">样本2</td>
            <td style="FONT-SIZE: 8pt">...n</td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 8pt">8位单声道</td>
            <td style="FONT-SIZE: 8pt">0声道</td>
            <td style="FONT-SIZE: 8pt">0声道 </td>
            <td style="FONT-SIZE: 8pt"></td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 8pt">8位立体声</td>
            <td style="FONT-SIZE: 8pt">0声道L&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1声道R&#160;</td>
            <td style="FONT-SIZE: 8pt">0声道L&#160; 1声R道</td>
            <td style="FONT-SIZE: 8pt"></td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 8pt">16位单声道</td>
            <td style="FONT-SIZE: 8pt">0声道(低字节)&#160;&#160;&#160; 0声道(高字节)</td>
            <td style="FONT-SIZE: 8pt">0声道(低字节)&#160;&#160;&#160; 0声道(高字节)</td>
            <td style="FONT-SIZE: 8pt"></td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 8pt">16位立体声</td>
            <td style="FONT-SIZE: 8pt">
            <p style="FONT-SIZE: 8pt">0声道(低字节)0声道（高字节）1声道(低) 1声道(高)&#160;</p>
            </td>
            <td style="FONT-SIZE: 8pt">
            <p style="FONT-SIZE: 8pt">同左</p>
            </td>
            <td></td>
        </tr>
    </tbody>
</table>
</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>---------</p>
<p>waveform-audio 缓存格式　&#160;&#160;&#160;&#160; <br>&#160; typedef&#160;&#160; struct&#160;&#160; {&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; LPSTR&#160;&#160;&#160;&#160; lpData;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //内存指针，放置音频pcm样本数据<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DWORD&#160;&#160;&#160;&#160; dwBufferLength;&#160;&#160; //长度&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DWORD&#160;&#160;&#160;&#160; dwBytesRecorded;&#160; //已录音的字节长度&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DWORD&#160;&#160;&#160;&#160; dwUser;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DWORD&#160;&#160;&#160;&#160; dwFlags;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DWORD&#160;&#160;&#160;&#160; dwLoops;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //循环次数&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; struct&#160;&#160; wavehdr_tag* lpNext; //保留&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DWORD&#160;&#160;&#160;&#160; reserved;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //保留<br>&#160; }&#160;&#160; WAVEHDR;&#160; <br>&#160;<br>&#160; 其中lpdata 即为pcm格式样本数据。<br>&#160; <br>采样大小为8位，则采样的动态范围为20*log(256)分贝=48db。<br>样本大小为16位，则采样动态范围为20*log(65536)大约是96分贝</p>
<p>振幅大小：&#160;&#160; 20*log(A1/A2)分贝，A1,A2为两个声音的振幅。<br>则对于的音频：<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8位&#160;&#160;&#160;&#160;&#160;&#160; 20 * lg( lpData[0] /256)<br>&#160;&#160; 16位&#160;&#160;&#160;&#160;&#160; 20 * lg( lpData[0]--lpData[1] / 65536)<br>&#160;考虑到单双道，还需要相应取出左右声道的值。<br>&#160;考虑到lg求值为负48至0之间，则在实际转换中需要+48or96.</p>
<p><br>样本大小&#160; 数据格式&#160;&#160;&#160;&#160;&#160; 最大值&#160; 最小值 <br>8位PCM&#160;&#160;&#160; unsigned int&#160;&#160; 256 &#160;&#160;&#160; 0 <br>16位PCM&#160;&#160; int&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 32767&#160; -32767</p>
<p>&#160;8位音频是unsigned 存放波形,取振幅要-127.<br>&#160;而16位因其存放为int 类型,直接套用公式.<br>&#160;<br></p>
<p>audiometer左右声道音量探测程序（<a href="http://www.cppblog.com/Files/kenlistian/audioVu_di.rar">参考代码(delphi版</a>）</p>
<p>&#160;</p>
   <img src ="http://www.cppblog.com/kenlistian/aggbug/71221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2009-01-05 14:16 <a href="http://www.cppblog.com/kenlistian/archive/2009/01/05/71221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可播放rm,rmvb格式播放器的方法</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/28/70557.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Sun, 28 Dec 2008 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/28/70557.html</guid><description><![CDATA[RealMediaSplitter.ax<br><br>Source(.rm/.rmvb)-&gt;RealMediaSplitter-&gt;Video(Audio)-&gt;real a/v decoder-&gt;A/V&nbsp;&nbsp; Render<br><br>其实复原并查找该ax很简单，安装暴风后在graphedit中，拖一个rm文件，<br>查看解码过程，然后在filter列表中找出该ax文件名，即可构建到自己的<br>播放器中。 
<img src ="http://www.cppblog.com/kenlistian/aggbug/70557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-28 11:21 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/28/70557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>directsound的一些基本札记</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/27/70521.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Sat, 27 Dec 2008 10:30:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/27/70521.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/70521.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/27/70521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/70521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/70521.html</trackback:ping><description><![CDATA[<p>1、配置DirectDound的开发环境<br>包含以下<br>#include &lt;mmsystem.h&gt;<br>#include &lt;dsound.h&gt;<br>添加Dsound.lib库<br>comctl32.lib dxerr9.lib winmm.lib dsound.lib dxguid.lib odbc32.lib odbccp32.lib，</p>
<p>2 DiectDound几个对象<br>&nbsp;<br>&nbsp; 创建一个设备对象，后通过设备对象创建缓冲区对象。<br>&nbsp; 辅助缓冲区由应用程序创建和管理，DirectSound会自动地创建和管理主缓冲区，</p>
<p><br>3 播放音频文件开发的基本流程</p>
<p>　a 创建一个设备对象，设置设备对象的协作度。 </p>
<p>　　&nbsp; 调用DirectSoundCreat8创建一个支持IDirectSound8接口的对象，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个对象通常代表缺省的播放设备。<br>&nbsp; 　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　如果没有声音输出设备，这个函数就返回error，或者，在VXD驱动程序下，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果声音输出设备正被某个应用程序通过waveform格式的api函数所控制，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数也返回error。&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">LPDIRECTSOUND8&nbsp;lpDirectSound;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DirectSoundCreate8(NULL,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">lpDirectSound,&nbsp;NULL));</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当创建完设备对象后，调用IDirectSound8::SetCooperativeLevel来设置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 协作度，否则听不到声音.<br><br>&nbsp; b.创建一个辅助Buffer，也叫后备缓冲区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (IDirectSound8::CreateSoundBuffer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建的buffer称作辅助缓冲区，Direcsound通过把几个后备缓冲区的声音<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 混合到主缓冲区中，然后输出到声音输出设备上，达到混音的效果。</p>
<p>&nbsp; c. 获取PCM类型的数据<br>&nbsp;&nbsp;&nbsp; <br>　　将WAV文件或者其他资源的数据读取到缓冲区中。</p>
<p>&nbsp; d. 将数据读取到缓冲区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中用到以下来锁缓冲区。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDirectSoundBuffer8::Lock<br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;IDirectSoundBuffer8::Unlock.</p>
<p>&nbsp; e. 播放缓冲区中的数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDirectSoundBuffer8::Play&nbsp; 播放缓冲区中的音频数据，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDirectSoundBuffer8::Stop 暂停播放数据，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 获取或者设置正在播放的音频的音量的大小<br>　 　IDirectSoundBuffer8::GetVolume <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;IDirectSoundBuffer8::SetVolume</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取设置音频播放的频率<br>　&nbsp; 　IDirectSoundBuffer8::GetFrequency <br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IDirectSoundBuffer8::SetFrequency&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 主缓冲区的频率不允许改动，</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp; 设置音频在左右声道播放的位置<br>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IDirectSoundBuffer8::GetPan <br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IDirectSoundBuffer8::SetPan</p>
<p>　　包含全部音频数据的缓冲区我们称为静态的缓冲区，<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 尽管不同的声音可能会反复使用同一个内存buffer，但静态缓冲区的数据只写入一次。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 静态缓冲区只填充一次数据，然后就可以play，<br>&nbsp;<br>&nbsp;　给静态缓冲区加载数据分下面几个步骤<br>　　1、用IDirectSoundBuffer8::Lock函数来锁定所有的内存，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定你锁定内存中你开始写入数据的偏移位置，并且取回该偏移位置的地址。<br>　　2、采用标准的数据copy方法，将音频数据复制到返回的地址。<br>　　3、调用IDirectSoundBuffer8::Unlock.，解锁该地址。</p>
<p><br>用static buffer 播放wav方法</p>
<p>&nbsp;&nbsp; </p>
<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">LPDIRECTSOUNDBUFFER8&nbsp;&nbsp;&nbsp;&nbsp;g_pDSBuffer8&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">buffer</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">LPDIRECTSOUND8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pDsd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">dsound</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">CWaveFile&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;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">g_pWaveFile</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化DirectSound工作</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">HRESULT&nbsp;hr;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DirectSoundCreate8(NULL,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">g_pDsd,NULL)))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置设备的协作度</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_pDsd</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY)))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>g_pWaveFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CWaveFile;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>g_pWaveFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Open(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c:\\test.wav</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;NULL,&nbsp;WAVEFILE_READ);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>DSBUFFERDESC&nbsp;dsbd;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ZeroMemory(&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dsbd,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DSBUFFERDESC)&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>dsbd.dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DSBUFFERDESC);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>dsbd.dwFlags&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DSBCAPS_GLOBALFOCUS&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">设置主播</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&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;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;DSBCAPS_CTRLFX<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&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;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;DSBCAPS_CTRLPOSITIONNOTIFY&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&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;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;DSBCAPS_GETCURRENTPOSITION2;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>dsbd.dwBufferBytes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_pWaveFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetSize();&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>dsbd.lpwfxFormat&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_pWaveFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pwfx;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>LPDIRECTSOUNDBUFFER&nbsp;lPBuffer;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建辅助缓冲区对象</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_pDsd</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateSoundBuffer(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dsbd,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">lpbuffer,NULL)))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;FAILED(hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lpbuffer</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">QueryInterface(&nbsp;IID_IDirectSoundBuffer8,&nbsp;(LPVOID</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">g_pDSBuffer8)&nbsp;)&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>lpbuffer</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">播放</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">LPVOID&nbsp;lplockbuf;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>DWORD&nbsp;len;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>DWORD&nbsp;dwWrite;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Lock(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">lplockbuf,&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">len,&nbsp;&nbsp;NULL,&nbsp;&nbsp;NULL,&nbsp;DSBLOCK_ENTIREBUFFER);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">g_pWaveFile&nbsp;声音写入到lplockbuf所指地址</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">g_pWaveFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Read((BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)lplockbuf,&nbsp;len,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwWrite);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Unlock(lplockbuf,len,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetCurrentPosition(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Play(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,DSBPLAY_LOOPING);</span></div>
<p><br><br><br>&nbsp;&nbsp; f&nbsp; 流缓冲区播放超大型的wave文件</p>
<p>&nbsp; 　流缓冲区就是播放那些比较长的音频文件,边播放，边填充DirectSound缓冲区。</p>
<p>&nbsp;&nbsp; DirectSound的通知机制<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为Stream buffer 大小只够容纳一部分数据，在播放完缓冲区中的数据后，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DirectSound就会通知应用程序，将新的数据填充到DirectSound的缓冲区中。</p>
<p>&nbsp;</p>
<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MAX_AUDIO_BUF&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">设置4个buffer</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;BUFFERNOTIFYSIZE&nbsp;1920&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">每个buffer尺寸为1920</span><span style="COLOR: #000000"><br><br>BOOL&nbsp;g_bPlaying&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FALSE;&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;&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">LPDIRECTSOUNDNOTIFY8&nbsp;g_pDSNotify&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;&nbsp;<br>DSBPOSITIONNOTIFY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_aPosNotify[MAX_AUDIO_BUF];&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"><br>HANDLE&nbsp;g_event[MAX_AUDIO_BUF];<br></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;MAX_AUDIO_BUF;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>{<br>　g_aPosNotify[i].dwOffset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;BUFFERNOTIFYSIZE&nbsp;;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;　g_aPosNotify[i].hEventNotify&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_event[i];<br>}<br><br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_pDSBuffer8</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">QueryInterface(IID_IDirectSoundNotify,(LPVOID&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">g_pDSNotify&nbsp;)))<br>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br><br>g_pDSNotify</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetNotificationPositions(MAX_AUDIO_BUF,g_aPosNotify);<br><br>g_pDSNotify</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();</span></div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp; 当DirectSound播放到buffer的1920，3840，5760，7680等位置时，<br>Directsound就会通知应用程序，将g_event,设置为通知态;<br>&nbsp; 应用程序就通过WaitForMultipleObjects 函数等待DirectSound的通知，<br>将数据填充到DirectSoun的辅助缓冲区。</p>
<p>&nbsp;</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/70521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-27 18:30 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/27/70521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>枚举流程图</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/15/69469.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 15 Dec 2008 02:07:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/15/69469.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/69469.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/15/69469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/69469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/69469.html</trackback:ping><description><![CDATA[<img height=245 alt="" src="http://www.cppblog.com/images/cppblog_com/kenlistian/enum.jpg" width=458 border=0><br><br>&nbsp; Moniker 是个接口。
<img src ="http://www.cppblog.com/kenlistian/aggbug/69469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-15 10:07 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/15/69469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取神龙卡设备路数</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/10/69027.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Wed, 10 Dec 2008 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/10/69027.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/69027.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/10/69027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/69027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/69027.html</trackback:ping><description><![CDATA[<br><br>&nbsp; 测试神龙卡路数，其中pDecoderFilter要对应不同的设备。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iDev&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_49_253_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_253_Open_Text.style.display='none'; Codehighlighter1_49_253_Closed_Image.style.display='inline'; Codehighlighter1_49_253_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_49_253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_253_Closed_Text.style.display='none'; Codehighlighter1_49_253_Open_Image.style.display='inline'; Codehighlighter1_49_253_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_49_253_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_49_253_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CoCreateInstance(CLSID_RM_MPEG2_VIDEO_SUBPICTURE,&nbsp;NULL,&nbsp;CLSCTX_INPROC_SERVER,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_IBaseFilter,&nbsp;(LPVOID&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pDecoderFilter);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hr&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;S_OK)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iDev</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;sMsg[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(sMsg,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;iDev);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(ghApp,&nbsp;sMsg,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Msg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK);</span></div>
<img src ="http://www.cppblog.com/kenlistian/aggbug/69027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-10 10:45 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/10/69027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取系统设备方法---directshow 知识学习备注1(转)</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/09/68920.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 09 Dec 2008 03:43:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/09/68920.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/68920.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/09/68920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/68920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/68920.html</trackback:ping><description><![CDATA[<p>1.采用系统设备枚举器来枚举.<br>&nbsp;&nbsp; 根据硬件系统种类来枚举系统中注册的filter。<br>&nbsp; &nbsp;每一种不同的硬件可能有自己的filter，也可能所有的硬件设备共用filter。</p>
<p>　系统设备枚举器是根据不同的种类来创建的，如，音频压缩，视频捕捉。<br>&nbsp; 不同种类的枚举器对于每一种设备返回一个独立的名称（moniker）。</p>
<p>下面的步骤是使用设备枚举器来获取设备：</p>
<p>1) 创建枚举器组件，CLSID为CLSID_SystemDeviceEnum<br>2) 指定某一种类型设备，获取该种类枚举器<br>&nbsp;&nbsp;&nbsp; 通过ICreateDevEnum::CreateClassEnumerator获取某一种类的枚举器，<br>&nbsp;&nbsp;&nbsp; 该函数返回一个IEnumMoniker接口指针，<br>&nbsp;&nbsp;&nbsp; 通过检查返回值是否为S_OK来判断是否获取到该种类枚举器.<br>3) 用IEnumMoniker::Next枚举每一个moniker。<br>&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个IMoniker接口指针。<br>4) 通过IMoniker::BindToStorage获取设备的名称</p>
<p>大致例子如下：<br>&nbsp;&nbsp;&nbsp; </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">HRESULT&nbsp;hr;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ICreateDevEnum&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pSysDevEnum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CoCreateInstance(CLSID_SystemDeviceEnum,&nbsp;NULL,&nbsp;CLSCTX_INPROC_SERVER,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_ICreateDevEnum,&nbsp;(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pSysDevEnum);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(FAILED(hr))　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;hr;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取video&nbsp;compressor&nbsp;种类枚举器&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">IEnumMoniker&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pEnumCat&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pSysDevEnum</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateClassEnumerator(CLSID_VideoCompressorCategory,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pEnumCat,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img id=Codehighlighter1_363_837_Open_Image onclick="this.style.display='none'; Codehighlighter1_363_837_Open_Text.style.display='none'; Codehighlighter1_363_837_Closed_Image.style.display='inline'; Codehighlighter1_363_837_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_363_837_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_363_837_Closed_Text.style.display='none'; Codehighlighter1_363_837_Open_Image.style.display='inline'; Codehighlighter1_363_837_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hr&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;S_OK)</span><span id=Codehighlighter1_363_837_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_363_837_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　IMoniker&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pMoniker&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　ULONG&nbsp;cFetched;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_467_813_Open_Image onclick="this.style.display='none'; Codehighlighter1_467_813_Open_Text.style.display='none'; Codehighlighter1_467_813_Closed_Image.style.display='inline'; Codehighlighter1_467_813_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_467_813_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_467_813_Closed_Text.style.display='none'; Codehighlighter1_467_813_Open_Image.style.display='inline'; Codehighlighter1_467_813_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>　</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pEnumCat</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Next(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pMoniker,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">cFetched)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;S_OK)</span><span id=Codehighlighter1_467_813_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_467_813_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　IPropertyBag&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pPropBag;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pMoniker</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">BindToStorage(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IID_IPropertyBag,&nbsp;(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pPropBag);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SUCCEEDED(hr))<br><img id=Codehighlighter1_595_787_Open_Image onclick="this.style.display='none'; Codehighlighter1_595_787_Open_Text.style.display='none'; Codehighlighter1_595_787_Closed_Image.style.display='inline'; Codehighlighter1_595_787_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_595_787_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_595_787_Closed_Text.style.display='none'; Codehighlighter1_595_787_Open_Image.style.display='inline'; Codehighlighter1_595_787_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>　　</span><span id=Codehighlighter1_595_787_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_595_787_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　　</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;获取设备名称</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">　　　VARIANT&nbsp;varName;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　　VariantInit(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varName);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　　hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pPropBag</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Read(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FriendlyName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varName,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img id=Codehighlighter1_731_756_Open_Image onclick="this.style.display='none'; Codehighlighter1_731_756_Open_Text.style.display='none'; Codehighlighter1_731_756_Closed_Image.style.display='inline'; Codehighlighter1_731_756_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_731_756_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_731_756_Closed_Text.style.display='none'; Codehighlighter1_731_756_Open_Image.style.display='inline'; Codehighlighter1_731_756_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>　　　</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SUCCEEDED(hr))</span><span id=Codehighlighter1_731_756_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_731_756_Open_Text><span style="COLOR: #000000">{　　　<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取设备名称</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">　　　}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　　VariantClear(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varName);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>　　}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　　pMoniker</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>　}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　pEnumCat</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>pSysDevEnum</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>2.采用Filer Mapper。<br>&nbsp;&nbsp;&nbsp;类似条件查询。<br><br>&nbsp;&nbsp; 比系统设备枚举器（System Device Enumerator）的效率要低一些。<br>&nbsp;&nbsp; 当要枚举某特定种类的filter时，应采用系统设备枚举器方法，但搜索支持某种<br>&nbsp;&nbsp; 媒体类型的filter时，用filter mapper.</p>
<p>&nbsp;&nbsp; Filter Mapper 通过IFilerMapper2接口搜索接口，<br>&nbsp;&nbsp; 通过调用IFilterMapper2::EnumMatchingFilters方法，传递一些参数来定义搜索条件，<br>&nbsp;&nbsp; 返回一个适合条件的filter的枚举器，<br><br>&nbsp;&nbsp; 返回的是一个IEnumMoniker接口，并对于每个适合的filter都提供一个单独的moniker。</p>
<p>例子：<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">枚举所有的支持DV，并且至少有一个输出pin的filter，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个filter支持任何媒体类型。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">IFilterMapper2&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pMapper&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>IEnumMoniker&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pEnum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CoCreateInstance(&nbsp;CLSID_FilterMapper2,NULL,&nbsp;CLSCTX_INPROC,&nbsp;IID_IFilterMapper2,&nbsp;(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pMapper);<br><img id=Codehighlighter1_234_238_Open_Image onclick="this.style.display='none'; Codehighlighter1_234_238_Open_Text.style.display='none'; Codehighlighter1_234_238_Closed_Image.style.display='inline'; Codehighlighter1_234_238_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_234_238_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_238_Closed_Text.style.display='none'; Codehighlighter1_234_238_Open_Image.style.display='inline'; Codehighlighter1_234_238_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(FAILED(hr))&nbsp;</span><span id=Codehighlighter1_234_238_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_234_238_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>GUID&nbsp;arrayInTypes[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>arrayInTypes[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MEDIATYPE_Video;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>arrayInTypes[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MEDIASUBTYPE_dvsd;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pMapper</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">EnumMatchingFilters(<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pEnum,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Reserved.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　TRUE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Use&nbsp;exact&nbsp;match?</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　MERIT_DO_NOT_USE</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Minimum&nbsp;merit.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　TRUE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;At&nbsp;least&nbsp;one&nbsp;input&nbsp;pin?</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&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">&nbsp;Number&nbsp;of&nbsp;major&nbsp;type/subtype&nbsp;pairs&nbsp;for&nbsp;input.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrayInTypes,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Array&nbsp;of&nbsp;major&nbsp;type/subtype&nbsp;pairs&nbsp;for&nbsp;input.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Input&nbsp;medium.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Input&nbsp;pin&nbsp;category.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE,&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Must&nbsp;be&nbsp;a&nbsp;renderer?</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRUE,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;At&nbsp;least&nbsp;one&nbsp;output&nbsp;pin?</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Number&nbsp;of&nbsp;major&nbsp;type/subtype&nbsp;pairs&nbsp;for&nbsp;output.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Array&nbsp;of&nbsp;major&nbsp;type/subtype&nbsp;pairs&nbsp;for&nbsp;output.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　NULL,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Output&nbsp;medium.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Output&nbsp;pin&nbsp;category.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>IMoniker&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pMoniker;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ULONG&nbsp;cFetched;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">枚举filter，</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pEnumCat</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Next(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pMoniker,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">cFetched)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;S_OK)<br><img id=Codehighlighter1_1264_1617_Open_Image onclick="this.style.display='none'; Codehighlighter1_1264_1617_Open_Text.style.display='none'; Codehighlighter1_1264_1617_Closed_Image.style.display='inline'; Codehighlighter1_1264_1617_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1264_1617_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1264_1617_Closed_Text.style.display='none'; Codehighlighter1_1264_1617_Open_Image.style.display='inline'; Codehighlighter1_1264_1617_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1264_1617_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1264_1617_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;　IPropertyBag&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pPropBag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;　hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pMoniker</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">BindToStorage(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IID_IPropertyBag,&nbsp;(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pPropBag);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;　</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SUCCEEDED(hr))<br><img id=Codehighlighter1_1398_1593_Open_Image onclick="this.style.display='none'; Codehighlighter1_1398_1593_Open_Text.style.display='none'; Codehighlighter1_1398_1593_Closed_Image.style.display='inline'; Codehighlighter1_1398_1593_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1398_1593_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1398_1593_Closed_Text.style.display='none'; Codehighlighter1_1398_1593_Open_Image.style.display='inline'; Codehighlighter1_1398_1593_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;　</span><span id=Codehighlighter1_1398_1593_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1398_1593_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARIANT&nbsp;varName;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp; 　　VariantInit(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varName);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;　&nbsp; 　hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pPropBag</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Read(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FriendlyName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varName,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;　　 </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SUCCEEDED(hr))<br><img id=Codehighlighter1_1534_1563_Open_Image onclick="this.style.display='none'; Codehighlighter1_1534_1563_Open_Text.style.display='none'; Codehighlighter1_1534_1563_Closed_Image.style.display='inline'; Codehighlighter1_1534_1563_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1534_1563_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1534_1563_Closed_Text.style.display='none'; Codehighlighter1_1534_1563_Open_Image.style.display='inline'; Codehighlighter1_1534_1563_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;　　</span><span id=Codehighlighter1_1534_1563_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1534_1563_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&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">处理</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;　　 }</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;　 　VariantClear(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">varName);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>　}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>　pMoniker</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>pMapper</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>pEnum</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Release();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>注：<br>&nbsp;* 有关directshow的api函数，估计只能在网上搜索，至于下载的msdn没有，或者下个dssdk2002版本的help才能有。<br>&nbsp;* 在directshow中，关于capture dev，有专门的demo演示如何获取音视设备。这里只是<br>明了获取设备的方法。以备了解。<br><br>
<img src ="http://www.cppblog.com/kenlistian/aggbug/68920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-09 11:43 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/09/68920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>directshow 基本知识3</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/08/68878.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 08 Dec 2008 12:21:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/08/68878.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/68878.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/08/68878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/68878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/68878.html</trackback:ping><description><![CDATA[<p>使用DirectShow写一个音频捕捉例子<br><br>DirectShow对硬件的支持是通过特定的包装Filter来实现的。<br>声卡使用的是Audio Capture Filter，Filter内部使用以waveIn开头<br>的一套API实现（如waveInOpen等）。<br>运行GraphEdit，插入Filter时，在&#8220;Audio Capture Sources&#8221;目录下，<br>就能看到所有代表本地机器上的声卡的各个Filter(装了几张声卡，就会有几个Filter)</p>
<p><br>DirectShow加入一个硬件Filter，是靠&#8220;枚举&#8221;；声卡Filter也不例外。<br>代表声卡的Filter都注册在CLSID_AudioInputDeviceCategory目录下，<br>使用系统设备枚举器枚举这个目录，就能发现要创建的声卡对象。<br>&nbsp;（如何枚举这里就不再赘述了。)<br>当成功加入声卡Filter后，接下去的问题就是要将这个Filter与其他Filter相连。</p>
<p><br>&nbsp;想捕捉生成一个Wave文件，采用过滤器的勾连如下<br>&nbsp;&nbsp;&nbsp; &nbsp;声卡filter---&gt;Wave Dest Filter&nbsp; ----&gt;File Writer Filter<br>&nbsp;Wave Dest Filter是微软DirectX SDK自带的过滤器<br>&nbsp;&nbsp;&nbsp;&nbsp;其功能是，当结束捕捉时，往Wave文件中写入一个文件头信息。<br><br>&nbsp;Filte Write Filter 是微软系统过滤器。<br>用graphedit可以勾连后测试下。</p>
<p><br>//采用程序来连接过滤器的大致方法:<br>//没有处理错误<br>void BuildAudioCaptureGraph(void) <br>{<br>&nbsp;　IBaseFilter *pSrc = NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //捕捉音频设备<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pWaveDest = NULL,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //处理音频过滤器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pWriter = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //产生文件过滤器</p>
<p>&nbsp;　IFileSinkFilter *pSink= NULL;<br>&nbsp;　IGraphBuilder *pGraph;</p>
<p>&nbsp;　// Create the Filter Graph Manager.<br>&nbsp;　CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,&nbsp;&nbsp;&nbsp;&nbsp; IID_IGraphBuilder, (void**)&amp;pGraph);</p>
<p>&nbsp;　// Add the audio capture filter. <br>&nbsp; &nbsp;&nbsp; //这里省略了枚举设备处理<br>&nbsp;　FindAudioCapture(&amp;pSrc); <br>&nbsp;<br>&nbsp;　// audio capture devices and picks one.<br>&nbsp;　pGraph-&gt;AddFilter(pSrc, L"Capture");</p>
<p>&nbsp;　// Add the WavDest and the File Writer.<br>&nbsp;　AddFilterByClsid(pGraph, L"WavDest", CLSID_WavDest, &amp;pWavDest);<br>&nbsp;　AddFilterByClsid(pGraph, L"File Writer", CLSID_FileWriter, &amp;pWriter);</p>
<p>&nbsp;　//是writer接口中属性<br>&nbsp;　pWriter-&gt;QueryInterface(IID_IFileSinkFilter, (void**)&amp;pSink);<br>&nbsp;　pSink-&gt;SetFileName(L"C:\test.wav", NULL);</p>
<p>&nbsp;　//连接filter<br>&nbsp;　ConnectTwoFilters(pGraph, pSrc, pWavDest);<br>&nbsp;　ConnectTwoFilters(pGraph, pWavDest, pWriter);<br>}</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/68878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-08 20:21 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/08/68878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>directshow 基本学习2</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/08/68835.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 08 Dec 2008 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/08/68835.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/68835.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/08/68835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/68835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/68835.html</trackback:ping><description><![CDATA[<p>DirectShow技术是建立在DirectDraw和DirectSound组件基础之上的，<br>它通过DirectDraw对显卡进行控制以显示视频，<br>通过DirectSound对声卡进行控制以播放声音。</p>
<p>DirectShow功能实现：</p>
<p>1.可提供高质量的多媒体流的捕获和回放功能；<br>2.支持多种媒体格式，包括ASF（Advanced Systems Format），MPEG（Motion Picture Experts Group），AVI（Audio-Video Interleaved），MP3（MPEG Audio Layer-3）和WAV声音文件；<br>3.可从硬件上捕获媒体数据流；<br>4.可自动检测并使用视频和音频加速硬件。</p>
<p>故，DirectShow是用于多媒体应用开发。(其实就是一个软编码(or解码))<br>它充分发挥媒体的性能，提高运行速度，可以简化媒体播放、媒体间的格式转换<br>和媒体捕获等工作。同时，它还具有极大的可扩展性和灵活性，可以由用户自己<br>创建组件，并将这个组件加入DirectShow结构中以支持新的格式或特殊的效果。</p>
<p>应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系<br>如图1</p>
<p>&nbsp; <img height=340 alt="" src="http://www.cppblog.com/images/cppblog_com/kenlistian/directshow_struct.JPG" width=490 border=0><br><br><br>二。概念<br>1.过滤器<br>过滤器分为以下几种类型：<br>&nbsp;a&nbsp;源过滤器（source filter）：<br>&nbsp;&nbsp;&nbsp; 源过滤器引入数据到过滤器图表中，数据来源可以是文件、网络、照相机等。<br>&nbsp;&nbsp;&nbsp; 不同的源过滤器处理不同类型的数据源。</p>
<p>&nbsp;b&nbsp;变换过滤器（transform filter）：<br>&nbsp;&nbsp; 变换过滤器的工作是获取输入流，处理数据，并生成输出流。<br>&nbsp;&nbsp; 变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。</p>
<p>&nbsp;c&nbsp;提交过滤器（renderer filter）：<br>&nbsp;&nbsp;&nbsp; 接收数据并把数据提交给外设。</p>
<p>&nbsp;d 分割过滤器（splitter filter）：<br>&nbsp;&nbsp;&nbsp; 把输入流分割成多个输出。<br>&nbsp;&nbsp;&nbsp; 如，AVI分割过滤器把一个AVI格式的字节流分割成视频流和音频流。</p>
<p>&nbsp;e&nbsp;混合过滤器（mux filter）：<br>&nbsp;&nbsp;&nbsp; 把多个输入组合成一个单独的数据流。<br>&nbsp;&nbsp;&nbsp; 如，AVI混合过滤器把视频流和音频流合成一个AVI格式的字节流。<br>&nbsp;&nbsp;&nbsp; 　过滤器的这些分类并不是绝对的，如一个ASF读过滤器（ASF Reader filter）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既是一个源过滤器又是一个分割过滤器。<br><br><br>2&nbsp; filter graph<br><br>&nbsp;&nbsp;&nbsp; 过滤器图表用来连接过滤器以控制媒体流，它也可以将数据返回给应用程序，<br>&nbsp;&nbsp;&nbsp; 并搜索所支持的过滤器。<br>&nbsp;&nbsp;&nbsp; 过滤器有三种可能的状态：运行、停止和暂停。<br>&nbsp;&nbsp;&nbsp; 暂停是一种中间状态，停止状态到运行状态必定经过暂停状态。<br>&nbsp;&nbsp;&nbsp; 暂停可以理解为数据就绪状态，是为了快速切换到运行状态而设计的。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 在暂停状态下，数据线程是启动的，但被提交过滤器阻塞了。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 通常情况下，过滤器图表中所有过滤器的状态是一致的。<br><br>3. 引脚（pin）<br>　过滤器可以和一个或多个过滤器相连，<br>&nbsp;&nbsp;&nbsp; 连接的接口也是COM形式的，称为引脚。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 过滤器利用引脚在各个过滤器间传输数据。<br>&nbsp;&nbsp;&nbsp; 每个引脚都从Ipin这个COM对象派生出来的。<br>&nbsp;&nbsp;&nbsp; 每个引脚都是过滤器的私有对象，过滤器可以动态的创建引脚，销毁引脚，自由控制引脚的生存时间。<br>&nbsp;&nbsp;&nbsp; 引脚分输入引脚（Input pin）和输出引脚（Output pin）两种类型，<br>&nbsp;&nbsp;&nbsp; 两个相连的引脚必须是不同种类的，即输入引脚只能和输出引脚相连</p>
<p>　过滤器之间的连接（也就是引脚之间的连接），实际上是连接双方媒体类型（Media Type）协商的过程。（媒体类型，不完全媒体类型 再下一节有讲解)<br><br><br>&nbsp;&nbsp;&nbsp;连接的大致过程为：<br>&nbsp;&nbsp;&nbsp; &nbsp;如果调用连接函数时已经指定了完整的媒体类型，则用这个媒体类型进行连接，<br>&nbsp; 成功与否都结束连接过程；<br>&nbsp;&nbsp; &nbsp;&nbsp; 如果没有指定或不完全指定了媒体类型，<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;则枚举过程见后面.其两个filter的连接设定如下.<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Filter A &nbsp;&nbsp;&nbsp;&nbsp;------------------&gt; Filter B<br><br><br><br>-------------------------------------------------------------&nbsp;------------------</p>
<p>说明:<br>媒体类型（Media Type）<br>&nbsp;&nbsp;&nbsp; 两个过滤器相连时，必须使用一致的媒体类型，否则这两个过滤器就不能相连。<br><br>&nbsp;&nbsp;&nbsp; 媒体类型能识别上一级过滤器传送给下一级过滤器的数据类型，并对数据进行分类。<br>&nbsp;&nbsp; 媒体类型的结构&nbsp;&nbsp;AM_MEDIA_TYPE<br>&nbsp;<br>&nbsp; AM_MEDIA_TYPE由三部分组成：<br>&nbsp;&nbsp; &nbsp;&nbsp; Major type<br>&nbsp;&nbsp;&nbsp; &nbsp; Subtype<br>&nbsp;&nbsp; &nbsp; &nbsp;Format type<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; 都使用GUID 来唯一标示<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; Major type主要定性描述一种媒体类型，这种媒体类型可以是视频、音频、比特数据流或MIDI数据等；<br>&nbsp;&nbsp;&nbsp;&nbsp; Subtype&nbsp;&nbsp; 进一步细化媒体类型，<br>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拿视频的说就是进一步指定是RGB-24，还是RGB-32，或是UYVY等；<br>&nbsp;&nbsp; &nbsp; Format type则用一个结构更进一步细化媒体类型。</p>
<p>　媒体类型的三个部分都指定了某个具体的GUID值，则称这个媒体类型是完全指定的；<br>&nbsp;&nbsp;&nbsp; 媒体类型的三个部分中有任何一个值是GUID_NULL，则称这个媒体类型是不完全指定的。<br>&nbsp;&nbsp;&nbsp; GUID_NULL起通配符作用<br><br><br>pinout和pinin的连接过程可以用下面逻辑语言表达.<br><br>1.如调用连接函数时已经指定了完整的Media type，则用这个Media type进行连接，<br>成功与否都结束连接过程；</p>
<p>2.如没有指定或不完全指定了Media type，<br>则如下:<br><br>&nbsp; BOOL CheckFilterB_PinIn()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;for(i = 0 ; i &lt; FilterB.FPinIn.MediaTypeCount ; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (IsSameMediaType(FilterA.FPinOut,FilterB.FPinIn.MediaType[i]) = True)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return TRUE;&nbsp;&nbsp; //Pin之间的连接成功；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return FALSE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在Input pin不支持该媒体类型,失败.<br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;&nbsp;返回FALSE再枚举Output pin上的所有Media type，并逐一用这些Media type与Input pin进行连接。<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; for(i = 0 ; i &lt; FilterA.FPinOut.MediaTypeCount; i++)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (CheckFilteB_PinIn(FilterA.FPinOut.MediaType[i]) = True )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; return FALSE;&nbsp; //filterA和filterB的连接失败.</p>
<p><br><br>&nbsp;</p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/68835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-08 12:50 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/08/68835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>directshow 基本1</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/08/68825.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 08 Dec 2008 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/08/68825.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/68825.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/08/68825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/68825.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/68825.html</trackback:ping><description><![CDATA[<p>DirectShow 的几个接口说明<br>(1) IGraphBuilder接口<br>&nbsp;&nbsp;&nbsp;&nbsp; 用于构造Filter Graph的接口，建立和管理一系列的Filter，过滤和处理源媒体流。<br>(2) IMediaControl接口<br>&nbsp;&nbsp;&nbsp;&nbsp; 用于控制多媒体流在Filter Graph中的流动，如流的启动和停止。<br>(3) IMediaEvent接口<br>&nbsp;&nbsp;&nbsp;&nbsp; 用于捕获播放过程中发生的事件，并通知应用程序，如EC_COMPLETE等。<br>(4) IVideoWindow接口<br>&nbsp;&nbsp;&nbsp;&nbsp; 用于控制视频窗口的属性。<br>(5) IMeadiaSeeking接口<br>&nbsp;&nbsp;&nbsp;&nbsp; 用于查找媒体的接口，定位流媒体，控制多媒体数据播放提供精确控制。<br>(6) IBaseFilter接口 <br>&nbsp;&nbsp;&nbsp; 从ImediaFilter接口继承，用来定义一个具体的过滤器指针，并对多媒体数据进行处理。<br>(7) IPin接口<br>&nbsp;&nbsp;&nbsp; 用于管理两个过滤器之间的Pin，从而连接过滤器。<br>(8) IsampleGrabberCB接口<br>&nbsp;&nbsp; 是Sample Grabber过滤器的一个接口，用于当流媒体数据通过过滤器时进行采样以获得帧图象。</p>
<p><br>Filter必须加入到Filter Graph并接入到工作链路中才能发挥作用。<br>如想绕过Filter Graph而直接使用Filter实现的功能模块，那就要将Filter功能<br>移植成DirectX媒体对象（DMO）。<br>Filter有3种状态：停止、暂停和运行。</p>
<p>Filter Chain是相互连接着的一条Filter链路，并且链路中的每个Filter全都有一个处于&#8220;已连接&#8221;状态的<br>输入Pin，至多有一个处于&#8220;已连接&#8221;状态的输出Pin，这条Filter链路中的数据流不依赖链路外的其他Filter。</p>
<p>Filter Chain通过IFilterChain接口来进行相关操作。<br>当Filter Graph处于运行状态下，Filter Chain可以在运行和停止状态之间切换；<br>当Filter Graph处于暂停状态下，Filter Chain可以在暂停和停止状态之间切换。<br>Filter Chain只有两种状态转换。</p>
<p>Filter的数据传送<br>Filter之间以Sample的形式传送数据。<br>Sample是一个封装了一定大小数据内存的COM组件。<br>用于数据传输的一般是输入pin上实现的IMemInputPin接口。</p>
<img src ="http://www.cppblog.com/kenlistian/aggbug/68825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-08 11:38 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/08/68825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关direct show 编译问题汇总(转)</title><link>http://www.cppblog.com/kenlistian/archive/2008/12/08/68797.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Sun, 07 Dec 2008 17:11:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/12/08/68797.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/68797.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/12/08/68797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/68797.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/68797.html</trackback:ping><description><![CDATA[注意：<br>&#160;&#160;&#160; 以下配置均以vc6为主.<br><br>一、配置方法 <br>1 先编译Samples\C++\DirectShow\BaseClasses中的工程文件。<br>注意工程的默认选项是 Debug_Unicode的，在非Unicode的工程中使用还需要编译Debug版本的。 <br><br>&#160;注意: <br>&#160; 一般用 ansi debug版.不怕麻烦把release也生成,取出该strmbasd.lib(strmbase.lib). <br>&#160; 放在dxsdk中的lib中. <br><br><br>2 需要设置好VC中目录的设置 include的目录中添加 C:\DXSDK\Samples\C++\DirectShow\BaseClasses Lib的目录中添加 C:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug <br>注意: <br>&#160; 建议把把classes 把头文件可以单独拷贝到dxsdk的include和lib中 <br><br>3、使用DirectShow的工程需要添加下面两个头文件 <br>#include <streams.h>&#160; //DS接口、基类的定义<br>#include <atlbase.h>&#160;&#160; //CComPtr模板的定义 <br>#pragma comment(lib,"strmbasd.lib")<br>#pragma comment(lib,"winmm.lib") <br>#pragma comment(linker,"/NODEFAULTLIB:libcmtd.lib") <br><br>注意: <br>&#160; VC自带的库中也有strmbasd.lib文件。<br>一定要保证连接到DS的库中，否则会出现&#160;<br>strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A) <br>strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A) <br>strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA) <br>strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA) 之类的错误。 <br><br>&#160; 以上link报错各异,最好把lib的位置上下调调,别链到vc自带的库中.鬼问题名堂太多,有时也和direct showsdk版本有关. <br><br>二.编译后出现的错误: <br>1 syntax error : identifier 'DWORD_PTR' <br>如下:<br>e:\directx9\samples\c++\directshow\baseclasses\wxutil.h(53) : error C2061: syntax error : identifier 'DWORD_PTR' <br>e:\directx9\samples\c++\directshow\baseclasses\ctlutil.h(43) : error C2504: 'IBasicVideo2' : base class undefined <br>e:\directx9\samples\c++\directshow\baseclasses\ctlutil.h(904) : error C2146: syntax error : missing ';' before identifier 'm_dwAdvise' e:\directx9\samples\c++\directshow\baseclasses\ctlutil.h(90) : error C2501: 'DWORD_PTR' : missing storage-class or type specifierse <br>&#160;&#160; 如果发生这种情况，你应该从"Tools"目录中选择"Option"，<br>&#160;&#160; 然后在include directory中将Platform SDK加到VC inlcude中. <br><br>注意:<br>&#160;1. 没有该sdk,需要先下载platform sdk. 在我的随笔中包含该链接. <br>2. 要放在Include最前面. <br><br><br>2 LINK : fatal error LNK1104: cannot open file "mfc42ud.lib" mfc42ud.lib是专门给unicode用的 build-->set active Configuration--> XXX win32 debug 这样就可以了&#160;<br><br>3&#8220;CComPtr< &#8221;怎么用？<br>CComPtr<ISmbppLongConnectApiEx> m_spApi;在控制台程序中可以编译成功，<br>&#160;&#160; 但mfc中报错，怎么回事？错误信息：<br>error C2143: syntax error : missing ';' before '<'<br>error C2501: 'CComPtr' : missing storage-class or type specifiers<br>error C2059: syntax error : '<'<br>error C2238: unexpected token(s) preceding ';'<br>原因：缺少文件，在vc6中是atlbase.h，可能在.net中是atlcomcli.h<br>解决方法：在stdafx.h中加入#include <atlbase.h><br>&#160;<qedit.h>注意:<br>&#160;&#160;&#160; 以上lib路径要对. <br><br><br>5 调用CoInitializeEx(),编译后显示未定义<br>CoInitializeEx()是利用COM组件时每个线程都要调用的函数，<br>使用这个函数需要有如下设置：<br>&#160; 在Project -> setting -> C/C++标签下的Preprocessor definitions中加入"_WIN32_WINNT=0x400"语句 <br><br><br>
 <img src ="http://www.cppblog.com/kenlistian/aggbug/68797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-08 01:11 <a href="http://www.cppblog.com/kenlistian/archive/2008/12/08/68797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc6下的directshow的头文件</title><link>http://www.cppblog.com/kenlistian/archive/2008/07/15/56223.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 15 Jul 2008 11:28:00 GMT</pubDate><guid>http://www.cppblog.com/kenlistian/archive/2008/07/15/56223.html</guid><wfw:comment>http://www.cppblog.com/kenlistian/comments/56223.html</wfw:comment><comments>http://www.cppblog.com/kenlistian/archive/2008/07/15/56223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenlistian/comments/commentRss/56223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenlistian/services/trackbacks/56223.html</trackback:ping><description><![CDATA[<br>vc6 下的msdn版本：最后一个支持VS6的版本是2001年10月版；<br><br><br>DirectX SDK：DirectX 9.0 Summer 2004 SDK Update，<br><br>下载页面：<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=fd044a42-9912-42a3-9a9e-d857199f888e&amp;DisplayLang=en"><u><font color=#0000ff>http://www.microsoft.com/downloads/details.aspx?FamilyID=fd044a42-9912-42a3-9a9e-d857199f888e&amp;DisplayLang=en</font></u></a><br>这个版本的Direct 9 SDK是不完全支持VC6的，<br><br>注意下载页面的Overview：<br>This download contains all the extra files that are not included in the DirectX 9.0 SDK Summer Update 2004 release such as a d3dx.lib which supports VC 6.0, older plug-ins and Japanese version of the documentation.<br>即DirectX SDK Summer Update 2004里面附带的d3dx.lib是不支持VC6的，支持VC6的版本在Extras包里面。<br><br>还须下DirectX 9.0 Summer 2004 SDK Update&nbsp;Extras（<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=736585e1-10f0-4e85-b940-828cba9971f1&amp;DisplayLang=en"><u><font color=#0000ff>http://www.microsoft.com/downloads/details.aspx?FamilyID=736585e1-10f0-4e85-b940-828cba9971f1&amp;DisplayLang=en</font></u></a>），<br><br>另如编译时出现了DWORD_PTR或者其他什么类型未定义之类的错误，是因为微软把BASETSD.H从DirectX SDK发行包里拿掉了，这个文件在Platform SDK里有，在VC的Include路径中把Platform SDK的include路径提到最前面就可以了。<br><span id=Anthem_Post.ascx_Comments_ltlComments__><span id=Post.ascx_Comments_ltlComments>Platform SDK，最后一个支持VC6的Platform SDK是February 2003 Edition，<br>下载：<a href="http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm"><u><font color=#0000ff>http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm</font></u></a><br><br><br>****************************************************<br>因为现在从微软下载需要验证<br><br>可以下DirectX 9 SDK 精简版，7M大，这里DirectX 9 SDK 精简版的下载地址：<br>http://www.gameres.com/Resource/dx9sdk.zip<br><br>从MSDN6里面提取出来的DirectShow头文件：<br>http://www.shenglu.com/UserFiles/File/files/DirectShow_Include_files_from_msdn6cd1.zip</span></span><br><br><br>感谢上面提供者。 
<img src ="http://www.cppblog.com/kenlistian/aggbug/56223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenlistian/" target="_blank">kenlistian</a> 2008-07-15 19:28 <a href="http://www.cppblog.com/kenlistian/archive/2008/07/15/56223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>