미디어 샘플 작업

이 항목에서는 IMFSample 인터페이스를 사용하여 미디어 샘플 개체를 조작하는 방법을 설명합니다. 미디어 샘플에 대한 일반적인 개요는 미디어 샘플을 참조 하세요.

새 미디어 샘플을 만들려면 MFCreateSample 함수를 호출합니다. 처음에는 샘플의 버퍼 목록이 비어 있습니다. 목록 끝에 버퍼를 추가하려면 IMFSample::AddBuffer를 호출 합니다.

다음 코드에서는 샘플을 만들고 버퍼를 추가하는 방법을 보여 있습니다.

HRESULT CreateMediaSample(DWORD cbData, IMFSample **ppSample)
{
    HRESULT hr = S_OK;

    IMFSample *pSample = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    hr = MFCreateSample(&pSample);

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(cbData, &pBuffer);
    }

    if (SUCCEEDED(hr))
    {
        hr = pSample->AddBuffer(pBuffer);
    }

    if (SUCCEEDED(hr))
    {
        *ppSample = pSample;
        (*ppSample)->AddRef();
    }

    SafeRelease(&pSample);
    SafeRelease(&pBuffer);
    return hr;
}

샘플에서 버퍼를 가져오는 권장 방법은 IMFSample::ConvertToContiguousBuffer를 호출하는 것입니다. 이 메서드는 단일 연속 버퍼를 반환합니다.

목록의 버퍼를 반복하려면 먼저 IMFSample::GetBufferCount를 호출 합니다. 이 메서드는 버퍼 수를 반환합니다. 그런 다음 IMFSample::GetBufferByIndex를 호출하고 검색할 버퍼의 인덱스를 지정합니다. 버퍼는 0부터 인덱싱됩니다.

다음 코드는 샘플에서 버퍼를 반복하는 방법을 보여 줍니다.

IMFMediaBuffer *pBuffer = NULL;
DWORD cBuffers = 0;

hr = pSample->GetBufferCount(&cBuffers);

if (SUCCEEDED(hr))
{
    for (DWORD i = 0; i < cBuffers; i++)
    {
        hr = pSample->GetBufferByIndex(i, &pBuffer);

        // Use buffer (not shown).

        SafeRelease(&pBuffer);

        if (FAILED(hr))
        {
            break;
        }
    }
}

샘플에는 타임스탬프를 사용하고 기간을 지정합니다. 타임스탬프는 프레젠테이션 시계를 기준으로 샘플의 데이터를 렌더링해야 하는 시기를 나타냅니다. 기간은 데이터를 렌더링해야 하는 시간입니다. 일반적으로 데이터를 생성하는 구성 요소는 초기 타임스탬프를 설정하고 기간을 설정합니다. 이러한 값은 미디어 세션에서 수정될 수 있습니다. 타임스탬프를 설정하려면 IMFSample::SetSampleTime을 호출합니다. 기간을 설정하려면 IMFSample::SetSampleDuration을 호출 합니다.

샘플에는 샘플에 대한 추가 정보가 포함된 특성이 있을 수도 있습니다. 샘플 특성 목록은 샘플 특성을 참조 하세요. 특성을 설정하고 검색하려면 IMFSample 상속하는 IMFAttributes 인터페이스를 사용합니다.

미디어 샘플

미디어 버퍼