Wednesday, January 21, 2009

DirectShow 之 自定义视频窗口

DirectShow在播放视频时,默认会蹦出一个视频窗口来.
貌似我们不能让他在指定的窗体中播放,那我们可以把他放在其他窗体中,作为子窗体.

IVideoWindow::put_Owner似乎是可以用的方法,但是它却又一些注意点和技巧.有些是MSDN没有提及的:

1. put_Owner方法必须在Stream流已经生存的情况下才能使用.一般在IGraphBuilder::RenderFile和IGraphBuilder::Run之间比较合适.

2. 利用IVideoWindow::put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);来让窗体看上去像是一个播放器的视频部分.当然还有IVideoWindow::SetWindowPosition方法

3. 在Filter Graph Manager的Release之前put_Owner为NULL.不然会很惨...(会给代替带来N多垃圾消息,详见MSDN)

高清电影中出现人声过小的问题的原因和解决

现象:用某些播放器播放电影时,出现背景声音非常大,人声非常小的问题.
这种问题在高清格式的电影上出现频率较高.

原因:正常的音频是双声道的.就是普通的立体声.比如大家常听的普通MP3.
事实上音频可以是多声道的.比如3~6个声道都是有可能的.高清格式为了保证音频的高质量,也通常采用多声道压缩.
比如AC3一般有6声道,DTS一般为5声道.
这些声道有中间声道和两边声道之分.一般中间声道担负的主要的人声(其他声道也有,不过主要做辅助用)
通常来说,电脑中的播放器播放多声道音频时,会把多声道转化为双声道.
但是有些播放器没有这么做.比如KMPlayer.结果只播放了两边声道.

解决:手动配置,使其将中间声道也混入两边声道.

Saturday, January 3, 2009

工具介绍 Microsoft Spy++

这是一个Visual Studio自带的工具. 这个工具什么时候有用呢?主要两种情况
1.编写要操作其他程序的程序.
2.是想观察其他程序的窗口属性,分析它是怎么实现的.

以前在不熟悉windows操作系统结构的时候,想编写一些操作系统辅助程序,老是遇到一些奇奇怪怪的问题.
时间长了之后才明白Windows的窗体结构...是一棵树..
然而从这里就可以一目了然地看出来.

还可以查看窗体的STYLE和CLASS,不过这个程序还是有些问题的.STYLE可能显示不标准.尤其是组件的STYLE.


最上面的图中, 灰色的图标表示不可见的Window,蓝色的是可见Window(包括最小化的啥的..)
窗体太多,想判断哪个对应哪个不太容易, 最基础的方式是看名称.
对于有些窗体,可以使用窗体高亮的功能:


最绝的是打开窗体属性,看窗体位置...,哈哈,这个基本上是无误的.


同时它还可以查看各个进程和线程的属性的功能, 使用一下, 还是很实用的.