2015-12-04 2 views
1

Я использую IMFMediaEngine для воспроизведения потокового видео (Smooth Streaming, HLS) и, возможно, с PlayReady позже.IMFMediaEngine всегда работает в разрешении 640x480 с использованием DirectComposition

Он прекрасно работает с использованием TransferVideoFrame, чтобы нарисовать видео на текстуре. Но я понимаю, что это требование для видео PlayReady + DRM + 1080p, для использования DirectComposition. Поэтому я пытаюсь сделать это.

Также еще одно преимущество сделать это таким образом, рендеринг видеофрагмента не зависит от приложения, поэтому возможное заикание или отставание в пользовательском интерфейсе приложения не повлияет на воспроизведение видео.

Я могу заставить его работать, но, к сожалению IDCompositionVisual Я использую всегда в конечном итоге ограничивается 640х480. Таким образом, видео должно уменьшаться до него. Тогда, если я преобразую это, чтобы масштабировать его, я получаю уродливое растянутое изображение.

Я регистрация Визуальные так:

pMediaAttributes->SetUnknown(MF_MEDIA_ENGINE_PLAYBACK_VISUAL, m_pDcompVideoVisual); 

Как указано здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/hh162850(v=vs.85).aspx

Попытки создать поверхность перед и SetContent на зрительном ничего не изменится. Это похоже на то, что видеопроигрыватель переопределяет его с собственной поверхностью, 640x480. Было бы неплохо прикрепить его к простому игроку и найти реальное решение этой проблемы и указать размер визуальной поверхности, когда я получил событие MF_MEDIA_ENGINE_EVENT_FORMATCHANGE.

Поскольку это опция в IMFMediaEngine для указания поверхности DirectComposition, должен быть способ сделать эту работу.

ответ

0

На основании документации я вижу для IMFMediaEngine, вы должны быть в состоянии обрабатывать DRM защищенный контент, используя IMFMediaEngineProtectedContent->TransferVideoFrame:

«Для защищенного содержимого, вызовите этот метод вместо метода IMFMediaEngine :: TransferVideoFrame.»

Нечто подобное может пойти в VideoPlayer :: CaptureFrame метод выборки вы предоставили:

// Transfer the frame to the texture 
auto pIMFMediaEngineUnknown = reinterpret_cast<IUnknown *>(m_pMediaEngine); 
IMFMediaEngineProtectedContent *temp = 0; 
pIMFMediaEngineUnknown->QueryInterface(IID_PPV_ARGS(&temp)); 
DWORD flags = 0; 
HRESULT ret = temp->TransferVideoFrame(m_pRenderTarget, &videoRect, &targetRect, &borderColor, &flags); 
temp->Release(); 

//HRESULT ret = m_pMediaEngine->TransferVideoFrame(m_pRenderTarget, &videoRect, &targetRect, &borderColor); 
assert(ret == S_OK && "Failed to transfer video frame"); 

Дайте этому выстрел с 1080р защищенный контент.

+0

Спасибо. Я действительно получил поддержку Microsoft, и они сказали то же самое. По какой-то причине DirectComposition перестала работать с Windows10 XboxOne. Требование DRM не было техническим, но, очевидно, не было написано. Поэтому программист никогда не будет манипулировать фреймом напрямую. Мы поднимаем вопрос выше, чтобы убедиться, что это все еще так. Между тем, спасибо за ответ, что это правильный способ сделать это. –