使用windows media encoder sdk V9.0 (wMencsdk/wm encoder/wmencoder)。
////稍作改进可以1)抓桌面,实现远程桌面监视 2)保存视频文件到wmv 3)drm加密.
/////此代码由于非法使用(如木马控制)所造成的损失与本人无关。
#include <windows.h>
#include <atlbase.h>
#include "wmencode.h"
#include "wmencvu.h"
////author: http://hi.baidu.com/it_security ,by qq;14627999
////date: 2009/3/10
////usage: 1)compile the code,2)running it, 3)run wmplayer,open: mms://xxx.xxx.xx.xx:1225
//// then you can watch mms realtime video from this program is running.
encoder/wmencoder)
HRESULT hr;
IWMEncoder2 *pEncoder; //编码器对象
IWMEncSourceGroupCollection* pSrcGrpColl;
IWMEncSourceGroup* pSrcGrp;
IWMEncSource* pSrcAud;
IWMEncSource* pSrcVid;
IWMEncProfileCollection* pProColl;
IWMEncProfile* pPro;
IWMEncBroadcast* pBrdCst;
bool IsVideo()
{
IWMEncSourcePluginInfoManager* pSrcPlugMgr;
IWMEncDeviceControlPluginInfoManager* pDCPlugMgr;
IWMEncPluginInfo* pPlugInfo;
int i;
int j;
bool IsC = false;
long lCount;
long lResrcCount;
CComBSTR sScheme;
CComBSTR sName;
VARIANT_BOOL bResources;
// 初始化COM让其指向一个IWMEncoder接口
hr = CoInitialize(NULL);
if ( SUCCEEDED( hr ) )
{
hr = CoCreateInstance(CLSID_WMEncoder,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWMEncoder2,
(void**) &pEncoder);
}
//从IWMEncoder中找回源和设备信息管理的目标
if ( SUCCEEDED( hr ) )
{
hr = pEncoder->get_SourcePluginInfoManager(&pSrcPlugMgr);
}
if ( SUCCEEDED( hr ) )
{
hr = pEncoder->get_DeviceControlPluginInfoManager(&pDCPlugMgr);
}
//循环找出音频和视频设备
if ( SUCCEEDED( hr ) )
{
hr = pSrcPlugMgr->get_Count(&lCount);
}
for (i = 0; i < lCount; i++)
{
// Set the IWMEncPluginInfo object to the current plug-in.
if ( SUCCEEDED( hr ) )
{
hr = pSrcPlugMgr->Item(i, &pPlugInfo);
}
// Find the plug-ins that support resources.
if ( SUCCEEDED( hr ) )
{
hr = pPlugInfo->get_SchemeType(&sScheme);
}
if (_wcsicmp(sScheme, CComBSTR("DEVICE"))==0)
{
// 找出设备
if ( SUCCEEDED( hr ) )
{
hr = pPlugInfo->get_Resources(&bResources);
}
if (bResources==VARIANT_TRUE)
{
// 循环找出资源
if ( SUCCEEDED( hr ) )
{
hr = pPlugInfo->get_Count(&lResrcCount);
}
for (j = 0; j < lResrcCount; j++)
{
// 找到设备名称并添加到sName中
if ( SUCCEEDED( hr ) )
{
hr = pPlugInfo->Item(j, &sName);
}
if(sName == CComBSTR("Default_Video_Device"))
{
IsC = true;//判断是否有视频捕获设备
}
}
}
}
}
// Release pointers.
if ( pSrcPlugMgr )
{
pSrcPlugMgr->Release();
pSrcPlugMgr = NULL;
}
if ( pDCPlugMgr )
{
pDCPlugMgr->Release();
pDCPlugMgr = NULL;
}
if ( pPlugInfo )
{
pPlugInfo->Release();
pPlugInfo = NULL;
}
return IsC;
}
/*
初始化
*/
int InitCapture()
{
hr = CoCreateInstance(CLSID_WMEncoder,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWMEncoder2,
(void**) &pEncoder
);
// Retrieve a pointer to an IWMEncSourceGroupCollection interface.
if ( SUCCEEDED( hr ) )
{
hr = pEncoder->get_SourceGroupCollection(&pSrcGrpColl);
}
// Add a source group to the collection.
if ( SUCCEEDED( hr ) )
{
hr = pSrcGrpColl->Add(CComBSTR("SG_1"), &pSrcGrp);
}
// Add a video source and an audio source.
if ( SUCCEEDED( hr ) )
{
hr = pSrcGrp->AddSource(WMENC_VIDEO, &pSrcVid);
}
if ( SUCCEEDED( hr ) )
{
hr = pSrcGrp->AddSource(WMENC_AUDIO, &pSrcAud);
}
// Specify the sources.
if ( SUCCEEDED( hr ) )
{
hr = pSrcVid->SetInput(CComBSTR("Device://default_video_device"));
}
if ( SUCCEEDED( hr ) )
{
hr = pSrcAud->SetInput(CComBSTR("Device://default_audio_device"));
}
// Specify the output.
if ( SUCCEEDED( hr ) )
{
hr = pEncoder->get_Broadcast(&pBrdCst);
}
if ( SUCCEEDED( hr ) )
{
hr = pBrdCst->put_PortNumber(WMENC_PROTOCOL_HTTP, 1225);
}
// Select the 5th profile from the collection and set it into the source group.
if ( SUCCEEDED( hr ) )
{
hr = pEncoder->get_ProfileCollection(&pProColl);
}
if ( SUCCEEDED( hr ) )
{
hr = pProColl->Item(4, &pPro);
}
if ( SUCCEEDED( hr ) )
{
hr = pSrcGrp->put_Profile(CComVariant(pPro));
}
return 1;
}
/*
开始编码
*/
int Start()
{
if( SUCCEEDED(pEncoder->Start()) )
{
return 1;
}
return 0;
}
/*
停止编码
*/
int Stop()
{
if ( SUCCEEDED(pEncoder->Stop()) )
{
if ( pSrcGrpColl )
{
pSrcGrpColl->Release();
pSrcGrpColl = NULL;
}
if ( pSrcGrp )
{
pSrcGrp->Release();
pSrcGrp = NULL;
}
if ( pSrcAud )
{
pSrcAud->Release();
pSrcAud = NULL;
}
if ( pSrcVid )
{
pSrcVid->Release();
pSrcVid = NULL;
}
if ( pProColl )
{
pProColl->Release();
pProColl = NULL;
}
if ( pPro )
{
pPro->Release();
pPro = NULL;
}
if ( pEncoder )
{
pEncoder->Release();
pEncoder = NULL;
}
return 1;
}
else
{
return 0;
}
}
void main()
{
IsVideo();
InitCapture();
Start();
system("pause");
}