클라이언트 로깅(Microsoft Media Foundation)

네트워크 원본은 미디어 서버가 연결하는 클라이언트의 활동을 추적하는 방법을 제공하는 클라이언트 로깅을 지원합니다. 클라이언트 로그를 사용하면 서버에서 연결, 렌더링 및 스트리밍 통계를 기록할 수 있습니다. 이러한 로그는 미디어 서버 사용량을 추적하고 청구를 생성하거나 클라이언트 네트워크의 속도에 따라 적합한 품질의 콘텐츠를 제공하는 등의 다양한 시나리오에서 콘텐츠 공급자가 사용할 수 있습니다.

로그 파일에는 여러 클라이언트 이벤트 항목이 포함되어 있습니다. 각 로그 항목에는 여러 개의 공백으로 구분된 필드가 포함됩니다. 클라이언트 로그에는 렌더링 (재생) 및 스트리밍 (수신)의 두 가지 유형이 있습니다. 콘텐츠를 동시에 재생하고 스트리밍할 수 있으므로 클라이언트는 두 가지 유형의 로그 데이터의 조합을 보낼 수 있습니다. 경우에 따라 동일한 세션에 대해 두 개의 로그 항목이 있을 수 있습니다. 예를 들어 Fast Cache를 사용하도록 설정하면 클라이언트는 렌더링을 완료하기 전에 스트리밍된 콘텐츠 수신을 완료할 수 있습니다. 이 경우 스트리밍 로그 데이터는 렌더링 로그 데이터 전에 전송됩니다.

클라이언트가 재생 상태(재생, 빠른 전달 또는 되윈)에서 재생이 아닌 상태(중지, 일시 중지, 스트림 끝 및 스트림 시작)로 변경되면 클라이언트는 렌더링 로그 데이터를 서버로 보냅니다. 렌더링 로그에 대한 데이터가 제출되면 미디어 서버 또는 구성된 프록시 서버에 직접 연결됩니다.

콘텐츠가 클라이언트를 실행하는 컴퓨터의 임시 로컬 캐시 파일에 저장된 경우 클라이언트는 로컬 캐시에서 파일을 읽고 렌더링 로그 데이터를 제출하여 콘텐츠를 재생했음을 나타낼 수 있습니다. 이 경우 클라이언트는 로컬 캐시에서 파일을 읽고, 렌더링 로그 항목에 네트워크 통계가 포함되지 않으며, 프로토콜이 캐시로 설정됩니다.

클라이언트는 스트리밍 로그 데이터를 서버로 전송하여 클라이언트가 콘텐츠를 수신한 방법을 나타내지만 렌더링된 방법은 나타내지 않습니다. 클라이언트는 클라이언트가 콘텐츠 렌더링을 완료하기 훨씬 전에 스트리밍 로그를 보낼 수 있습니다.

이 항목에서는 모든 로그 필드에 대한 정보를 제공하지 않습니다. 전체 참조는 Windows Media 로그 데이터 구조를 참조하세요.

로그 필드 구성

Media Foundation을 사용하면 클라이언트가 속성을 사용하여 네트워크 원본을 구성할 수 있습니다. 애플리케이션은 속성 저장소에서 적절한 속성을 설정하고 원본 확인자 메서드 중 하나에 전달해야 합니다. 원본 확인자는 요청된 대로 네트워크 원본을 만들고 서버와의 연결을 엽니다. 연결에 성공하면 클라이언트는 자체에 대한 정보를 보냅니다.

다음 표에서는 원본 확인자를 통해 애플리케이션이 설정할 수 있는 로그 필드 및 해당 속성에 대해 설명합니다. 이 정보는 세션 중에 변경되지 않습니다.

