5th
一、COM组件初始化
如果在多线程环境中使用COM组件,应使用CoInitializeEx函数加COINIT_MULTITHREADED标志而非CoInitialize函数对COM组件初始化。
二、bmp文件格式
to be continued
三、时间单位
1秒 = 1000毫秒 = 1000微妙 = 1000纳秒 = 1000皮秒
两个GetTickCount函数相减的时间差单位为毫秒(milliseconds)。
windows有相当一部分函数的时间参数单位为 100-nanosecond units,nanosecond即纳秒。1毫秒 = 10000 * 100-nanosecond units
千万注意数据越界的问题。1秒= 10000 * 1000 100-nanosecond units。2的32次方等于4294967296,仅能表示429秒。我就在使用以100-nanosecond units为参数的函数时栽过跟头。见以下代码:
/*错误代码*/ void Func(QWORD time);//函数申明,以100-nanosecond units为单位 DWORD videoTime = 500 * 1000;//500秒 Func(videoTime * 10000);//生成一个临时变量作为实参,它的类型为DWORD,越界了!
四、使用GDI+asf方式录屏的总结
微软有一套工具软件叫windows media encoder,用的就是这套SDK做的。
对带有视频播放的桌面录制时,如果视频编码使用WMMEDIASUBTYPE_MSS2(Video encoded with the Windows Media Video 9 Screen codec.),部分区域的颜色值会失真,且视频画面效果不佳,调节其他参数不能解决这两个问题。
使用WMV1格式,录制效果、文件大小都很不错。可惜在配置低的机器上CPU占用率几乎一直100%。
使用VM1格式并开启VBR模式后,可解决此问题。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743759(v=vs.85).aspx
我使用的是quality-based vbr。
注意,SDK中有许多get、set属性的函数,需要传入、传出参数的数据类型。DWORD是unsigned long,而WORD是unsigned short。使用WORD可能出现数据越界。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743759(v=vs.85).aspx
五、键盘钩子
to be continued
六、解决GDI截屏时没有鼠标问题
GetCursorPos
LoadCursor
GetIconInfo
DrawIcon
七
有时程序需要写一些临时文件,例如录制时音频、视频分开录制,合并后分录的文件就可以删除了。这些临时文件,程序自己负责创建、读写、删除。为了用户友好性考虑,不需要被用户看见,另外也在一定程度上避免被用户误操作。
GetTempPath
八
core audio interface MMDevice API 、waveIn、mixerAPI这三套API,获取到的音频设备名可能不同。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd371399(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743586(v=vs.85).aspx
九、《windows media编程向导》(附随书CD源码)
陆其明写的。此版电子书有缺页,但没多大关系,因为它大部分的内容其实就是翻译MSDN。重点看sample吧,另外WMFSDK上也有不少sample可供参考。
下载地址: