Я хочу закодировать кадры API дублирования рабочего стола для отправки по сети после кодирования их с помощью Media Foundation.Я застрял с ошибкой E_NOTIMPL, когда я вызываю IMFTransform :: ProcessInput, оставляя меня немного в неведении.
Это шаги, которые я делал до сих пор, я их подробно описываю, потому что это занялоУ меня есть дни, чтобы собрать все из скудной разбросанной информации по сети, поэтому, если она будет решена, то, надеюсь, поможет другим.Все ниже встречается с S_OK:
- Я получаю поверхность через API дублирования, создаю из нее IMFSample, используя MFCreateVideoSampleFromSurface
- Я получаю видеокодер с помощью IMFActivate:: ActivateObject из IMFActivate, инициализированный с помощью MFT_CATEGORY_VIDEO_ENCODER и MFVideoFormat_H264
- Я инициализирую IMFMediaType на входе с битрейтом, частотой кадров, соотношением сторон и т. Д. И, самое главное: MFVideoFormat_NV12, похоже, работает только сDXGI_FORMAT_B8G8R8A8_UNORM для API дублирования рабочего стола.
- Я устанавливаю IMFMediatype для вывода с тем же, что и выше, кроме MFVideoFormat_H264 как SUB_TYPE.
- Я вызываю IMFTransform :: thenOutputyIMFTransform :: SetInputType с приведенными выше цифрами 2.
- Я устанавливаю время IMFSample на 0, так как кажется, что оно не устанавливается MFCreateVideaSampleFromSurface.Также устанавливая SampleDuration с MFFrameRateToAverageTimePerFrame с входным FPS.
После всего этого я вызываю MFTransform :: ProcessInput с созданным выше IMFSample и получаю «E_NOTIMPL не реализовано» как HRESULT.Я прочитал, что должен установить IMFDXGIDeviceManager для моего кодировщика IMFTransform выше, поэтому я сделал это, используя:
- MFCreateDXGIDeviceManager из моего ID3D11Device, используемого с API дублирования рабочего стола и произвольным токеном сброса.
- Выполнение IMFDXGIDeviceManager :: ResetDevice с устройством и токеном.
- Вызов IMFTransform :: ProcessMessage (MFT_MESSAGE_SET_D3D_MANAGER, reinterpret_cast (m_pDXDeviceManager 1027 * * 10 * последний * 10 * * * * 10 * последний * 28 * 10 * *) * * * * * 10 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * *Я получаю еще один «E_NOTIMPL не реализован» на моем HRESULT, и именно здесь я больше не знаю, что я делаю неправильно или что нужно сделать.