로깅 필드 설명
c-playerid 플레이어의 고유 식별입니다. 이 정보는 연결의 시작 부분에 전송됩니다. 일반적으로 클라이언트의 GUID입니다. 클라이언트는 이 정보를 MFNETSOURCE_PLAYERID 속성의 서버로 보낼 수 있습니다.
클라이언트는 연결 시작 시 서버에 이 정보를 보냅니다.
샘플 값: "{c579d042-cecc-11d1-bb31-00a0c9603954}"
c-playerversion 연결 시작 부분에 전송되는 플레이어의 버전 번호입니다. 클라이언트는 이 정보를 MFNETSOURCE_PLAYERVERSION 속성의 서버로 보낼 수 있습니다.
클라이언트는 연결 시작 시 서버에 이 정보를 보냅니다.
cs(User-Agent) 플레이어가 브라우저에 포함된 경우 사용되는 브라우저 유형입니다. 이 값은 클라이언트가 MFNETSOURCE_BROWSERUSERAGENT 속성에서 설정할 수 있습니다.
플레이어가 포함되지 않은 경우 이 필드는 로그를 생성한 클라이언트의 사용자 에이전트를 나타냅니다. 이 경우 클라이언트는 MFNETSOURCE_PLAYERUSERAGENT 속성을 설정해야 합니다.
클라이언트는 연결 시작 시 서버에 이 정보를 보냅니다.
샘플 값: "Mozilla/4.0_(compatible;_MSIE_4.01;_Windows_98)"
cs(참조자) 플레이어가 포함된 웹 페이지의 URL입니다(포함된 경우). 클라이언트는 이 정보를 MFNETSOURCE_BROWSERWEBPAGE 속성의 서버로 보낼 수 있습니다.
클라이언트는 연결이 끝날 때 이 정보를 서버로 보냅니다.
샘플 값: "https://www.example.microsoft.com"
c-hostexe 플레이어 로그 항목의 경우 실행된 호스트 프로그램(.exe)입니다. 예를 들어 브라우저의 웹 페이지, Microsoft Visual Basic 애플릿 또는 독립 실행형 플레이어입니다. 클라이언트는 이 정보를 MFNETSOURCE_HOSTEXE 속성의 서버로 보낼 수 있습니다.
클라이언트는 연결이 끝날 때 이 정보를 서버로 보냅니다.
샘플 값:
  • "iexplore.exe"
  • "myplayer.exe"
c-hostexever 호스트 프로그램(.exe) 버전 번호입니다. 클라이언트는 이 정보를 MFNETSOURCE_HOSTVERSION 속성의 서버로 보낼 수 있습니다.
클라이언트는 연결이 끝날 때 이 정보를 서버로 보냅니다.

다음 코드 예제에서는 클라이언트 애플리케이션이 네트워크 원본을 구성하는 방법을 보여 줍니다. 다음은 "c-hostexe" 로그 필드를 설정하는 예제입니다.

// Creates a media source from a URL.
//
// This example demonstrates how to set the MFNETSOURCE_HOSTEXE
// configuration property on the network source.

HRESULT CreateMediaSourceWithLogParams(
    PCWSTR pszURL, 
    IMFMediaSource **ppSource
    )
{
    IPropertyStore *pConfig = NULL;

    // Configure the property store.
    HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pConfig));

    if (SUCCEEDED(hr))
    {
        PROPERTYKEY key;
        key.fmtid =  MFNETSOURCE_HOSTEXE;
        key.pid = 0;

        PROPVARIANT var;
        var.vt = VT_LPWSTR;
        var.pwszVal = L"MyPlayer.exe";

        hr = pConfig->SetValue(key, var);
    }

    // Create the source media source.
    if (SUCCEEDED(hr))
    {
        hr = CreateMediaSource(pszURL, pConfig, ppSource);
    }

    SafeRelease(&pConfig);
    return hr;
}

네트워크 통계 검색

애플리케이션은 원본 확인자 메서드 중 하나를 호출할 때 네트워크 원본을 만들고, 속성 저장소에 지정된 속성을 설정하고, 미디어 서버와 세션을 엽니다. 이전 섹션에서 설명한 구성 가능한 정보 외에도 세션 시작 시, 스트리밍 중 및 세션이 닫혀 있을 때 서버와 클라이언트 간에 추가 데이터가 전송됩니다.

애플리케이션은 MFNETSOURCE_STATISTICS_SERVICE 서비스 식별자를 사용하여 네트워크 통계를 검색할 수 있습니다. 이 서비스를 사용하려면 애플리케이션에서 MFGetService 함수를 호출하여 MFNETSOURCE_STATISTICS 속성에 네트워크 통계가 포함된 속성 저장소를 가져올 수 있습니다. 특정 값은 MFNETSOURCE_STATISTICS_IDS 열거형에 정의된 해당 식별자를 제공하여 검색할 수 있습니다.

