7단계: 미디어 세션 종료
이 항목은 Media Foundation을 사용하여 미디어 파일을 재생하는 방법 자습서의 7단계입니다. 전체 코드는 미디어 세션 재생 예제 항목에 나와 있습니다.
미디어 세션을 종료하려면 다음 단계를 수행합니다.
- IMFMediaSession::Close를 호출하여 현재 프레젠테이션을 닫습니다.
- MESessionClosed 이벤트를 기다립니다. 이 이벤트는 미디어 세션의 마지막 이벤트로 보장됩니다.
- IMFMediaSession::Shutdown을 호출합니다. 이 메서드를 사용하면 미디어 세션이 리소스를 해제합니다.
- 현재 미디어 원본에서 IMFMediaSource::Shutdown 을 호출합니다.
다음 메서드는 미디어 세션을 종료합니다. 이벤트 핸들(m_hCloseEvent)을 사용하여 MESessionClosed 이벤트를 기다립니다. 5단계: 미디어 세션 이벤트 처리를 참조하세요.
// Close the media session.
HRESULT CPlayer::CloseSession()
{
// The IMFMediaSession::Close method is asynchronous, but the
// CPlayer::CloseSession method waits on the MESessionClosed event.
//
// MESessionClosed is guaranteed to be the last event that the
// media session fires.
HRESULT hr = S_OK;
SafeRelease(&m_pVideoDisplay);
// First close the media session.
if (m_pSession)
{
DWORD dwWaitResult = 0;
m_state = Closing;
hr = m_pSession->Close();
// Wait for the close operation to complete
if (SUCCEEDED(hr))
{
dwWaitResult = WaitForSingleObject(m_hCloseEvent, 5000);
if (dwWaitResult == WAIT_TIMEOUT)
{
assert(FALSE);
}
// Now there will be no more events from this session.
}
}
// Complete shutdown operations.
if (SUCCEEDED(hr))
{
// Shut down the media source. (Synchronous operation, no events.)
if (m_pSource)
{
(void)m_pSource->Shutdown();
}
// Shut down the media session. (Synchronous operation, no events.)
if (m_pSession)
{
(void)m_pSession->Shutdown();
}
}
SafeRelease(&m_pSource);
SafeRelease(&m_pSession);
m_state = Closed;
return hr;
}
애플리케이션이 종료되기 전에 미디어 세션을 종료한 다음 MFShutdown 을 호출하여 Microsoft Media Foundation 플랫폼을 종료합니다.
// Release all resources held by this object.
HRESULT CPlayer::Shutdown()
{
// Close the session
HRESULT hr = CloseSession();
// Shutdown the Media Foundation platform
MFShutdown();
if (m_hCloseEvent)
{
CloseHandle(m_hCloseEvent);
m_hCloseEvent = NULL;
}
return hr;
}
관련 항목