Поделиться через


Шаг 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::D isplayModeChanged.

HRESULT CVMR9::DisplayModeChanged()
{
    if (m_pWindowless)
    {
        return m_pWindowless->DisplayModeChanged();
    }
    else
    {
        return S_OK;
    }
}

Для VMR-7 вызовите МЕТОД IVMRWindowlessControl::D isplayModeChanged.

HRESULT CVMR7::DisplayModeChanged()
{
    if (m_pWindowless)
    {
        return m_pWindowless->DisplayModeChanged();
    }
    else
    {
        return S_OK;
    }
}

EvR не нужно уведомлять при изменении режима отображения.

Далее : Шаг 6. Обработка событий Графа.

Воспроизведение звука и видео в DirectShow

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

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

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