다음을 통해 공유


파일 시퀀스를 재생하는 방법

[이 페이지와 연결된 기능인 MFPlay는 레거시 기능입니다. 그것은 MediaPlayerIMFMediaEngine에 의해 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayerIMFMediaEngine을 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용한 기존 코드를 다시 작성하여 새 API를 사용하는 것을 추천합니다.]

이 항목에서는 MFPlay를 사용하여 오디오/비디오 파일 시퀀스를 재생하는 방법을 설명합니다.

MFPlay 시작 항목에서는 단일 미디어 파일을 재생하는 방법을 보여줍니다. MFPlay를 사용하여 파일 시퀀스를 재생할 수도 있습니다.

동기(차단) 메서드

  1. IMFPMediaPlayer::CreateMediaItemFromURL 메서드를 호출합니다. 이 메서드는 미디어 항목을 만듭니다.
  2. IMFPMediaPlayer::SetMediaItem을 호출하여 재생을 위해 미디어 항목을 큐에 대기합니다.
  3. IMFPMediaPlayer::P lay를 호출하여 재생을 시작합니다.

이러한 단계는 다음 코드에 나와 있습니다.

HRESULT OpenMediaFile(IMFPMediaPlayer *pPlayer, PCWSTR pwszURL)
{
    HRESULT hr = S_OK;
    
    IMFPMediaItem *pItem = NULL;

    hr = pPlayer->CreateMediaItemFromURL(
        sURL, 
        TRUE,  // Blocking call
        0,     // User data.
        &pItem
        );

    if (SUCCEEDED(hr))
    {
        hr = pPlayer->SetMediaItem(pItem);
    }

    if (SUCCEEDED(hr))
    {
       hr = pPlayer->Play();
    }

    if (pItem)
    {
        pItem->Release();
    }
    return hr;
}

CreateMediaItemFromURL 메서드는 다음 매개 변수를 사용합니다.

  • 첫 번째 매개 변수는 파일의 URL입니다.
  • 두 번째 매개 변수는 메서드가 차단되는지 여부를 지정합니다. 여기에 표시된 대로 TRUE 값을 지정하면 미디어 항목이 생성될 때까지 메서드가 차단됩니다.
  • 세 번째 매개 변수는 임의의 DWORD_PTR 값을 미디어 항목과 연결합니다. 나중에 IMFPMediaItem::GetUserData를 호출하여 이 값을 가져올 수 있습니다.
  • 네 번째 매개 변수는 미디어 항목의 IMFPMediaItem 인터페이스에 대한 포인터를 받습니다.

비동기(비차단) 메서드

UI 스레드에서 CreateMediaItemFromURL을 호출하는 경우 완료하는 데 상당한 시간이 걸릴 수 있으므로 차단 옵션을 사용하지 않습니다. 이 메서드는 일반적으로 파일 또는 네트워크 연결을 열고 파일 헤더를 구문 분석하기에 충분한 데이터를 읽습니다. 이 모든 작업은 시간이 걸릴 수 있습니다. 따라서 일반적으로 두 번째 매개 변수를 FALSE설정하는 것이 좋습니다. 이 옵션을 사용하면 메서드가 비동기적으로 수행됩니다. 비동기 옵션을 사용하는 경우 마지막 매개 변수는 NULL이어야 합니다.

    hr = pPlayer->CreateMediaItemFromURL(
        sURL, 
        FALSE,  // Non-blocking call.
        0,      // User data.
        NULL    // Must be NULL for the non-blocking call.
        );

미디어 항목이 만들어지면 애플리케이션은 MFP_EVENT_TYPE_MEDIAITEM_CREATED 이벤트를 받습니다. 이 이벤트의 데이터 구조에는 미디어 항목에 대한 포인터가 포함됩니다. SetMediaItem 메서드에 이 포인터를 전달하여 재생을 위해 항목을 큐에 추가합니다.

void OnMediaItemCreated(MFP_MEDIAITEM_CREATED_EVENT *pEvent)
{
    HRESULT hr = S_OK;
    if (FAILED(pEvent->header.hrEvent))
    {
        // Handle error. (Not shown.)
    }
    else
    {
        hr = g_pPlayer->SetMediaItem(pEvent->pMediaItem);
    }
}

요구 사항

MFPlay에는 Windows 7이 필요합니다.

오디오/비디오 재생에 MFPlay 사용