none
WM encoder SDk加载不了WMEncEng.dll RRS feed

  • 问题


  • 遇到一个刺手的问题,求助:
    现象描述:
      1.在用windows media encoder sdk做流媒体服务器时,通过对话框加载视频文件,然后广播出去,编译可以通过,在广播的时候,接收端可以接收,不过广播一段时间出现WMEncEng.dll文件未加载,出现如下错误:

    0x08680391 (WMEncEng.dll) (testmfcf.exe 中)处的第一机会异常:  0xC0000005:  读取位置 0x5387FDF0 时发生访问冲突。
    0x08680391 (WMEncEng.dll) (testmfcf.exe 中)处有未经处理的异常:  0xC0000005:  读取位置 0x5387FDF0 时发生访问冲突。


      2.当我把对话框程序,
    CFileDialog dlgFile(TRUE);

    if (dlgFile.DoModal() == IDOK)
    {
    }
    这段代码注释后,直接指定路径广播文件就没有以上问题,很奇怪,求大神帮助,阻滞了好几天了。


    2017年10月17日 8:30

答案

  • 我已经解决问题了,解决方法在对话框程序下加CoUninitialize()就可以了,可能在encoder使用com时,上面的com影响所致
    • 已标记为答案 xueyu人生 2017年10月17日 9:53
    2017年10月17日 9:52