다음 코드 예제에서는 서비스를 사용하여 클라이언트에서 받은 패킷 수를 가져오는 방법을 보여 줍니다.

HRESULT GetPacketsReceived(IMFMediaSession *pSession, DWORD *pcPackets)
{
    IPropertyStore *pProp = NULL;
    PROPVARIANT var;

    // Get the property store from the media session.
    HRESULT hr = MFGetService(
        pSession, 
        MFNETSOURCE_STATISTICS_SERVICE, 
        IID_PPV_ARGS(&pProp)
        );

    // Get the number of packets received by the client.

    if (SUCCEEDED(hr))
    {
        PROPERTYKEY key;
        key.fmtid = MFNETSOURCE_STATISTICS;
        key.pid = MFNETSOURCE_RECVPACKETS_ID;

        hr = pProp->GetValue(key, &var);
    }

    if (SUCCEEDED(hr))
    {
        *pcPackets = var.lVal;
    }

    PropVariantClear(&var);
    SafeRelease(&pProp);
    return hr;
}

다음 목록에서는 MFNETSOURCE_STATISTICS_IDS 정의된 네트워크 통계 식별자 중 일부를 설명합니다.

네트워크 통계 식별자 설명
MFNETSOURCE_AVGBANDWIDTHBPS_ID 클라이언트가 서버에 연결된 평균 대역폭(초당 비트)입니다. 값은 연결의 전체 기간에 걸쳐 계산됩니다.
MFNETSOURCE_BUFFERINGCOUNT_ID 스트림을 재생하는 동안 클라이언트가 버퍼링된 횟수입니다.
MFNETSOURCE_BYTESRECEIVED_ID 서버에서 클라이언트가 수신한 바이트 수입니다. 값에는 네트워크 스택에 의해 추가되는 오버헤드가 포함되지 않습니다. 서로 다른 프로토콜을 사용하여 스트리밍되는 동일한 콘텐츠는 서로 다른 값을 초래할 수 있습니다.
MFNETSOURCE_LINKBANDWIDTH_ID 클라이언트의 최대 사용 가능한 대역폭(초당 비트)입니다.
MFNETSOURCE_LOSTPACKETS_ID 서버에서 전송했지만 전송 중에 손실되고 클라이언트에서 재생되지 않은 패킷의 수입니다. 값에는 TCP 또는 UDP 패킷이 포함되지 않습니다.
MFNETSOURCE_RECVPACKETS_ID 서버에서 받은 패킷 수 값에 TCP 또는 UDP 패킷이 포함되지 않습니다.
MFNETSOURCE_RECOVEREDBYECCPACKETS_ID 클라이언트 계층에서 복구 및 복구된 네트워크에서 손실된 패킷입니다. 이 값에는 TCP 또는 UDP 패킷이 포함되지 않습니다.
MFNETSOURCE_RESENDSREQUESTED_ID 클라이언트가 새 패킷을 수신하기 위해 수행한 요청 수입니다. 이 값에는 TCP 또는 UDP 패킷이 포함되지 않습니다.
MFNETSOURCE_RECOVEREDPACKETS_ID UDP를 통해 분개했기 때문에 복구된 패킷 수입니다. 이 값에는 TCP 또는 UDP 패킷이 포함되지 않습니다. 클라이언트가 UDP 다시 보내기를 사용하지 않는 한 이 필드에는 0이 포함됩니다.
MFNETSOURCE_BUFFERPROGRESS_ID 버퍼링 중에 채워진 플레이아웃 버퍼의 백분율입니다.
MFNETSOURCE_PROTOCOL_ID 스트림에 액세스하는 데 사용되는 프로토콜입니다. 이는 클라이언트가 요청한 프로토콜과 다를 수 있습니다.
MFNETSOURCE_TRANSPORT_ID 스트림을 제공하는 데 사용되는 전송 프로토콜입니다. UDP 또는 TCP여야 합니다.

네트워크 원본 기능

Media Foundation의 네트워킹