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.
Zugehörige Themen