全部回复

  • 本人采用的是在win7环境下通过vs2013开发的,以下是问题代码:

    void CtestmfcfDlg::OnBnClickedButton1()
    {/*
    HINSTANCE hDLL;
    hDLL = LoadLibrary(L"C:\\Program Files (x86)\\Windows Media Components\\Encoder\\WMEncEng.dll");
    if (!hDLL)
    {
    printf("error:empty\n");
    }*/


    CFileDialog dlgFile(TRUE);

    if (dlgFile.DoModal() == IDOK)
    {
    }

    }
    Initencoder();
    //pThreadPlay = AfxBeginThread(StartThreadForMfc, this);

    // TODO:  在此添加控件通知处理程序代码
    }


    void CtestmfcfDlg::Initencoder()
    {

    HRESULT hr;
    IWMEncSourceGroupCollection* pSrcGrpColl = NULL;
    IWMEncSourceGroup* pSrcGrp = NULL;
    IWMEncSource* pAudSrc = NULL;
    IWMEncSource* pVidSrc = NULL;
    IWMEncProfileCollection* pProColl = NULL;
    IWMEncProfile* pPro = NULL;
    IWMEncBroadcast* pBrdCst = NULL;
    IWMEncDataViewCollection* pPreviewColl = NULL;


    //IWMEncProfile* pPro = NULL;

    long lCount;
    short iAudCount, iVidCount;
    int i;


    // Initialize the COM library and retrieve a pointer
    // to an IWMEncoder interface.

    if (FAILED(hr = CoInitialize(NULL)))
    {
    printf("error::CoInitialize\n");
    }

    if (FAILED(hr = CoCreateInstance(CLSID_WMEncoder,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_IWMEncoder,
    (void**)&pEncoder)))
    {
    printf("error::CoCreateInstance\n");
    }


    // Retrieve a pointer to an IWMEncSourceGroupCollection
    // interface.

    if (FAILED(hr = pEncoder->get_SourceGroupCollection(&pSrcGrpColl)))
    {
    printf("error::get_SourceGroupCollection\n");
    }

    // Add a new source group to the collection.

    if (FAILED(hr = pSrcGrpColl->Add(CComBSTR("SG_1"), &pSrcGrp)))
    {
    printf("error::Add\n");
    }


    // Add an audio and avideo source to the source group.

    if (FAILED(hr = pSrcGrp->AddSource(WMENC_AUDIO, &pAudSrc)))
    {
    printf("error::AddSource\n");
    }
    if (FAILED(hr = pSrcGrp->AddSource(WMENC_VIDEO, &pVidSrc)))
    {
    printf("error::AddSource\n");
    }
    // Specify an .avi source file and a .wmv output file.
    CComBSTR bstrInFile("D:\\cat.rmvb");
    if (FAILED(hr = pAudSrc->SetInput(bstrInFile)))
    {
    printf("error::SetInput\n");
    }

    if (FAILED(hr = pVidSrc->SetInput(bstrInFile)))
    {
    printf("error::SetInput\n");
    }
    //below add for yangdong
    //IWMEncFile * pOutFile = NULL;
    //
    //hr = pEncoder->get_File(&pOutFile);
    //if (FAILED(hr))
    //{
    // printf("error8\n");
    //}
    //hr = pOutFile->put_LocalFileName(CComBSTR("C:\\OutputFile.wmv"));

    //if (FAILED(hr))
    //{
    // printf("error9\n");
    //}

    // You can also use the AutoSetFileSource method to automatically
    // parse a file and add the source streams to the source group.
    // hr = pSrcGrp->AutoSetFileSource(bstrInFile);

    // Loop through the profile collection and retrieve a specific
    // profile.
    if (FAILED(hr = pEncoder->get_ProfileCollection(&pProColl)))
    {
    printf("error::SetInput\n");
    }

    CComBSTR bstrName = NULL;
    if (FAILED(hr = pProColl->get_Count(&lCount)))
    {
    printf("error::SetInput\n");
    }

    IWMEncProfile2 * pPro2 = NULL;
    pPro2 = creatprofile();

    if (FAILED(hr = pSrcGrp->put_Profile(CComVariant(pPro2))))
    {
    printf("error::put_Profile\n");
    }


    if (FAILED(hr = CoCreateInstance(CLSID_WMEncPreview,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_IWMEncDataView,
    (void**)&pPreview)))
    {
    printf("error::CoCreateInstance pPreview\n");
    }


    // Retrieve the preview collection.

    if (FAILED(hr = pVidSrc->get_PreviewCollection(&pPreviewColl)))
    {
    printf("error::get_PreviewCollection\n");
    }


    // Add the preview object to the data view collection. If you set the
    // cookie to -1, the encoding process automatically generates a unique
    // cookie.



    if (FAILED(hr = pPreviewColl->Add(pPreview, &lCookie)))
    {
    printf("error::Add\n");
    }




    if (FAILED(hr = pEncoder->get_Broadcast(&pBrdCst)))
    {
    printf("error10\n");
    }
    ;

    // Select the 5th profile from the collection and set it into the source group.
    if (FAILED(hr = pBrdCst->put_PortNumber(WMENC_PROTOCOL_HTTP, 1226)))
    {
    printf("error11\n");
    }



    // Initialize the encoding process.
    if (FAILED(hr = pSrcGrp->PrepareToEncode(VARIANT_TRUE)))
    {
    printf("error::PrepareToEncode\n");
    }

    HWND hWnd = GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd();
    if (FAILED(hr = pPreview->SetViewSetting((DWORD)lCookie,
    sizeof(hWnd),
    (BYTE*)&hWnd)))
    {
    printf("error::SetViewSetting\n");
    }



    if (FAILED(pEncoder->Start()))
    printf("Unable to Start Encoding Process");

    if (FAILED(hr = pPreview->Start(lCookie)))
    {
    printf("Unable to Start Encoding lCookie");
    }

    printf("start end,,,,,,\n");

    if (pSrcGrpColl)
    {
    pSrcGrpColl->Release();
    pSrcGrpColl = NULL;
    }
    if (pSrcGrp)
    {
    pSrcGrp->Release();
    pSrcGrp = NULL;
    }
    if (pAudSrc)
    {
    pAudSrc->Release();
    pAudSrc = NULL;
    }
    if (pVidSrc)
    {
    pVidSrc->Release();
    pVidSrc = NULL;
    }
    if (pProColl)
    {
    pProColl->Release();
    pProColl = NULL;
    }
    if (pPro)
    {
    pPro->Release();
    pPro = NULL;
    }
    if (pBrdCst)
    {
    pBrdCst->Release();
    pBrdCst = NULL;
    }
    if (pPreviewColl)
    {
    pPreviewColl->Release();
    pPreviewColl = NULL;
    }


    }

    2017年10月17日 8:35
  • 求大神帮忙解决下,着急完成项目
    2017年10月17日 9:08
  • 我已经解决问题了,解决方法在对话框程序下加CoUninitialize()就可以了,可能在encoder使用com时,上面的com影响所致
    • 已标记为答案 xueyu人生 2017年10月17日 9:53
    2017年10月17日 9:52