Шаг 5. Добавление функций видео

[Функция, связанная с этой страницей, 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: Обработка событий графа.

Аудио/видео воспроизведение в DirectShow

Пример воспроизведения с использованием DirectShow

Использование фильтра EVR DirectShow

Использование смешивающего рендерера видео