ASF 파일 싱크에 스트림 정보 추가

ASF 파일 싱크는 애플리케이션이 ASF 미디어 데이터를 파일에 보관하는 데 사용할 수 있는 Media Foundation에서 제공하는 IMFMediaSink 의 구현입니다. ASF Media Sinks의 개체 모델 및 일반 사용에 대한 자세한 내용은 ASF 미디어 싱크를 참조하세요.

파일 싱크를 인스턴스화한 후 토폴로지를 빌드하기 전에 구성해야 합니다. 파일 싱크는 출력 파일의 스트림, 인코딩 모드 정보 및 메타데이터에 대해 알고 있어야 합니다. 이 항목에서는 파일 싱크에 스트림을 추가하는 프로세스에 대해 설명합니다.

ASF 파일 싱크에 스트림 추가

파일 싱크는 출력 샘플을 적절하게 생성하고 출력 ASF 파일에 추가할 수 있도록 출력 스트림 및 해당 속성을 알고 있어야 합니다. 이러한 설정은 최종 ASF 헤더 개체에 기록됩니다.

스트림 정보를 설정하려면 파일 싱크의 ASF ContentInfo 개체에 대한 참조가 있어야 합니다. 자세한 내용은 ASF 파일 싱크 만들기를 참조하세요.

다음 절차에서는 ASF 프로필 개체를 사용하여 스트림을 구성하는 일반적인 단계를 요약합니다.

ASF 파일 싱크에서 스트림 정보를 구성하려면

  1. MFCreateASFProfile을 호출하여 ASF 프로필 개체를 만듭니다.

  2. 출력 파일의 각 스트림에 대해 파일 싱크에 추가할 대상 스트림에 대한 미디어 형식을 만듭니다. 미디어 형식은 Windows Media 인코더에서 지원하는 출력 형식과 호환되어야 합니다.

    프로필에 오디오 스트림을 추가하는 방법에 대한 자세한 내용은 ASF 인코딩을 위한 오디오 스트림 만들기를 참조하세요.

    프로필에 비디오 스트림을 추가하는 방법에 대한 자세한 내용은 ASF 인코딩을 위한 비디오 스트림 만들기를 참조하세요.

  3. IMFASFProfile::CreateStream을 호출하여 2단계에서 만든 미디어 형식을 기반으로 스트림을 만듭니다.

  4. 3단계에서 받은 IMFASFStreamConfig 인터페이스 포인터를 호출하여 새로 만든 스트림에 대한 스트림 번호를 할당합니다.

  5. 필요에 따라 다음 정보를 사용하여 스트림을 구성합니다.

  6. 필요에 따라 MF_ASFPROFILE_MINPACKETSIZE MF_ASFPROFILE_MAXPACKETSIZE 특성을 설정하여 프로필의 데이터 패킷 크기를 설정합니다. ASF 프로필은 IMFASFProfile::QueryInterface를 호출하여 애플리케이션이 참조할 수 있는 IMFAttributes 인터페이스를 노출합니다.

  7. 파일 싱크의 스트림에 대한 인코딩 정보를 설정합니다. 파일 싱크의 속성 설정에서 설명합니다.

  8. IMFASFProfile::SetStream을 호출하여 프로필에 스트림을 추가합니다.

  9. IMFASFContentInfo::SetProfile을 호출하여 프로필을 ContentInfo 개체와 연결합니다.

기존 스트림을 수정하기 위해 애플리케이션은 스트림의 IMFASFStreamConfig 인터페이스에 대한 참조를 가져와 요구 사항에 따라 다시 구성할 수 있습니다. 스트림을 추가하거나 제거하려면 애플리케이션에서 IMFASFProfile::RemoveStream을 호출해야 합니다. 이러한 변경 내용, 스트림 수정 또는 제거를 적용하려면 ContentInfo 개체에서 프로필을 다시 설정해야 합니다. 그러면 ContentInfo 개체와 이미 연결된 기존 프로필이 덮어씁니다.

//-------------------------------------------------------------------
//  CreateVideoStream
//  Create an video stream and add it to the profile.
//
//  pProfile: A pointer to the ASF profile.
//  wStreamNumber: Stream number to assign for the new stream.
//    pType: A pointer to the source's video media type.
//-------------------------------------------------------------------

HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
    if (!pProfile)
    {
        return E_INVALIDARG;
    }
    if (wStreamNumber < 1 || wStreamNumber > 127 )
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }

    HRESULT hr = S_OK;

    
    IMFMediaType* pVideoType = NULL;
    IMFASFStreamConfig* pVideoStream = NULL;

    UINT32 dwBitRate = 0;
        
    //Create a new video type from the source type
    hr = CreateCompressedVideoType(pType, &pVideoType);
    if (FAILED(hr))
    {
        goto done;
    }

    //Create a new stream with the video type
    hr = pProfile->CreateStream(pVideoType, &pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }
    

    //Set a valid stream number
    hr = pVideoStream->SetStreamNumber(wStreamNumber);
    if (FAILED(hr))
    {
        goto done;
    }

    //Add the stream to the profile
    hr = pProfile->SetStream(pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }

    wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);

done:

    SafeRelease(&pVideoStream);
    SafeRelease(&pVideoType);

    return hr;
}

스트림 싱크 열거

ContentInfo 개체가 알고 있는 프로필의 각 스트림에 대해 ASF 파일 싱크는 인코딩된 스트림의 모든 속성을 포함하는 스트림 싱크를 만들고 추가합니다. ASF 파일 싱크는 고정 스트림을 포함하도록 설계되었습니다. 즉, IMFMediaSink::AddStreamSink 또는 IMFMediaSink::RemoveStreamSink를 호출하여 스트림을 추가하거나 제거할 수 없습니다. 파일 싱크에서 이러한 호출은 MF_E_STREAMSINKS_FIXED 오류 코드와 함께 실패합니다. 프로필에서 스트림을 추가하거나 제거해도 파일 싱크에서 스트림 싱크가 자동으로 추가되거나 제거되지는 않습니다. 프로필의 스트림이 변경된 경우 파일의 기존 instance 삭제하고 새 스트림 정보로 다시 만들어야 합니다.

다음 절차에서는 ASF 파일 싱크에서 스트림 싱크를 열거하는 일반적인 단계를 요약합니다.

스트림 싱크를 열거하려면

  1. IMFMediaSink::GetStreamSinkCount를 호출하여 ASF 파일 싱크의 총 스트림 싱크 수를 가져옵니다.

  2. 스트림 싱크를 반복하면 스트림 싱크의 GetStreamSinkByIndex 인터페이스에 대한 참조가 표시됩니다.

    또는

    IMFMediaSink::GetStreamSinkById를 호출하여 스트림 번호를 지정하여 스트림 싱크를 가져옵니다. 각 스트림 싱크는 프로필에서 스트림을 만드는 동안 설정한 스트림 번호로 식별됩니다.

미디어 파일을 인코딩하기 위한 부분 토폴로지를 빌드하는 경우 파일 싱크를 출력 토폴로지 노드로 토폴로지에 추가해야 합니다. 파일 싱크에서 각 스팀 싱크를 지정하거나 파일 싱크 활성화 개체 및 스트림 싱크 식별자를 설정하여 이 작업을 수행할 수 있습니다. 자세한 내용 및 코드 예제는 출력 노드 만들기를 참조하세요.

ASF 미디어 싱크

Media Foundation의 ASF 지원