Bagikan melalui


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

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

Pemutaran Audio/Video

Cara Memutar File Media dengan Media Foundation