다음을 통해 공유


2단계: CPlayer 개체 만들기

이 항목은 Media Foundation을 사용하여 미디어 파일을 재생하는 방법 자습서의 2단계입니다. 전체 코드는 미디어 세션 재생 예제 항목에 나와 있습니다.

클래스의 CPlayer instance 만들기 위해 애플리케이션은 정적 CPlayer::CreateInstance 메서드를 호출합니다. 이 메서드는 다음 매개 변수를 사용합니다.

  • hVideo 는 비디오를 표시할 창을 지정합니다.
  • hEvent 는 이벤트를 받을 창을 지정합니다. 두 창 핸들에 대해 동일한 핸들을 전달하는 것이 유효합니다.
  • ppPlayer는 새 CPlayer instance 대한 포인터를 받습니다.

다음 코드에서는 CreateInstance 메서드를 보여 줍니다.

//  Static class method to create the CPlayer object.

HRESULT CPlayer::CreateInstance(
    HWND hVideo,                  // Video window.
    HWND hEvent,                  // Window to receive notifications.
    CPlayer **ppPlayer)           // Receives a pointer to the CPlayer object.
{
    if (ppPlayer == NULL)
    {
        return E_POINTER;
    }

    CPlayer *pPlayer = new (std::nothrow) CPlayer(hVideo, hEvent);
    if (pPlayer == NULL)
    {
        return E_OUTOFMEMORY;
    }

    HRESULT hr = pPlayer->Initialize();
    if (SUCCEEDED(hr))
    {
        *ppPlayer = pPlayer;
    }
    else
    {
        pPlayer->Release();
    }
    return hr;
}

HRESULT CPlayer::Initialize()
{
    // Start up Media Foundation platform.
    HRESULT hr = MFStartup(MF_VERSION);
    if (SUCCEEDED(hr))
    {
        m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (m_hCloseEvent == NULL)
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
    }
    return hr;
}

다음 코드는 생성자를 보여줍니다 CPlayer .

CPlayer::CPlayer(HWND hVideo, HWND hEvent) : 
    m_pSession(NULL),
    m_pSource(NULL),
    m_pVideoDisplay(NULL),
    m_hwndVideo(hVideo),
    m_hwndEvent(hEvent),
    m_state(Closed),
    m_hCloseEvent(NULL),
    m_nRefCount(1)
{
}

생성자는 다음을 수행합니다.

  1. MFStartup을 호출하여 Media Foundation 플랫폼을 초기화합니다.
  2. 자동 재설정 이벤트를 만듭니다. 이 이벤트는 미디어 세션을 닫을 때 사용됩니다. 7단계: 미디어 세션 종료를 참조하세요.

소멸자 7단계: 미디어 세션 종료에 설명된 대로 미디어 세션을 종료합니다.

CPlayer::~CPlayer()
{
    assert(m_pSession == NULL);  
    // If FALSE, the app did not call Shutdown().

    // When CPlayer calls IMediaEventGenerator::BeginGetEvent on the
    // media session, it causes the media session to hold a reference 
    // count on the CPlayer. 
    
    // This creates a circular reference count between CPlayer and the 
    // media session. Calling Shutdown breaks the circular reference 
    // count.

    // If CreateInstance fails, the application will not call 
    // Shutdown. To handle that case, call Shutdown in the destructor. 

    Shutdown();
}

생성자와 소멸자는 모두 보호된 클래스 메서드입니다. 애플리케이션은 정적 CreateInstance 메서드를 사용하여 개체를 만듭니다. 삭제를 명시적으로 사용하는 대신 IUnknown::Release를 호출하여 개체를 삭제합니다.

다음: 3단계: 미디어 파일 열기

오디오/비디오 재생

Media Foundation을 사용하여 미디어 파일을 재생하는 방법