Archive for January, 2010

FOURCC

2010-1-31 22:34 | by 2ndboy

  在 DirectShow 里面,各种 audio/video 的编码格式都可以用一个 GUID 来表示,比如 RGB24 的 GUID 是 MEDIASUBTYPE_RGB24(e436eb7d-524f-11ce-9f53-0020af0ba770)。但是在多媒体播放软件里(比如暴风影音),我们经常看到的是类似 AVC1、AAC2 这样的表示方法,这种用 4 个字符来表示的多媒体数据编码格式叫做 FourCC(Four-Character Codes)。

  FourCC 是一个 32 bits 的数值,基本上你可以把这个 32 bits 的值看作是 FourCC 里 4 个字符的 ASCII 码的组合,比如 YUY2 的 FourCC 是 0x32595559(Y=0x59, U=0x55, 2=0x32)。但并不是所有 FourCC 都符合这个规律,比如我上面举的 RGB24 就不是这样地:)

  FourCC 跟它对应的 GUID 之间是可以相互转换的,其实在 FourCC 后面加上 0000-0010-8000-00AA00389B71 就得到了它所对应的 GUID。比如 FourCC YUY2 所对应的 GUID MEDIASUBTYPE_YUY2 的值就是 {32595559-0000-0010-8000-00AA00389B71}。DirectShow 里面提供了一个工具类就是用来干这件事的:GUID g = (GUID)FOURCCMap( MAKEFOURCC(‘Y’,’U’,’Y’,’2′) );。

  FourCC 的分配是由 Microsoft 管理的,在这里可以找到一个已经注册的 FourCC 的列表,当然,不太全。

《True Colors》

2010-1-12 21:52 | by 2ndboy

  昨晚晚饭后在 VeryCD 上例行的逛逛,看到两张“新” iTunes Plus AAC 专辑,一张是 Dido 的《Life for Rent》,另外一张的封面造型比较前卫(是我不喜欢的那一型):

True Colors

  Erlend Bratland 的《True Colors》,歌者的名字没听说过。抱着聊胜于无的心态点了一首试听,马上惊为天人!看了看介绍,原来 2008 年 Erlend Bratland 在他 16 岁的时候就赢得了“Norway’s got talent”的冠军,果然实力不俗!

  今天专辑下载完以后马上转了一首专辑同名曲上来分享一下(原始 AAC 格式效果更好:)):

Audio clip: Adobe Flash Player (version 9 or above) is required to play this audio clip. Download the latest version here. You also need to have JavaScript enabled in your browser.

通过 IWMPGraphCreation 接口来定制 WMP 的 Filter Graph

2010-1-10 16:46 | by 2ndboy

  Windows Media Player 内部也是利用 DirectShow 来播放音视频内容的,这一点可以通过注册了 DirectShow Filter Graph SpyGraphEdit 来证实。那么有没有可能把 WMP 控件内嵌到我们自己的程序里,然后控制它的 Filter Graph 生成过程呢?答案就是 IWMPGraphCreation 接口。去年(其实是上个月;))研究了一下这个接口,最后终因版本要求过高,不适合用在我们的项目里而放弃使用,这里简单的做点笔记。

  根据 MSDN,这个接口只有在 WMP 10 及以上版本才支持。实现这个接口,跟 WMP 交互然后达到控制 WMP 的 Filter Graph 生成的步骤如下:

1) 首先要实现一个从 IOleClientSite, IWMPGraphCreation 和 IServiceProvider 这 3 个接口派生的类
2) 从 WMP 控件实例中取得 IOleObject 接口指针,然后调用 IOleObject::SetClientSite() 把我们新实现的类作为 WMP 的 site
3) WMP 会从它的 site 那里通过 QueryInterface() 得到 IServiceProvider 接口指针
4) 得到 IServiceProvider 接口以后 WMP 会调用 IServiceProvider::QueryService() 来尝试得到 IWMPGraphCreation 的接口指针
5) 在从我们这里得到 IWMPGraphCreation 接口指针以后,WMP 会调用我们的 IWMPGraphCreation::GetGraphCreationFlags(),这时我们需要给 flag 设置一个 WMPGC_FLAGS_USE_CUSTOM_GRAPH,表示我们想要定制 WMP 的 Filter Graph
6) WMP 控件在播放音视频文件之前会调用我们的 IWMPGraphCreation::GraphCreationPreRender() 实现,同时把它内部的 Filter Graph 接口指针传给我们,拿到 Filter Graph 指针以后我们就可以做我们想做的事情了

  最大的问题出在 step 5,WMPGC_FLAGS_USE_CUSTOM_GRAPH 这个 flag 在 WMP 12 及以上版本才支持,所以这个版本需求实在是有点太高了!另外一个意外是我的实测观察到,在 WMP 12 上面,step 5 及其后的动作,WMP 会做两遍,而不是我们直觉中的一遍,原因不明(Google 到一些资料,也有人遇到了这样的问题)。