MediaPlayer и MediaStreamSource на Hololens 2 - PullRequest
0 голосов
/ 08 июля 2020

У меня есть работающий декодер на основе MediaPlayer, который потребляет потоковое видео H264 из входящих кадров, используя MediaStreamSource и отвечая на запросы образцов из MediaStreamSource.SampleRequested. Это интегрировано в Unity, чтобы отображать эти кадры на IDirect3DSurface.

Я с радостью делаю 30 кадров в секунду на своем рабочем столе, но при работе на Hololens 2 я вижу только визуально около 5 кадров в секунду.

При этом у меня есть множество показателей внутри кода MediaPlayer, которые показывают, что запросы образцов, образцы разрешений / отсрочки и VideoFrameAvailable обратные вызовы все еще выполняются со скоростью 30 кадров в секунду, как на рабочем столе. Я не теряю кадры, это больше похоже на то, что фактически отображается только каждый X-кадр, а промежуточные - нет. Наконец, если я использую тест MediaSource, созданный из URI и проходящий через тот же конвейер, я действительно вижу 30 кадров в секунду на Hololens 2, так что, надеюсь, исключает проблемы с моей поверхностью / дисплеем logi c.

Я действительно вижу довольно большое количество _com_errors, возникающих внутри d3d11.dll CDecodeContext::BeginFrame при подключении отладчика, но они никогда не исправляют мой код и, возможно, безвредны? ref: https://social.microsoft.com/Forums/azure/fr-FR/f76a80db-3bf0-49b1-8c4f-4d3b90c03f94/how-to-track-down-comerrors?forum=winappswithnativecode

Существуют ли какие-либо известные проблемы с этим типом потоковой передачи, которые характерны c для Hololens 2?

Я могу опубликовать свой соответствующий код при необходимости, но код C ++ MediaPlayer довольно подробный, поэтому я воздержусь, если не требуется проверка c частей. Тот факт, что он так хорошо работает на рабочем столе, предполагает, что не может быть ничего СЛИШКОМ принципиально неправильного ... надеюсь ... это - дела идут хорошо! Это все больше и больше указывает на специфическую проблему c в реализации MediaPlayer Hololens 2?

1 Ответ

0 голосов
/ 13 июля 2020

После некоторой отладки и дальнейших исследований выяснилось, что действительно есть проблемы с производительностью при преобразовании YUV в BGRA на ARM64. Решением для меня было передать вывод IDirect3DSurface в формате DXGI_FORMAT_NV12 и сопоставить два представления ресурсов шейдера (один одноканальный 8 бит (DXGI_FORMAT_R8_UNORM) и один двухканальный 8 + 8 бит (DXGI_FORMAT_R8G8_UNORM)) для доступа к плоскостям Y и UV. Это позволяет выводить NV12 без каких-либо проблем с производительностью.

В моем случае я мог бы затем выполнить преобразование YUV в RGB самостоятельно на графическом процессоре в коде шейдера. был в документации ID3D12, но в равной степени применим к Direct3D 11: https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createshaderresourceview

...