Sequencer 원본 사용

이 항목에서는 Sequencer 원본사용하는 방법을 설명합니다. 여기에는 다음 단원이 포함되어 있습니다.

시퀀서 원본에 대한 일반적인 개요는 Sequencer 원본 정보입니다.

개요

시퀀서 소스는 다음 인터페이스를 노출합니다.

인터페이스 설명
IMFMediaSource 일반 미디어 원본 기능을 노출합니다.
IMFSequencerSource 애플리케이션에서 토폴로지를 추가하거나 제거할 수 있도록 합니다.
IMFMediaSourceTopologyProvider 미디어 세션에서 큐에 추가할 다음 토폴로지 검색합니다.
IMFMediaSourcePresentationProvider 미디어 세션에서 세그먼트를 종료하는 데 사용됩니다. 애플리케이션은 이 인터페이스를 사용하지 않습니다.
IMFGetService 서비스 인터페이스에 대한 시퀀서 소스를 쿼리합니다.

 

일련의 미디어 원본을 재생하려면 다음 단계를 수행합니다.

  1. sequencer 원본을 만들려면 MFCreateSequencerSource 함수를 호출합니다.
  2. 재생 토폴로지 만들기에 설명된 대로 각 세그먼트에 대해 재생 토폴로지 만들기를 만듭니다. 프레젠테이션에 토폴로지 추가하려면 IMFSequencerSource::AppendTopology를 호출합니다.
  3. 재생을 시작하기 전에 시퀀서 원본에서 IMFMediaSource::CreatePresentationDescriptor를 호출합니다. 이 메서드는 첫 번째 세그먼트에 대한 프레젠테이션 설명자에 대한 포인터를 반환합니다. 이 세그먼트와 연결된 토폴로지를 얻으려면 IMFMediaSourceTopologyProvider 인터페이스에 대한 시퀀서 소스에서 QueryInterface를 호출합니다. 프레젠테이션 설명자를 IMFMediaSourceTopologyProvider::GetMediaSourceTopology 메서드에 전달합니다. 이 메서드는 토폴로지 포인터를 반환합니다.
  4. 미디어 세션의 IMFMediaSession::SetTopology 메서드를 호출하여 첫 번째 세그먼트의 토폴 로지를 미디어 세션에 전달합니다.
  5. IMFMediaSession::Start를 호출 하여 재생을 시작합니다.
  6. 시퀀서 원본이 다음 세그먼트를 미리 등록할 준비가 되면 이벤트 데이터가 IMFPresentationDescriptor 인터페이스 포인터인 MENewPresentation 이벤트를 보냅니다. 다시 시퀀서 원본에서 GetMediaSourceTopology를 호출하여 세그먼트의 토폴로지를 가져와서 SetTopology를 호출하여 미디어 세션에서 토폴로지를 설정합니다. 미디어 원본을 다시 시작할 필요는 없습니다. 자동으로 다음 세그먼트로 재생됩니다.
  7. 애플리케이션을 종료하기 전에 IMFMediaSource::Shutdown을 호출 하여 시퀀서 소스를 종료합니다.

다음 코드는 토폴로지를 가져와 미디어 세션에서 설정하는 방법을 보여줍니다.

// Queues the next topology on the session.

