Langkah 6: Kontrol Pemutaran
Topik ini adalah langkah 6 dari tutorial Cara Memutar File Media dengan Media Foundation. Kode lengkap ditampilkan dalam topik Contoh Pemutaran Sesi Media.
Topik ini berisi bagian berikut:
- Memulai Pemutaran
- Menjeda Pemutaran
- Menghentikan Pemutaran
- Mengecat Ulang Jendela Video
- Mengubah ukuran Jendela Video
- Topik terkait
Memulai Pemutaran
Untuk memulai pemutaran, panggil IMFMediaSession::Start. Kode berikut menunjukkan cara memulai dari posisi pemutaran saat ini.
// Start playback from the current position.
HRESULT CPlayer::StartPlayback()
{
assert(m_pSession != NULL);
PROPVARIANT varStart;
PropVariantInit(&varStart);
HRESULT hr = m_pSession->Start(&GUID_NULL, &varStart);
if (SUCCEEDED(hr))
{
// Note: Start is an asynchronous operation. However, we
// can treat our state as being already started. If Start
// fails later, we'll get an MESessionStarted event with
// an error code, and we will update our state then.
m_state = Started;
}
PropVariantClear(&varStart);
return hr;
}
// Start playback from paused or stopped.
HRESULT CPlayer::Play()
{
if (m_state != Paused && m_state != Stopped)
{
return MF_E_INVALIDREQUEST;
}
if (m_pSession == NULL || m_pSource == NULL)
{
return E_UNEXPECTED;
}
return StartPlayback();
}
Metode Mulai juga dapat menentukan posisi awal yang relatif terhadap awal file; lihat topik referensi API untuk informasi selengkapnya.
Menjeda Pemutaran
Untuk menjeda pemutaran, panggil IMFMediaSession::P ause.
// Pause playback.
HRESULT CPlayer::Pause()
{
if (m_state != Started)
{
return MF_E_INVALIDREQUEST;
}
if (m_pSession == NULL || m_pSource == NULL)
{
return E_UNEXPECTED;
}
HRESULT hr = m_pSession->Pause();
if (SUCCEEDED(hr))
{
m_state = Paused;
}
return hr;
}
Menghentikan Pemutaran
Untuk menghentikan pemutaran, panggil IMFMediaSession::Stop. Saat pemutaran dihentikan, gambar video dikosongkan dan jendela video dicat dengan warna latar belakang (hitam secara default).
// Stop playback.
HRESULT CPlayer::Stop()
{
if (m_state != Started && m_state != Paused)
{
return MF_E_INVALIDREQUEST;
}
if (m_pSession == NULL)
{
return E_UNEXPECTED;
}
HRESULT hr = m_pSession->Stop();
if (SUCCEEDED(hr))
{
m_state = Stopped;
}
return hr;
}
Mengecat Ulang Jendela Video
Enhanced Video Renderer (EVR) menggambar video di jendela yang ditentukan oleh aplikasi. Ini terjadi pada utas terpisah, dan sebagian besar, aplikasi Anda tidak perlu mengelola proses ini. Namun, jika pemutaran dijeda atau dihentikan, EVR harus diberi tahu setiap kali jendela video menerima pesan WM_PAINT . Ini memungkinkan EVR untuk mengecat ulang jendela. Untuk memberi tahu EVR, panggil metode IMFVideoDisplayControl::RepaintVideo :
// Repaint the video window. Call this method on WM_PAINT.
HRESULT CPlayer::Repaint()
{
if (m_pVideoDisplay)
{
return m_pVideoDisplay->RepaintVideo();
}
else
{
return S_OK;
}
}
Kode berikut menunjukkan handler untuk pesan WM_PAINT . Fungsi ini harus dipanggil dari perulangan pesan aplikasi.
// Handler for WM_PAINT messages.
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
if (g_pPlayer && g_pPlayer->HasVideo())
{
// Video is playing. Ask the player to repaint.
g_pPlayer->Repaint();
}
else
{
// The video is not playing, so we must paint the application window.
RECT rc;
GetClientRect(hwnd, &rc);
FillRect(hdc, &rc, (HBRUSH) COLOR_WINDOW);
}
EndPaint(hwnd, &ps);
}
Metode HasVideo
mengembalikan TRUE jika CPlayer
objek memiliki penunjuk IMFVideoDisplayControl yang valid. (Lihat Langkah 1: Mendeklarasikan Kelas CPlayer.)
BOOL HasVideo() const { return (m_pVideoDisplay != NULL); }
Mengubah ukuran Jendela Video
Jika Anda mengubah ukuran jendela video, perbarui persegi panjang tujuan pada EVR dengan memanggil metode IMFVideoDisplayControl::SetVideoPosition :
// Resize the video rectangle.
//
// Call this method if the size of the video window changes.
HRESULT CPlayer::ResizeVideo(WORD width, WORD height)
{
if (m_pVideoDisplay)
{
// Set the destination rectangle.
// Leave the default source rectangle (0,0,1,1).
RECT rcDest = { 0, 0, width, height };
return m_pVideoDisplay->SetVideoPosition(NULL, &rcDest);
}
else
{
return S_OK;
}
}
Berikutnya: Langkah 7: Matikan Sesi Media
Topik terkait