Кодирование поверхности D3D, полученной с помощью дублирования рабочего стола, с использованием Media Foundation - PullRequest
1 голос
/ 01 июня 2019

Я хочу закодировать кадры 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, и именно здесь я больше не знаю, что я делаю неправильно или что нужно сделать.

1 Ответ

0 голосов
/ 04 июня 2019

Первое, что нужно сделать, это проверить, является ли ваш кодировщик MF_SA_D3D11_AWARE

Я думаю, что нет, читая это: MFT_MESSAGE_SET_D3D_MANAGER

Если MFT не поддерживает это сообщение, оно должно вернуть E_NOTIMPL

Но странно одно: Поверхностный буфер DirectX

Вызовите IMFMediaBuffer :: Lock. Как правило, это не рекомендуется, так как заставляет объект копировать память с поверхности Direct3D, а затем обратно.

ProcessInput должен был сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...