2009-05-05 53 views
-1

我正在引用下面的文檔部分「用於捕獲屏幕的Windows媒體API」來捕獲屏幕,原始代碼工作正常。當我添加額外的功能(我只是添加了幾行來使它從默認音頻設備記錄),它在下面的行失敗(我調試,看起來像COM層失敗?),任何提示?我發佈了原始源代碼和修改後的源代碼。無法使用Windows媒體編碼器設置默認音頻設備

「如果(FAILED(HR = pSrcGrp-> put_Profile(variant_t(pProfile))))」

http://www.geocities.com/krishnapg/screencap.html

原始源代碼:

http://www.geocities.com/krishnapg/WMEncScrnCap.zip

我的已修改源代碼(我只修改函數InitEncoder)

HRESULT InitEncoder(LPCTSTR szOutputFileName) 
{ 
    HRESULT hr = E_FAIL; 
    CComVariant varValue; 
    IWMEncSourceGroupCollection* pSrcGrpCollection=NULL; 
    IWMEncSourceGroup* pSrcGrp=NULL; 
    IWMEncSource* pSrc=NULL; 
    IWMEncSource* paSrc=NULL; 
    IPropertyBag* pPropertyBag=NULL; 
    IWMEncVideoSource2* pSrcVid=NULL; 
    IWMEncAudioSource* pSrcAud=NULL; 
    IWMEncFile* pOutFile=NULL; 
    IWMEncProfile* pProfile=NULL; 

    if(FAILED(CoCreateInstance(CLSID_WMEncoder,NULL,CLSCTX_INPROC_SERVER,IID_IWMEncoder2,(void**)&g_pEncoder))) 
    { 
     ErrorMessage("Unable to Create Encoder Object"); 
     return E_FAIL; 
    } 
    if(FAILED(g_pEncoder->get_SourceGroupCollection(&pSrcGrpCollection)))  //Retrieve the Source Group Collection - One Application can Have many Source Groups - We need to add as many as we want 
    { 
     ErrorMessage("Unable to Get Source Group Collection"); 
     return E_FAIL; 
    } 

    do 
    { 
     if(FAILED(hr=pSrcGrpCollection->Add(CComBSTR("SourceGroup1"),&pSrcGrp)))//Add a Source Group to the Collection - Each Source can have one video one audio source input 
     { 
      ErrorMessage("Unable to Add A Source Group to the Collection"); 
      break; 
     } 
     if(FAILED(hr=pSrcGrp->AddSource(WMENC_VIDEO,&pSrc)))     //Add a Video Source to the Group 
     { 
      ErrorMessage("Unable to Add A Source to the Source Group"); 
      break; 
     } 
     if(FAILED(hr=pSrcGrp->AddSource(WMENC_AUDIO,&paSrc)))     //Add an Audio Source to the Group 
     { 
      ErrorMessage("Unable to Add A Source to the Source Group"); 
      break; 
     } 
     if(FAILED(hr=pSrc->QueryInterface(IID_IWMEncVideoSource2,(void**)&pSrcVid))) 
     { 
      ErrorMessage("Unable to Query interface for Video Source"); 
      break; 
     } 
     if(FAILED(hr=paSrc->QueryInterface(IID_IWMEncAudioSource,(void**)&pSrcAud))) 
     { 
      ErrorMessage("Unable to Query interface for Audio Source"); 
      break; 
     } 
     if(FAILED(hr=pSrcVid->SetInput(CComBSTR("ScreenCap://ScreenCapture1"))))//The Video Input Source Device - Should be "ScreenCap" Device 
     { 
      ErrorMessage("Unable to Set Video Input Source"); 
      break; 
     } 
     if(FAILED(hr=pSrcAud->SetInput(CComBSTR("Device://Default_Audio_Device"))))//The Video Input Source Device - Should be "Default_Audio_Device" Device 
     { 
      ErrorMessage("Unable to Set Audio Input Source"); 
      break; 
     } 
     if(FAILED(hr=pSrcVid->QueryInterface(IID_IPropertyBag,(void**)&pPropertyBag))) 
     { 
      ErrorMessage("Unable to Query Interface for Propery bag"); 
      break; 
     } 

     varValue = CAPTURE_FULLSCREEN; 
     if(FAILED(hr=pPropertyBag->Write(WMSCRNCAP_ENTIRESCREEN,&varValue))) //Set Full Screen Property true/false 
     { 
      ErrorMessage("Unable to Set Capture Screen Property"); 
      break; 
     } 
     //int nLeft, nRight, nTop, nBottom;         //Set Capture Area - when not in full screen mode 
     //                 // Initialize the capture area. The size must be even. 
     // varValue = false; 
     // if (SUCCEEDED(hr)) 
     // { 
     //  hr = pPropertyBag->Write(WMSCRNCAP_ENTIRESCREEN, &varValue); 
     // } 
     // varValue = nLeft; 
     // if (SUCCEEDED(hr)) 
     // { 
     //  hr = pPropertyBag->Write(WMSCRNCAP_WINDOWLEFT, &varValue); 
     // } 
     // varValue = nRight; 
     // if (SUCCEEDED(hr)) 
     // { 
     //  hr = pPropertyBag->Write(WMSCRNCAP_WINDOWRIGHT, &varValue); 
     // } 
     // varValue = nTop; 
     // if (SUCCEEDED(hr)) 
     // { 
     //  hr = pPropertyBag->Write(WMSCRNCAP_WINDOWTOP, &varValue); 
     // } 
     // varValue = nBottom; 
     // if (SUCCEEDED(hr)) 
     // { 
     //  hr = pPropertyBag->Write(WMSCRNCAP_WINDOWBOTTOM, &varValue); 
     // } 
     // varValue = true; 
     // if (SUCCEEDED(hr)) 
     // { 
     //  hr = pPropertyBag->Write(WMSCRNCAP_FLASHRECT, &varValue); 
     // } 

     if(FAILED(hr=SetupScreenCaptureProfile()))         //Setup the Custom Profile 
     { 
      break; 
     } 
     if(FAILED(hr=g_pProfile->QueryInterface(IID_IWMEncProfile,(void**)&pProfile))) 
     { 
      ErrorMessage("Unable to Query Interface For Profile"); 
      break; 
     } 
     if(FAILED(hr=pSrcGrp->put_Profile(variant_t(pProfile))))     //Select the Custom Profile into the Encoder  
     { 
      ErrorMessage("Unable to Set Profile For Source Group"); 
      break; 
     } 
     if(FAILED(hr=g_pEncoder->get_File(&pOutFile))) 
     { 
      ErrorMessage("Unable to Get Encoder Output File Object"); 
      break; 
     } 
     if(FAILED(hr=pOutFile->put_LocalFileName(CComBSTR(szOutputFileName))))  //Set the Target Output Filename 
     { 
      ErrorMessage("Unable to Set Output File Name"); 
      break; 
     } 
     if(FAILED(hr=g_pEncoder->PrepareToEncode(VARIANT_TRUE)))     //Using Prepare optimizes startig latency 
     { 
      ErrorMessage("Unable to Prepare for Encoding"); 
      break; 
     } 
    }while(false); 

    if(pProfile) 
    { 
     pProfile->Release(); 
     pProfile=NULL; 
    } 
    if(pOutFile) 
    { 
     pOutFile->Release(); 
     pOutFile = NULL; 
    } 
    if(pPropertyBag) 
    { 
     pPropertyBag->Release(); 
     pPropertyBag = NULL; 
    } 
    if(pSrcVid) 
    { 
     pSrcVid->Release(); 
     pSrcVid = NULL; 
    } 
    if(pSrc) 
    { 
     pSrc->Release(); 
     pSrc = NULL; 
    } 
    if(pSrcGrp) 
    { 
     pSrcGrp->Release(); 
     pSrcGrp = NULL; 
    } 
    if(pSrcGrpCollection) 
    { 
     pSrcGrpCollection->Release(); 
     pSrcGrpCollection = NULL; 
    } 
    return hr; 
} 
+0

故障代碼是非常重要的 - 在這裏不提供。配置文件參數可能不正確 - 「SetupScreenCaptureProfile」沒有顯示準​​確的準備。 – 2014-05-31 13:44:48

回答

0

你的代碼可能沒有問題。 Windows Vista由於無法以編程方式設置輸出/輸入而臭名昭着。

2

您可能需要重置音頻:

打開控制面板 - >打開聲音

播放,你會看到你的揚聲器作爲默認播放。它

右擊 - >去屬性 - >轉到高級標籤 - >點擊恢復默認

+0

完全不相關的問題。 – 2014-05-31 13:45:52

相關問題