새는 버킷 버퍼 모델(Microsoft Media Foundation)

네트워크를 통해 미디어를 스트리밍할 때 디코더는 이론적으로 일정한 속도(전송 속도)로 인코딩된 데이터를 받습니다. 디코더는 이 데이터를 사용하여 디코딩된 출력을 생성합니다. 그러나 일반적으로 디코더는 변수 인코더가 가변 인코딩 속도를 사용할 수 있으므로 데이터를 가변 속도로 사용합니다.

"새는 버킷" 모델은 원활한 재생을 위한 버퍼링 요구 사항을 모델링하는 방법입니다. 이 모델에서 디코더는 버퍼를 유지 관리합니다. 인코딩된 데이터는 네트워크에서 버퍼로, 버퍼에서 디코더로 이동합니다. 버퍼가 언더플로되는 경우 디코더가 네트워크에서 제공하는 것보다 더 빨리 버퍼에서 데이터를 제거한다는 의미입니다. 버퍼 오버플로가 발생하면 네트워크가 디코더에서 사용하는 것보다 더 빠르게 데이터를 전달한다는 의미입니다.

이 항목에서는 인코딩 및 디코딩을 위한 버퍼의 "새는 버킷" 모델에 대해 설명합니다.

새는 버킷

새는 버킷 모델을 이해하려면 아래쪽에 작은 구멍이 있는 버킷을 고려합니다. 세 가지 매개 변수는 버킷을 정의합니다.

  • 용량(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_RMAXMFPKEY_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 스트림에 대한 새는 버킷 값 설정

파일 인코딩 시나리오에서 애플리케이션은 ASF 프로필에서 스트림을 구성하는 동안 새는 버킷 값을 설정할 수 있습니다.

스트림을 만들고 스트림의 IMFASFStreamConfig 인터페이스에 대한 참조가 있으면 다음 특성을 사용하여 값을 설정할 수 있습니다.

스트림을 추가하고 IMFASFStreamConfig 포인터를 가져오는 방법에 대한 자세한 내용은 ASF 파일 싱크에 스트림 정보 추가를 참조하세요.

이러한 값에는 다음 정보 집합이 포함됩니다.

  • 평균 비트 전송률: 미디어 형식 협상 중에 선택된 출력 미디어 형식에서 평균 비트 속도를 가져옵니다. MF_MT_AUDIO_AVG_BYTES_PER_SECOND 특성(오디오 스트림의 경우) 또는 MF_MT_AVG_BITRATE 특성(비디오 스트림의 경우)을 사용합니다.
  • 버퍼 창: 인코더의 instance 출력 미디어 형식을 협상한 경우 나중에 IWMCodecLeakyBucket 인터페이스에 대한 인코더를 쿼리한 다음 IWMCodecLeakyBucket::GetBufferSizeBits(wmcodecifaces.h, wmcodecdspuuid.lib)를 호출하여 이 값을 업데이트할 수 있습니다. 그렇지 않으면 기본값인 3000밀리초를 사용합니다.
  • 초기 버퍼 크기: 0으로 설정합니다.

애플리케이션에서 제공하는 값은 인코딩 유형 및 스트림의 미디어 형식에 따라 달라집니다. 예를 들어 상수 비트 전송률 인코딩 에는 미리 정해진 고정 비트 속도와 버퍼 창이 필요합니다. 애플리케이션은 스트림에서 MFPKEY_VIDEOWINDOW 인코딩 속성 및 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 특성을 설정하여 이러한 새는 버킷 값을 지정할 수 있습니다. 지정된 버퍼 창 값은 인코딩된 파일에 데이터 패킷에 표시된 올바른 송신 시간이 있고 ASF 헤더 개체에 사전 등록 값이 표시되는지 확인하는 데 사용됩니다. 지정된 값이 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 특성에 복사되므로 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 설정하는 것으로 충분합니다.

2-pass 인코딩 모드의 경우 이러한 두 특성을 모두 설정하여 평균 및 최대값을 지정해야 합니다.

VBR 인코딩의 경우 애플리케이션은 인코딩 단계가 완료된 후에만 인코더에서 사용하는 새는 버킷 값을 쿼리할 수 있습니다. 따라서 미디어 싱크를 구성하는 동안 애플리케이션은 새는 버킷과 관련된 특성 또는 속성을 설정하지 않도록 선택할 수 있습니다. 인코딩 후 애플리케이션은 헤더 개체에 정확한 값이 반영되도록 인코더에서 MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAXMFPKEY_BMAX 속성을 쿼리하고 미디어 싱크에서 설정해야 합니다. VBR 인코딩에 대한 값을 업데이트하는 방법에 대한 코드 예제는 자습서: 1-Pass Windows Media Encoding의 "파일 싱크에서 인코딩 속성 업데이트"를 참조하세요.

인코딩하지 않고 원본에서 미디어 싱크로 Windows Media 콘텐츠를 복사하는 경우 새는 버킷 값을 미디어 싱크에서 설정해야 합니다.

ASF 멀티플렉서의 새는 버킷 값

Media Foundation에서 새는 버킷 값은 ASF 멀티플렉서 에서 데이터 패킷을 생성하는 데 사용하는 내부 새는 버킷 값을 설정하는 데 사용됩니다. 페이로드는 미디어 샘플 내에 포함되며 일련의 미디어 샘플은 ASF 데이터 패킷을 구성합니다. 새는 버킷 값과 프레젠테이션 시간에 따라 멀티플렉서는 네트워크를 통해 전송되는 패킷의 비트 전송률이 일정한 비트 속도(R)가 되도록 각 미디어 샘플에 대한 전송 시간을 할당합니다.

애플리케이션은 멀티플렉서에서 새는 버킷 값을 직접 설정할 수 없습니다. 값은 멀티플렉서에 적절한 값을 설정하는 ASF 미디어 싱크에 제공되어야 합니다. MF_ASFSTREAMCONFIG_LEAKYBUCKET1MF_ASFSTREAMCONFIG_LEAKYBUCKET2 설정된 값은 멀티플렉서에서 ASF 미디어 싱크로 전송된 샘플이 지정된 값을 사용하여 생성되는지 확인하는 데 사용됩니다.

ASF 미디어 싱크에서 새는 버킷 값 업데이트

애플리케이션은 미디어 싱크의 속성 저장소에서 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 속성을 설정하여 스트림 수준 새는 버킷 값(스트림을 만드는 동안 ASF 프로필에 설정)을 덮어쓸 수 있습니다. 속성 저장소에 대한 참조를 얻으려면 미디어 싱크에서 구현된 ContentInfo 개체를 사용합니다. 자세한 내용은 파일 싱크에서 속성 설정을 참조하세요.

참고 이 작업은 오디오 스트림에만 허용됩니다.

인코더에서 출력 형식을 설정한 후에는 이 속성을 설정해야 합니다. 미디어 형식에 설정된 비트 전송률에 따라 인코더는 버퍼 크기를 계산하여 생성된 미디어 샘플이 버퍼를 오버플로하지 않도록 합니다. 인코더는 압축된 샘플의 비트 속도를 비트 속도 및 버퍼 창에서 설명하는 경계 내에서 유지하기 위해 압축하는 동안 필요한 조정을 합니다.

새는 버킷에 대한 스트림 구성 특성과 마찬가지로 평균 비트 전송률 및 버퍼 크기 및 DWORD 배열의 초기 버퍼 충만성을 설정합니다. 자세한 내용은 이 항목의 "ASF 스트림에 대한 새는 버킷 값 설정" 섹션을 참조하세요.

Media Foundation의 ASF 지원

Windows Media 코덱