다음을 통해 공유


Multiplexer 개체 만들기

ASF 멀티플렉서는 ASF 데이터 개체와 함께 작동하고 애플리케이션에 미디어 스트림에 대한 ASF 데이터 패킷을 생성하는 기능을 제공하는 WMContainer 계층 개체입니다.

멀티플렉서 개체는 IMFASFMultiplexer 인터페이스를 노출합니다. 멀티플렉서를 만들려면 MFCreateASFMultiplexer를 호출합니다. 이 함수는 빈 개체에 대한 포인터를 반환합니다. 애플리케이션이 새 ASF 파일을 작성하는 경우 애플리케이션은 ContentInfo 개체를 사용하여 멀티플렉서를 초기화해야 합니다. 이렇게 하려면 IMFASFMultiplexer::Initialize를 호출합니다. 지정한 ContentInfo 개체는 새 파일의 ASF 헤더 개체를 나타냅니다. 새 파일에 대한 ContentInfo 개체를 만들고 초기화하는 방법에 대한 자세한 내용은 새 ASF 파일의 ContentInfo 개체 초기화를 참조하세요.

Initialize 메서드는 ContentInfo 개체를 구문 분석하여 스트림 수, 패킷 크기, 사전 등록 등의 스트림 구성 정보를 수집합니다. 필요에 따라 멀티플렉서에 새는 버킷 매개 변수와 페이로드 확장 단위가 필요할 수도 있습니다. 이 정보는 ASF 헤더 개체에 정의된 요구 사항과 일치하는 데이터 패킷을 생성하기 위해 필요합니다. Initialize 메서드는 스트림의 미디어 유형 및 구성 설정에 따라 멀티플렉서를 구성합니다. 예를 들어 스트림에 페이로드 확장이 포함되도록 구성된 경우( ASF 스트림 만들기 및 구성 참조) 멀티플렉서가 생성된 데이터 패킷에 해당 값을 추가하도록 구성됩니다.

또한 Initialize 메서드는 쓰기를 위해 ContentInfo 개체를 만드는 동안 만들어진 초기 데이터 개체에 대한 핸들을 가져옵니다. 데이터 패킷을 생성하는 동안 멀티플렉서는 데이터 개체에 패킷을 추가하고 적절하게 업데이트합니다. 멀티플렉서는 모든 데이터 패킷을 생성한 후 제공된 ContentInfo 개체를 업데이트하여 데이터 패킷 수와 같은 특정 값을 업데이트합니다.

다음 코드 예제에서는 Multiplexer를 만들고 ContentInfo 개체를 사용하여 초기화하는 방법을 보여 있습니다.

//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the 
// output file.
//-------------------------------------------------------------------

HRESULT CreateOutputGenerators(
    IMFASFProfile *pProfile, 
    IMFASFContentInfo **ppContentInfo, 
    IMFASFMultiplexer **ppMux
    )
{
    IMFASFContentInfo *pContentInfo = NULL;
    IMFASFMultiplexer *pMux = NULL;

    // Use the ASF profile to create the ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);

    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->SetProfile(pProfile);
    }

    // Create the ASF Multiplexer object.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFMultiplexer(&pMux);
    }
    
    // Initialize it using the new ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pMux->Initialize(pContentInfo);
    }

    // Return the pointers to the caller.
    if (SUCCEEDED(hr))
    {
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();

        *ppMux = pMux;
        (*ppMux)->AddRef();
    }

    SafeRelease(&pContentInfo);
    SafeRelease(&pMux);

    return hr;
}

전체 애플리케이션에서 사용되는 이 함수를 보려면 자습서: 한 파일에서 다른 파일로 ASF 스트림 복사를 참조하세요.

멀티플렉서 초기화 및 새는 버킷 설정

IMFASFMultiplexer::Initialize 메서드는 새는 버킷 데이터 흐름을 확인하도록 멀티플렉서를 구성합니다. 이러한 매개 변수를 구성하려면 지정된 ContentInfo 개체에 다음 속성 값이 설정되어 있는지 확인합니다. 이러한 속성을 설정하는 방법에 대한 자세한 내용은 ContentInfo 개체의 속성 설정을 참조하세요.

  • MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE 속성: 새는 버킷에서 데이터 흐름을 유지하기 위해 멀티플렉서가 비트 속도를 자동으로 조정해야 하는지 여부를 나타냅니다. 이 설정은 IMFASFMultiplexer::SetFlags 를 호출하고 MFASF_MULTIPLEXER_AUTOADJUST_BITRATE 플래그를 전달하여 애플리케이션에서 변경할 수 있습니다.

  • MFPKEY_ASFMEDIASINK_BASE_SENDTIME 속성: 전송 시간은 새는 버킷 내부의 페이로드가 해제되는 시기를 나타냅니다. 페이로드는 프레젠테이션 시간 전에 대상에 도착할 시간이 있어야 하므로 전송 시간은 프레젠테이션 시간과 같거나 이전이어야 합니다.

    이 속성 값은 첫 번째 전송 시간입니다. 멀티플렉서는 이 값을 사용하여 후속 전송 시간을 계산하여 데이터가 버킷을 통해 꾸준히 흐르도록 합니다. 멀티플렉서에 MFASF_MULTIPLEXER_AUTOADJUST_BITRATE 플래그가 설정된 경우 멀티플렉서는 비트 속도를 조정하여 버퍼 창이 꽉 찼을 때 페이로드가 전송되도록 합니다. 플래그를 설정하지 않으면 멀티플렉서가 대역폭 오버런으로 인해 데이터 패킷을 생성하지 못합니다.

멀티플렉서는 Initialize 메서드에 지정된 ContentInfo 개체와 연결된 ASF 프로필에서 스트림 구성 정보를 가져옵니다. 스트림 구성 정보에는 새는 버킷 매개 변수가 포함됩니다. 이 값은 멀티플렉서가 데이터 패킷을 생성하는 데 필요합니다.

새는 버킷 매개 변수를 지정하려면 프로필의 스트림을 나타내는 스트림 구성 개체의 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 특성 값을 설정합니다. 인코더에서 사용하는 버퍼 창 값을 사용하려면 IWMCodecLeakyBucket::GetBufferSizeBits를 호출합니다. 실제 버퍼 창 값은 인코더의 출력 미디어 형식을 설정한 후에만 알려져 있습니다. 출력 미디어 형식을 설정하는 방법에 대한 자세한 내용은 인코더에서 미디어 형식 협상을 참조하세요.

참고

인코더에서 사용하는 새는 버킷 값은 멀티플렉서 만들기에 사용된 ASF 프로필에서 제공한 ContentInfo 개체에서 다를 수 있습니다.

 

Initialize 메서드는 최종 ASF Header 개체에 올바른 값이 반영되도록 ContentInfo 개체를 업데이트합니다.

ASF 멀티플렉서

새 ASF 데이터 패킷 생성