; O: p' ?6 Z+ S : b1 S: x8 B3 m& t ) U! ]! F' l" ?3 ~捕获程序要点:+ M+ v* Z; s) ?! P( H
9 J. Z( N0 G9 S U' u3 H 程序初始化的时候需要初始化相关资源,在WM_CREATE消息中初始化D3D,然后初始化FFMPEG,同时启动定时器;当用户选择开始捕获的时候,每次定时器到,处理WM_TIMER消息,锁定前端缓冲平面,然后拷贝数据到缓冲区,将该缓冲区传递给FFMPEG编码并输出;当用户停止的时候,停止定时器,清理D3D和FFMPEG,然后退出。下面是几个需要注意的技术点:2 B' ^0 k7 F3 j* J5 H
}5 s9 ~0 ]0 S4 f k3 N; h1)屏幕的颜色深度,由于屏幕可能处于不同的颜色深度下,所以需要仔细区分,当GetDeviceCaps函数返回颜色深度为16的时候,需要区分是否RGB555或者RGB565,根据颜色深度来设定传递给FFMPEG的像素格式。 9 F0 k3 t; |% ?4 H# `0 V/ t3 o1 V: e. C# \; m* R6 V* X
2)编码参数的设定,由于编码库支持的图像大小不是任意的,所以需要仔细的设置编码参数,否则不能初始化编码器。 # S( S1 H Z; X 8 f1 Y% r& [/ [) E, i3)图像转换的设定,由于原图像和目的图像的色彩空间和大小都不一样,所以需要仔细考虑图像转换,色彩空间的转换可以用img_convert,大小的转换可以用img_resample,注意到大小转换只针对YUV420P,所以在本案例中是先转换色彩空间,从RGBA32转换到YUV420P,然后调用重采样函数改变大小。5 K7 F7 u4 i" z1 x, A0 {