Очистить окно предварительного просмотра в медиа-фонде - PullRequest
0 голосов
/ 30 октября 2018

Можно ли очистить окно предварительного просмотра после завершения предварительного просмотра с камеры? Я использую MFCaptureEngine, вызывая m_pPreview-> SetRenderHandle (m_hwnd) для рендеринга видео. Но когда я останавливаю видео, я не могу рисовать в окне. Там остается последний кадр от камеры. Мне нужно заполнить окно черной кистью и нарисовать текст, но изображение с камеры нельзя перерисовать.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Я реализовал это так:

// Sink
CComPtr<IMFCaptureSink> pSink;
m_pEngine->GetSink(MF_CAPTURE_ENGINE_SINK_TYPE_PREVIEW, &pSink);

CComPtr<IMFMediaSink> pCustomSink;
::MFCreateVideoRenderer(IID_IMFMediaSink, (void**)&pCustomSink);

CComPtr<IMFCapturePreviewSink> pPreviewSink;
pSink.QueryInterface(&pPreviewSink);
pPreviewSink->SetCustomSink(pCustomSink);

// preview
pSink.QueryInterface(&m_pPreview); // or pPreviewSink.QueryInterface(&m_pPreview)
m_pPreview->SetRenderHandle(m_hwndPreview);

Но поведение остается тем же (экран нельзя перерисовать после остановки предварительного просмотра).

0 голосов
/ 31 октября 2018

Непонятно, понятно из вашего ответа, что это MFCaptureManager, но по коду SetRenderHandle(m_hwnd) я вижу, что вы используете IMFCapturePreviewSink::SetRenderHandle. Итак, я могу сказать, что я столкнулся с подобной проблемой некоторое время назад, и это связано с различием между старой оконной системой, существующей в WinXP, и текущей оконной системой в Vista. Код устанавливает контекст окна для средства визуализации, вызывая IMFCapturePreviewSink::SetRenderHandle - для IMFCapturePreviewSink это DirectX11 - и DirectX11 получил полный доступ к окну и переключается на текущую оконную систему. В результате любой вызов fill the window by black brush and draw some text, который выполняется старым Windows API из поколения Win95-XP, ничего не делает - потому что контекст обработчика окна заблокирован DirectX11.

Существует три способа решения этой проблемы:

  1. Создать новый пользовательский интерфейс с помощью нового API-интерфейса Microsoft DirectComposition, основанного на DirectX11, и установить для него значение IMFCapturePreviewSink :: SetRenderSurface .
  2. Создать EVR Media Sink с помощью MFCreateVideoRenderer - он создает видео рендерер DirectX9, совместимый со старым Windows API из поколения Win95-XP, и задает этот IMFMediaSink в IMFCapturePreviewSink :: SetCustomSink .
  3. Создайте код видео рендерера на основе DirectX9 - например, MFCaptureD3D / device.cpp и извлеките необработанный IMFSample из обратного вызова IMFCapturePreviewSink :: SetSampleCallback .

Привет.

...