手順 5: ビデオ機能を追加する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
このトピックは、 DirectShow でのオーディオ/ビデオ再生に関するチュートリアルの手順 5 です。 完全なコードは、「 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;
}
}
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: グラフ イベントを処理する。
関連トピック