네트워크를 통해 미디어를 스트리밍하는 경우 디코더는 이론적으로 일정한 속도(전송 속도)로 인코딩된 데이터를 받습니다. 디코더는 이 데이터를 사용하여 디코딩된 출력을 생성합니다. 그러나 일반적으로 디코더는 인코더가 변수 인코딩 속도를 사용할 수 있으므로 변수 속도로 데이터를 사용합니다.
"리키 버킷" 모델은 원활한 재생을 위해 버퍼링 요구 사항을 모델링하는 방법입니다. 이 모델에서 디코더는 버퍼를 유지 관리합니다. 인코딩된 데이터는 네트워크에서 버퍼로, 버퍼에서 디코더로 이동합니다. 버퍼가 언더플로되는 경우 디코더가 네트워크에서 제공하는 것보다 더 빨리 버퍼에서 데이터를 제거한다는 의미입니다. 버퍼가 오버플로되는 경우 네트워크가 디코더에서 사용하는 것보다 더 빠르게 데이터를 전달한다는 의미입니다.
이 주제에서는 인코딩 및 디코딩을 위한 버퍼의 "누수 버킷" 모델을 설명합니다.
새는 버킷
새는 버킷 모델을 이해하려면 아래쪽에 작은 구멍이 있는 버킷을 고려합니다. 버킷을 정의하는 세 가지 매개 변수:
- 용량(B)
- 물통에서 물이 흐르는 속도(R)
- 버킷의 초기 충만(F)
이 비유에서 버킷은 버퍼입니다.
버퍼를 버킷으로 보여주는 
R 정확한 속도로 버킷에 물을 쏟아붓는 경우 입력 속도가 출력 속도와 같기 때문에 버킷은 F로 유지됩니다. R 일정하게 유지되는 동안 입력 속도가 증가하면 버킷은 물을 축적합니다. 입력 속도가 지속적인 기간 동안 R보다 크면 결국 버킷이 오버플로됩니다. 그러나 평균 입력 속도가 버킷의 용량을 초과하지 않는 한 입력 속도는 버킷을 오버플로하지 않고 R 따라 달라질 수 있습니다. 용량이 클수록 지정된 시간 내에 입력 속도가 달라질 수 있습니다.
ASF에서 새는 버킷은 다음 세 가지 매개 변수로 정의됩니다.
- 출력 속도(R)에 해당하는 평균 비트 속도(초당 바이트)입니다.
- 버킷 용량(B)에 해당하는 버퍼 창(밀리초)입니다.
- 일반적으로 0으로 설정된 초기 버퍼 상태입니다.
비트 전송률은 인코딩된 스트림의 초당 평균 비트 수를 측정합니다. 버퍼 창은 버퍼에 맞을 수 있는 비트 전송률로 데이터 밀리초 수를 측정합니다. 비트의 버퍼 크기는 R * (B / 1000)와 같습니다.
ASF 페이로드 데이터는 불규칙한 시간과 불규칙한 양으로 새는 버킷에 들어올 수 있지만, 버킷을 일정한 양의 긍정적인 비트 속도로 나가야 합니다. 버퍼 창으로 인해 페이로드가 버킷에 들어오는 시간과 종료되는 시간 사이에 지연이 발생할 수 있습니다. 발생할 수 있는 최대 지연은 B/R. 버킷에 입력되는 페이로드 데이터는 프레젠테이션 시간에 따른 것이며 버킷을 오버플로해서는 안 됩니다. 프레젠테이션 시간 외에도 각 페이로드에는 전송 시간(페이로드 데이터가 비트 전송률에 따라 버킷을 떠나는 시간)도 있습니다. 페이로드가 프레젠테이션 시간 전에 또는 프레젠테이션 시간에 버킷을 빠져나가도록 하려면 전송 시간이 프레젠테이션 시간보다 빨라야 하며, 새는 버킷이 거의 차 있을 때 이를 보장해야 합니다. 이를 위해 프레젠테이션 시간은 B/R 값(초기 설정)으로 앞당겨지고, 전송 시간은 0부터 시작합니다. 전송 시간은 페이로드가 버킷에 너무 늦게 들어갔고 데이터 개체에 포함될 수 없음을 나타내므로 프레젠테이션 시간보다 늦어야 합니다. 프리롤 값이 ASF 헤더 개체에 포함되어 있습니다.
네트워크를 통한 글리치 없는 스트리밍의 경우 미디어 콘텐츠 내의 압축 스트림은 재생 기간 동안 일정한 비트 전송률을 유지해야 합니다. ASF 새는 버킷 모델은 미디어 데이터가 일정한 비트 속도로 네트워크를 통해 전송되도록 합니다. 새는 버킷의 매개 변수는 ASF 헤더 개체확장 스트림 속성 개체에 지정됩니다. Microsoft Media Foundation에서 스트림을 나타내는 미디어 형식의 특성으로 설정됩니다.
새는 버킷 값은 ASF 파일 싱크와 기본 ASF 멀티플렉서 개체 및 Windows Media 인코더 모두에서 정의됩니다. 이러한 값은 동일하거나 다를 수 있습니다. 예를 들어 대기 시간 없이 파일을 스트리밍할 수 있도록 오디오 샘플을 비디오 샘플보다 늦게 배달해야 하는 스트리밍 시나리오를 고려해 보세요. 이를 위해 미디어 싱크에서 오디오 스트림의 새는 버킷을 Windows Media 오디오 인코더에 설정된 값보다 높은 값으로 설정할 수 있습니다.
인코더에서 B/R 값을 설정하려면 애플리케이션에서 MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX및 MFPKEY_BMAX 속성을 설정해야 합니다. 인코더에서 속성을 설정하는 방법에 대한 자세한 내용은 인코딩 속성참조하세요.
사용 중인 버킷
인코더의 목표는 콘텐츠가 버퍼를 오버플로하지 않도록 하는 것입니다. 인코더는 비트 속도 및 버퍼 창 값을 가이드로 사용합니다. 버퍼 창과 같은 기간 동안 전달된 실제 비트 수는 버퍼 크기의 두 배보다 클 수 없습니다.
다음 예제를 생각해 보세요. 3갤런 버킷에 구멍이 있어 분당 1갤런이 흐를 수 있습니다. 양동이를 수도꼭지 아래에 놓고 밸브를 열어 분당 1갤런의 속도로 물이 나오게 합니다. 물은 버킷이 들어오자마자 버킷 밖으로 흘러나와 버킷에 여분의 것을 남기지 않습니다. 그런 다음 수도꼭지에서의 흐름을 분당 2갤런으로 늘립니다. 이 속도로 물이 흐르는 1분마다 2갤런이 버킷으로 들어가고 1갤런이 누출되어 버킷에 1갤런이 남습니다. 3분 후, 6갤런의 물이 양동이에 들어갔고, 3갤런이 누출되었고, 양동이가 가득 찼습니다.
실제로 버퍼 창과 동일한 간격에 대한 이론적 최대 데이터 속도는 달성되지 않습니다. 이전 예제에서는 일정한 데이터 속도를 가정했습니다. 동일한 3갤론 버킷을 감안할 때, 1분 동안 수도꼭지에서 분당 6갤론으로 흐름 속도를 높였다가 2분 동안 수도꼭지를 끄십시오. 버킷에 투입된 총 물의 양이 버퍼 창에 대한 이론적 최대값 내에 있더라도 창의 한 부분에 해당 양의 농도가 있으면 버킷이 오버플로됩니다. 분당 6 갤런으로 3 갤런 짜리 버킷은 30초가 지나고 바로 넘칩니다. 따라서 버퍼 창 설정과 동일한 간격 동안 버퍼에 전달할 수 있는 실제 최대 데이터 양은 개별 샘플의 크기와 전달 시기에 따라 달라집니다.
지금까지 예제에서는 디코더에서 사용하는 버퍼에 대해서만 설명했지만 새는 버킷 버퍼는 압축된 콘텐츠를 만드는 인코더에서도 사용됩니다. 인코더는 압축된 샘플의 비트 전송률을 비트 전송률 및 버퍼 창에서 설명하는 경계 내에서 유지하도록 압축 알고리즘에 필요한 모든 조정을 수행하고 샘플이 일정한 속도로 디코더에 전달될 것이라고 가정합니다. 인코더 버킷은 디코더 버킷을 미러링하는 것으로 생각할 수 있습니다. 인코더 버킷은 개별 샘플의 크기에 따라 결정되는 가변 속도로 채워지고 평균 비트 전송률과 동일한 일정한 속도로 누출됩니다.
네트워크를 통해 함께 연결된 인코더 및 디코더의 다음 예제를 고려해 보세요. 초당 비트 전송률이 6,000비트이고 버퍼 창이 3초(총 버퍼 크기 18,000비트)인 초당 30프레임으로 비디오 파일을 인코딩합니다. 첫 번째 샘플은 키 프레임으로 인코딩되며 7,000비트를 차지합니다. 이제 인코더 버퍼에 7,000비트가 포함됩니다. 다음 29개 프레임은 총 3,000비트인 모든 델타 프레임입니다. 따라서 콘텐츠의 첫 번째 초(30프레임)는 아무 것도 누출되지 않으면 버퍼 충만을 10,000비트로 설정합니다. 스트림의 비트 속도가 초당 6,000비트임을 알고 있으므로 인코딩된 콘텐츠의 첫 번째 초를 인코더 버퍼에 넣으면 충만함이 4,000비트로 떨어집니다. 디코딩 애플리케이션에서 이 스트림은 초당 6,000비트에서 디코더 버퍼에 전달됩니다. 1초 후에 버퍼에는 6,000비트가 포함됩니다. 첫 번째 샘플에는 7,000비트가 포함되어 있으므로 디코더가 샘플 제거를 시작하기 전에 디코더 버퍼를 더 채워야 합니다.
ASF 스트림의 'Leaky Bucket' 값 설정하기
파일 인코딩 시나리오에서 애플리케이션은 ASF 프로필스트림을 구성하는 동안 새는 버킷 값을 설정할 수 있습니다.
스트림을 만들고 스트림의 IMFASFStreamConfig 인터페이스에 대한 참조가 있으면 다음 특성을 사용하여 값을 설정할 수 있습니다.
- MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (평균 누수 버킷 값)
- MF_ASFSTREAMCONFIG_LEAKYBUCKET2(최대 누수 버킷 값)
스트림을 추가하고 IMFASFStreamConfig 포인터를 가져오는 방법에 대한 자세한 내용은 ASF 파일 싱크 스트림 정보 추가참조하세요.
이러한 값에는 다음 정보 집합이 포함됩니다.
- 평균 비트 전송률: 미디어 형식 협상 중에 선택한 출력 미디어 형식에서 평균 비트 전송률을 가져옵니다. MF_MT_AUDIO_AVG_BYTES_PER_SECOND 특성(오디오 스트림의 경우) 또는 MF_MT_AVG_BITRATE 특성(비디오 스트림의 경우)을 사용합니다.
- 버퍼 창: 인코더 인스턴스가 있고 출력 미디어 형식을 협상한 경우 나중에 IWMCodecLeakyBucket 인터페이스에 대한 인코더를 쿼리한 다음 IWMCodecLeakyBucket::GetBufferSizeBits(wmcodecifaces.h, wmcodecdspuuid.lib)를 호출하여 이 값을 업데이트할 수 있습니다. 그렇지 않으면 기본값인 3000밀리초를 사용합니다.
- 초기 버퍼 크기: 0으로 설정합니다.
애플리케이션에서 제공하는 값은 인코딩 유형과 스트림의 미디어 형식에 따라 달라집니다. 예를 들어 상수 비트 전송률 인코딩 미리 정해진 고정 비트 전송률 및 버퍼 창이 필요합니다. 애플리케이션은 스트림에서 MFPKEY_VIDEOWINDOW 인코딩 속성과 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 특성을 설정하여 이러한 누출 버킷 값을 지정할 수 있습니다. 지정된 버퍼 창 값은 인코딩된 파일에 데이터 패킷에 표시된 올바른 송신 시간이 있고 ASF 헤더 개체에 사전 등록 값이 표시되는지 확인하는 데 사용됩니다. 지정된 값이 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 특성에 복사되므로 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 설정하는 것으로 충분합니다.
2단계 인코딩 모드의 경우 이러한 두 특성을 모두 설정하여 평균 및 최대값을 지정해야 합니다.
VBR 인코딩의 경우 애플리케이션은 인코딩 과정이 완료된 후에만 인코더에서 사용하는 새는 버킷 값을 쿼리할 수 있습니다. 따라서 미디어 싱크를 구성하는 동안 애플리케이션은 새는 버킷과 관련된 특성 또는 속성을 설정하지 않도록 선택할 수 있습니다. 인코딩 후 애플리케이션은 헤더 개체에 정확한 값이 반영되도록 MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX및 MFPKEY_BMAX 속성에 대한 인코더를 쿼리하고 미디어 싱크에 설정해야 합니다. VBR 인코딩에 대한 값을 업데이트하는 방법에 대한 코드 예제는 자습서의 "파일 싱크에서 인코딩 속성 업데이트"를 참조하세요. 1-Pass Windows Media Encoding.
인코딩하지 않고 원본에서 미디어 싱크로 Windows Media 콘텐츠를 복사하는 경우 새는 버킷 값을 미디어 싱크에 설정해야 합니다.
ASF 멀티플렉서의 누수 버킷 값
Media Foundation에서 새는 버킷 값은 ASF 멀티플렉서 데이터 패킷을 생성하는 데 사용하는 내부 새는 버킷 값을 설정하는 데 사용됩니다. 페이로드는 미디어 샘플 내에 포함되며 일련의 미디어 샘플은 ASF 데이터 패킷을 구성합니다. 새는 버킷 값과 프레젠테이션 시간에 따라 멀티플렉서는 각 미디어 샘플에 대한 전송 시간을 할당하여 네트워크를 통해 전송되는 패킷의 비트 전송률이 일정한 비트 전송률(R)되도록 합니다.
애플리케이션은 멀티플렉서에서 누수 버킷 값을 직접 설정할 수 없습니다. 값은 멀티플렉서에 적절한 값을 설정하는 ASF 미디어 싱크에 제공되어야 합니다. MF_ASFSTREAMCONFIG_LEAKYBUCKET1 및 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 설정된 값은 멀티플렉서에서 ASF 미디어 싱크로 전송된 샘플이 지정된 값을 사용하여 생성되는지 확인하는 데 사용됩니다.
ASF 미디어 싱크에서 누출 버킷 값 업데이트
애플리케이션은 스트림 생성 시 ASF 프로필에 설정된 스트림 수준 누수 버킷 값을 미디어 싱크의 속성 저장소에서 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 속성을 설정하여 덮어쓸 수 있습니다. 속성 저장소에 대한 참조를 얻으려면 미디어 싱크에 의해 구현된 ContentInfo 개체를 사용합니다. 자세한 내용은 파일 싱크 설정 속성을 참조하세요.
참고 이 작업은 오디오 스트림에만 허용됩니다.
인코더에서 출력 형식을 설정한 후에는 이 속성을 설정해야 합니다. 미디어 형식의 비트 전송률 집합에 따라 인코더는 버퍼 크기를 계산하여 생성된 미디어 샘플이 버퍼를 오버플로하지 않도록 합니다. 인코더는 압축된 샘플의 비트 속도를 비트 전송률 및 버퍼 창에서 설명하는 경계 내에서 유지하기 위해 압축 중에 필요한 조정을 합니다.
새는 버킷의 스트림 구성 속성처럼, 평균 비트 전송률과 버퍼 크기, 그리고 초기 버퍼 충만성을 DWORD 배열로 설정합니다. 자세한 내용은 이 주제의 "ASF 스트림을 위한 누수 버킷 값 설정" 섹션을 참조하세요.
관련 항목