次の方法で共有


手順 5: ビデオ機能を追加する

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

このトピックは、 DirectShow でのオーディオ/ビデオ再生に関するチュートリアルの手順 5 です。 完全なコードは、「 DirectShow 再生の例」トピックに示されています。

ビデオが正しく表示されるようにするには、アプリケーションが次のように WM_PAINTWM_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;
    }
}

Video Mixing Renderer Filter 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;
    }
}

Video Mixing Renderer Filter 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 フィルターの使用

ビデオ 混合レンダラーの使用