远程音视频(摄像头、麦克风)监控(amccap)/mms流媒体直播服务器编程实现

本文介绍如何使用 Windows Media Encoder SDK V9.0 实现远程音视频监控及流媒体直播服务。通过代码示例展示了从初始化编码器、设置音视频源到启动直播的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://hi.baidu.com/it_security/blog/item/315f36d0f382eadb562c8474.html

远程音视频(摄像头、麦克风)监控(amccap)/mms流媒体直播服务器编程实现
2009-03-10 00:41

使用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");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值