Freigeben über


Schritt 5: Hinzufügen von Videofunktionen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Dieses Thema ist Schritt 5 des Tutorials Audio-/Videowiedergabe in DirectShow. Der vollständige Code wird im Thema DirectShow-Wiedergabebeispiel angezeigt.

Um sicherzustellen, dass das Video ordnungsgemäß angezeigt wird, muss die Anwendung auf WM_PAINT-, WM_SIZE- und WM_DISPLAYCHANGE-Nachrichten wie folgt reagieren.

Behandeln WM_PAINT Nachrichten

Wenn die Anwendung eine WM_PAINT-Nachricht empfängt, muss der Videorenderer möglicherweise den letzten Videoframe neu zeichnen. Rufen Sie für den EVR-Filter ( Enhanced Video Renderer ) IMFVideoDisplayControl::RepaintVideo auf.

HRESULT CEVR::Repaint(HWND hwnd, HDC hdc)
{
    if (m_pVideoDisplay)
    {
        return m_pVideoDisplay->RepaintVideo();
    }
    else
    {
        return S_OK;
    }
}

Rufen Sie für den Video Mixing Renderer Filter 9 (VMR-9) IVMRWindowlessControl9::RepaintVideo auf.

HRESULT CVMR9::Repaint(HWND hwnd, HDC hdc)
{
    if (m_pWindowless)
    {
        return m_pWindowless->RepaintVideo(hwnd, hdc);
    }
    else
    {
        return S_OK;
    }
}

Rufen Sie für den Video Mixing Renderer Filter 7 (VMR-7) IVMRWindowlessControl::RepaintVideo auf.

HRESULT CVMR7::Repaint(HWND hwnd, HDC hdc)
{
    if (m_pWindowless)
    {
        return m_pWindowless->RepaintVideo(hwnd, hdc);
    }
    else
    {
        return S_OK;
    }
}

Behandeln von WM_SIZE Nachrichten

Wenn sich die Größe des Videofensters ändert, benachrichtigen Sie den Videorenderer, die Größe des Videos zu ändern. Rufen Sie für den EVR IMFVideoDisplayControl::SetVideoPosition auf.

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);
    }
}

Rufen Sie für VMR-9 IVMRWindowlessControl9::SetVideoPosition auf.

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);
    }
}

Rufen Sie für VMR-7 IVMRWindowlessControl::SetVideoPosition auf.

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);
    }
}

Behandeln von WM_DISPLAYCHANGE Nachrichten

Wenn sich der Anzeigemodus ändert, müssen Sie den VMR-9- oder VMR-7-Filter benachrichtigen. Rufen Sie für VMR-9 IVMRWindowlessControl9::D isplayModeChanged auf.

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

Rufen Sie für VMR-7 IVMRWindowlessControl::D isplayModeChanged auf.

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

Der EVR muss nicht benachrichtigt werden, wenn sich der Anzeigemodus ändert.

Weiter: Schritt 6: Behandeln von Graphereignissen.

Audio-/Videowiedergabe in DirectShow

DirectShow-Wiedergabebeispiel

Verwenden des DirectShow EVR-Filters

Verwenden des Videomischrenderers