% \6 m) D7 {$ o; [! b' c; h4 ^6 }" UIWMEncProfile2* g_pProfile=NULL; 9 o/ ]* p% b* p+ S6 \3 U$ `* [
1 V% |8 ?# v5 l% [2 C
CoCreateInstance(CLSID_WMEncProfile2,NULL,CLSCTX_INPROC_SERVER, $ O; L: D3 q2 J$ H2 o/ s9 }# P2 c5 M. a4 z7 Y6 A" Y
IID_IWMEncProfile2,(void**)&g_pProfile); 1 L! |2 a) B$ U
/ `, z8 W) t2 y; a# B+ ?$ c3 R" P我需要在profile里指定编码器的听众(audience)。每个profile可以包含多个听众配置,它们是IWMEncAudienceObj接口对象。这里我们为profile使用一个听众。我们可以通过IWMEncProfile::AddAudience()为我们的profile创建听众,这个函数返回一个IWMEncAudienceObj指针,可以用来配置视频编码器(IWMEncAudienceObj::put_VideoCodec()),视频帧对象(IWMEncAudienceObj::put_VideoHeight() 和IWMEncAudienceObj::put_VideoWidth())我们用下面的代码来配置视频编码器: ! c5 X' x' k n) ~$ h6 P7 m + f/ K) U" x0 z8 Hextern IWMEncAudienceObj* pAudience; * Z, A# |- B/ N4 \# o ) U# n7 _2 j" B* I) \#define VIDEOCODEC MAKEFOURCC('M','S','S','2') - V7 x8 r6 X) Z! z$ v
9 ~6 p3 p) P4 ~, A% t, o
//MSS2 is the fourcc for the screen codec % z+ Y0 D$ Q2 R$ B% K! @! A
1 h5 p0 a. @5 k, o
- S3 ^2 r6 f w \+ S$ F2 V" x+ g6 t/ U
long lCodecIndex=-1; - K5 N1 i+ [) O# n8 k
% F2 \9 W/ w( U' P
g_pProfile->GetCodecIndexFromFourCC(WMENC_VIDEO,VIDEOCODEC, # N* z; v0 _5 i' ~5 F0 w; D
* b/ L2 J$ U" p# n
&lCodecIndex); //Get the Index of the Codec ' L; g4 v- S* i5 N1 d8 O
* o, b- d( w. K( h7 MpAudience->put_VideoCodec(0,lCodecIndex); 7 v P4 A- V* s6 ? @3 l1 W
) V% F' v( e: e: Z( \ & f+ \1 h: v& ~ ' U. \; A! u! k9 T& c" vfourcc是针对每个编码器的唯一的标识,Windows Media Video 9 Screen codec的fourcc为MSS2。IWMEncAudienceObj::put_VideoCodec()接受profile索引来组织一个profile,索引可以用IWMEncProfile::GetCodecIndexFromFourCC()取得。 0 w' Z* p* ~& y. E2 Q6 w' o
2 y/ ]& @' I/ T' C; X' I& B
7 W4 Y0 R- ~$ O+ d& R) G
7 W G f- B8 y: q0 F3 @8 p一旦我们配置完毕一个profile对象,我们就可以用IWMEncSourceGroup :: put_Profile()选择这个profile到我们的编码器。一个源组(SourceGruop)是一组视频流来源或音频流来源,或html来源。每个编码器可以使用许多源组,并从中取得输入数据。由于我们的程序仅仅使用视频流中是视频来源。这个视频来源需要用IWMEncVideoSource2::SetInput(BSTR) Screen Device来配置为输入来源: 0 _1 n2 Z: u; C0 U1 N1 Q0 O
# L3 K: I2 x+ K! K1 U, B% L8 c
( g/ ^( B, v$ v8 n+ o# M i0 M- s2 z9 f! J
extern IWMEncVideoSource2* pSrcVid; ! C1 M |6 z% t' N) d6 ~- ~* N/ I3 L8 s# \
pSrcVid->SetInput(CComBSTR("ScreenCap://ScreenCapture1"); ( ?5 Y2 j: L0 D4 c- Y* w \; [* c) v$ y