ActivateObject: исключение необработанное - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь использовать Media Foundation Transforms и попадаюсь в ловушку, когда при использовании MFTEnumEx возвращаю 1 кодировщик и использую ActivateObject я получаю эту ошибку: Unhandled exception at 0x00007FF9C7084078 in endec.exe: Microsoft C++ exception: std::runtime_error at memory location 0x00000056FF75CC38. occurred при activate[0]->ActivateObject(IID_PPV_ARGS(&encoder))

Microsoft WindowsСервер 2016 ЦОД.10.0.14393 N / A Build 14393. x64.

Код:

IMFTransform* get_encoder() {
    ComPtr<IMFTransform> encoder = NULL;
    IMFActivate **activate = nullptr;

    uint32_t flags = MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SORTANDFILTER;

    // Unused for testing...
    MFT_REGISTER_TYPE_INFO input_info;// = NULL; // NULL pInputType means "match all"
    MFT_REGISTER_TYPE_INFO output_info;

    input_info.guidMajorType = MFMediaType_Video;
    input_info.guidSubtype = MFVideoFormat_ARGB32;

    output_info.guidMajorType = MFMediaType_Video;
    output_info.guidSubtype = MFVideoFormat_NV12;

    CLSID *clsids = NULL;
    uint32_t count = 0;
    _com_error error = NULL;

    //error = MFTEnum(MFT_CATEGORY_VIDEO_PROCESSOR, flags, input_info, &output_info, NULL, &clsids, &count);
    ThrowIfFailed(MFTEnumEx(MFT_CATEGORY_VIDEO_ENCODER, flags, NULL, NULL, &activate, &count), 
        &count, "Unexpected error occurred with finding encoders"); // <--- ERROR

    if (!count && !activate[0]) {
        cout << "Did not find any encoders...\n";
        return nullptr;
    }

    cout << "Number of encoders available: " << count << endl;

    if (!activate[0]) {
        cout << "Couldn't get a valid activate obj\n";
    }

    ThrowIfFailed(activate[0]->ActivateObject(IID_PPV_ARGS(&encoder)), &flags,
        "Wasn't able to activate encoder");

    return encoder.Get();
}

Локальные переменные во время исключения:

+       activate    0x0000016ebc24db20 {0x0000016ebdb1d950 {...}}   IMFActivate * *
+       clsids  0x0000000000000000 <NULL>   _GUID *
        count   1   unsigned int
+       encoder 0x0000000000000000 <NULL>   Microsoft::WRL::ComPtr<IMFTransform>
+       error   {S_OK}  _com_error
        flags   68  unsigned int
+       input_info  {guidMajorType={73646976-0000-0010-8000-00AA00389B71} guidSubtype={00000015-0000-0010-8000-00AA00389B71} }  __MIDL___MIDL_itf_mfobjects_0000_0008_0003
+       output_info {guidMajorType={73646976-0000-0010-8000-00AA00389B71} guidSubtype={3231564E-0000-0010-8000-00AA00389B71} }  __MIDL___MIDL_itf_mfobjects_0000_0008_0003```

1 Ответ

1 голос
/ 11 марта 2019

Вы вызывали CoInitializeEx и MFStartup?

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

и

HRESULT hr = MFStartup(MF_VERSION, MFSTARTUP_LITE);

Это пример, используйте необходимые параметры.

Как минимум, вам нужен CoInitializeEx дляваша функция "get_encoder".

Возможно, Microsoft Windows Server 2016 Datacenter не может выполнить аппаратное кодирование из-за конфигурации аппаратного и программного обеспечения, даже если зарегистрирован аппаратный кодер.

Например,некоторые мультимедийные сервисы не работают.

...