HRESULT CPlaylist::QueueNextSegment(IMFPresentationDescriptor *pPD)
{
    IMFMediaSourceTopologyProvider *pTopoProvider = NULL;
    IMFTopology *pTopology = NULL;

    //Get the topology for the presentation descriptor
    HRESULT hr = m_pSequencerSource->QueryInterface(IID_PPV_ARGS(&pTopoProvider));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pTopoProvider->GetMediaSourceTopology(pPD, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    //Set the topology on the media session
    m_pSession->SetTopology(NULL, pTopology);

done:
    SafeRelease(&pTopoProvider);
    SafeRelease(&pTopology);
    return hr;
}

전체 코드 예제는 Sequencer 소스 예제 코드를 참조 하세요.

토폴로지 추가

시퀀서 소스는 두 개의 토폴로지 목록인 입력 목록과 사전 등록 목록을 기본.

입력 목록은 IMFSequencerSource::AppendTopology를 호출 하여 애플리케이션에서 추가한 순서대로 재생 목록 세그먼트에 해당하는 토폴로지의 컬렉션입니다. 이 메서드는 각 토폴로지 MFSequencerElementId 형식의 고유 세그먼트 식별자를 할당합니다. 세그먼트 식별자는 모든 원본 토폴로지 노드에 대한 특성으로 설정됩니다. 애플리케이션은 MF_TOPONODE_SEQUENCE_ELEMENTID 특성을 사용하여 원본 노드에서 세그먼트 식별자를 가져올 수 있습니다. 애플리케이션이 동일한 토폴로지에서 AppendTopology를 두 번 이상 호출한 경우 입력 목록에 중복 토폴로지를 포함할 수 있지만 고유한 세그먼트 식별자에 의해 식별됩니다.

사전 등록 목록은 재생을 준비하기 위해 초기화된 입력 목록 토폴로지의 컬렉션입니다. 이렇게 하면 활성 토폴로지 종료 시 미디어 세션이 원활하게 다음 토폴로지로 전환할 수 있습니다. 애플리케이션은 사전 등록 목록에서 토폴로지를 직접 추가하거나 제거할 수 없습니다. 는 재생을 위해 입력 목록의 토폴로지를 선택할 때 시퀀서 소스에 의해 생성됩니다. 이로 인해 시퀀서 소스가 입력 목록의 다음 토폴로지를 미리 등록 목록에 추가합니다. 이렇게 하면 시퀀서 소스가 MENewPresentation 이벤트를 비동기적으로 발생시키고 사전 등록 토폴로지에 대한 프레젠테이션 설명자를 이벤트 데이터로 전달합니다. 애플리케이션은 미디어 세션의 IMFMediaEventGenerator 인터페이스를 사용하여 이 이벤트를 수신 대기하고 IMFMediaSession::SetTopology를 호출하여 미디어 세션에서 사전 등록 토폴로지 큐에 대기해야 합니다. 미디어 세션이 활성 토폴로지 재생을 완료하기 전에 이 작업을 수행해야 합니다. SetTopology 는 활성 토폴로지 재생이 종료된 후 재생해야 하는 다음 토폴로지에 대해 미디어 세션에 알릴 수 있습니다. 원활한 전환을 보장하려면 미디어 세션이 이전 토폴로지 재생을 완료하기 전에 애플리케이션에서 SetTopology를 호출해야 합니다. 그렇지 않으면 세그먼트 사이에 간격이 있습니다.

MENewPresentation 이벤트는 활성 토폴로지 다음에 토폴로지가 있는 한 발생합니다. 따라서 입력 목록에 토폴로지를 하나만 포함하거나 활성 토폴로지를 입력 목록의 마지막 토폴로지인 경우 이 이벤트가 발생하지 않습니다.

사전 등록 목록은 입력 목록과 동기화되며, 토폴로지가 입력 목록에 추가되거나 입력 목록에서 삭제될 때마다 새로 고쳐집니다.

토폴로지 삭제

시퀀서 원본에서 토폴로지를 제거하려면 애플리케이션이 IMFSequencerSource::D eleteTopology 메서드를 호출하고 세그먼트 식별자를 지정해야 합니다.

DeleteTopology를 호출하기 전에 애플리케이션은 미디어 세션이 애플리케이션에서 삭제하려는 토폴로지와 사용하지 않는지 확인해야 합니다. 이렇게 하려면 애플리케이션에서 DeleteTopology를 호출하기 전에 다음 두 가지가 모두 발생해야 합니다.

삭제되는 세그먼트가 활성 토폴로지인 경우 재생이 중지되고 시퀀서 소스가 MEEndOfPresentationSegment 이벤트를 발생합니다. 활성 토폴로지도 마지막 토폴로지인 경우 MEEndOfPresentation 이벤트가 발생합니다.

세그먼트로 건너뛰기

애플리케이션은 다음과 같이 세그먼트 오프셋으로 미디어 세션을 시작하여 시퀀스의 특정 세그먼트로 건너뛸 수 있습니다.

  1. MFCreateSequencerSegmentOffset 함수를 호출하여 세그먼트 오프셋을 만듭니다. dwId 매개 변수에서 세그먼트의 식별자를 지정합니다. (식별자는 에 의해 반환되었습니다.시퀀서 원본에 토폴로지를 처음 추가한 경우 IMFSequencerSource::AppendTopology 메서드입니다.) hnsOffset 매개 변수는 세그먼트의 시작을 기준으로 시간 오프셋을 지정합니다. 이때 재생이 시작됩니다. pvarSegmentOffset 매개 변수의 경우 빈 PROPVARIANT의 주소를 전달합니다. 함수가 반환되면 이 PROPVARIANT 에는 세그먼트 오프셋이 포함됩니다.

  2. 미디어 세션에서 IMFMediaSession::Start 메서드를 호출합니다. pguidTimeFormat 매개 변수의 경우 GUID 값 MF_TIME_FORMAT_SEGMENT_OFFSET 사용합니다. 이 값은 세그먼트 오프셋별 검색을 나타냅니다. pvarStartPosition 매개 변수의 경우 이전 단계에서 만든 PROPVARIANT주소를 전달합니다.

다음 코드 예제에서는 시퀀스에서 지정된 세그먼트의 시작으로 건너뛰는 방법을 보여 있습니다.

// Skips to the specified segment in the sequencer source

HRESULT CPlaylist::SkipTo(DWORD index)
{
    if (index >= m_count)
    {
        return E_INVALIDARG;
    }

    MFSequencerElementId ID = m_segments[index].SegmentID;

    PROPVARIANT var;

    HRESULT hr = MFCreateSequencerSegmentOffset(ID, NULL, &var);
    
    if (SUCCEEDED(hr))
    {
        hr = m_pSession->Start(&MF_TIME_FORMAT_SEGMENT_OFFSET, &var);
        PropVariantClear(&var);
    }
    return hr;
}

애플리케이션이 세그먼트를 검색할 때 시퀀서 원본이 현재 세그먼트를 종료하고 새 세그먼트 재생을 준비할 때 애플리케이션은 여러 이벤트를 받습니다. 이러한 이벤트는 비동기적으로 수신되므로 정확한 이벤트 시퀀스를 예측하기가 어렵습니다. 이러한 이벤트는 다음과 같습니다.

Sequencer 원본에서 보낸 이벤트에 대한 자세한 내용은 Sequencer 원본 이벤트 항목에서 확인할 수 있습니다.

재생 목록을 만드는 방법

Sequencer 원본