Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио- и видеозахватом в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы в новом коде по возможности использовались MediaPlayer, IMFMediaEngine и аудио- и видеозахват в "Media Foundation" вместо DirectShow. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
В этом разделе описывается шаг 5 руководства воспроизведение звука и видео в DirectShow. Полный код показан в разделе примере воспроизведения DirectShow.
Чтобы убедиться, что видео отображается правильно, приложение должно реагировать на WM_PAINT, WM_SIZEи WM_DISPLAYCHANGE сообщения, как показано ниже.
Обработка сообщений WM_PAINT
Когда приложение получает сообщение WM_PAINT, возможно, потребуется перерисовка последнего кадра видео. Для фильтра расширенного видеообрисовщика (EVR) вызовите IMFVideoDisplayControl::RepaintVideo.
HRESULT CEVR::Repaint(HWND hwnd, HDC hdc)
{
if (m_pVideoDisplay)
{
return m_pVideoDisplay->RepaintVideo();
}
else
{
return S_OK;
}
}
Для фильтра видеосмешивания Видеоадаптера 9 (VMR-9) вызовите IVMRWindowlessControl9::RepaintVideo.
HRESULT CVMR9::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Для фильтра преобразования видео под номером 7 (VMR-7) вызовите IVMRWindowlessControl::RepaintVideo.
HRESULT CVMR7::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Обработка сообщений WM_SIZE
Если размер окна видео изменяется, сообщите отрисовщику видео, чтобы изменить размер видео. Для EVR используйте IMFVideoDisplayControl::SetVideoPosition.
HRESULT CEVR::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pVideoDisplay == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pVideoDisplay->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pVideoDisplay->SetVideoPosition(NULL, &rc);
}
}
Для VMR-9 вызовите IVMRWindowlessControl9::SetVideoPosition.
HRESULT CVMR9::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pWindowless == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pWindowless->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pWindowless->SetVideoPosition(NULL, &rc);
}
}
Для VMR-7 вызовите IVMRWindowlessControl::SetVideoPosition.
HRESULT CVMR7::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pWindowless == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pWindowless->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pWindowless->SetVideoPosition(NULL, &rc);
}
}
Обработка сообщений WM_DISPLAYCHANGE
Если режим отображения изменяется, необходимо уведомить фильтр VMR-9 или VMR-7. Для VMR-9 вызов IVMRWindowlessControl9::DisplayModeChanged.
HRESULT CVMR9::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
Для VMR-7 вызовите IVMRWindowlessControl::DisplayModeChanged.
HRESULT CVMR7::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
EVR не должен получать уведомления при изменении режима отображения.
Далее: Шаг 6: Обработка событий графа.
Связанные разделы