누수 버킷 버퍼 모델(Microsoft 미디어 파운데이션)

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

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

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

누수 버킷

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

  • 용량(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 미디어 파운데이션 스트림을 나타내는 미디어 형식의 특성으로 설정됩니다.

누수 버킷 값은 ASF 파일 싱크와 기본 ASF 멀티플렉서 개체 및 Windows Media 인코더 둘 다에서 정의됩니다. 이러한 값은 동일하거나 다를 수 있습니다. 예를 들어 대기 시간 없이 파일을 스트리밍할 수 있도록 오디오 샘플이 비디오 샘플보다 나중에 배달되어야 하는 스트리밍 시나리오를 고려해 보겠습니다. 이를 위해 미디어 싱크에서 오디오 스트림의 누수 버킷을 Windows Media 오디오 인코더에 설정된 값보다 높은 값으로 설정할 수 있습니다.

인코더에서 B/R 값을 설정하려면 애플리케이션에서 MFPKEY _ RAVG, MFPKEY _ BAVG, MFPKEY _ RMAXMFPKEY _ BMAX 속성을 설정해야 합니다. 인코더의 속성 설정에 대한 자세한 내용은 속성 인코딩을 참조하세요.

사용 중 버킷

인코더의 목표는 콘텐츠가 버퍼를 오버플로하지 않도록 하는 것입니다. 인코더에서는 비트 비율 및 버퍼 창 값을 가이드로 사용합니다. 버퍼 창과 동일한 기간 동안 전달된 실제 비트 수는 버퍼 크기의 두 배 이상일 수 없습니다.

다음 예제를 고려해 보십시오. 3-스트루 버킷에 구멍이 있으며, 이 버킷에는 분당 1개까지 흐를 수 있습니다. 버킷을 spigot 아래에 놓고 밸브를 열어 1분당 1밀리소 속도로 수분을 내보낼 수 있습니다. 물은 입력할 때와 같이 빠르게 버킷 밖으로 흐르며 버킷에 추가적인 추가 는 남기지 않습니다. 그런 다음, 흐름을 spigot에서 분당 2개까지 늘입니다. 이 속도로 용수가 흐르는 1분마다 2개의 냉간이 버킷으로 이동하고 1개의 냉방이 누출되어 버킷에 1개의 오염이 남습니다. 3분이 지나면 6개의 수분이 버킷으로 들어갔고, 3개의 냉방이 누출되었으며, 버킷이 가득 찼습니다.

실제로 버퍼 창과 동일한 간격에 대한 이론적 최대 데이터 속도는 달성되지 않습니다. 이전 예제는 일정한 데이터 속도를 가정했습니다. 동일한 3개 버킷이 있는 경우 1분 동안 spigot에서 분당 6번으로 흐름 속도를 늘인 다음, 2분 동안 spigot을 해제할 수 있습니다. 버킷에 넣기 위한 총 수량은 버퍼 창에 대한 이론적 최대값 내에 있더라도 해당 양이 창의 한 부분으로 집중되면 버킷이 오버플로됩니다. 분당 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 프로필에서 스트림을 구성하는 동안 누수 버킷 값을 설정할 수 있습니다.

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

스트림을 추가하고 STREAMASFStreamConfig 포인터를 얻는 자세한 내용은 ASF 파일 싱크에 스트림 정보 추가를참조하세요.

이러한 값은 다음 정보 집합을 포함합니다.

  • 평균 비트 비율: 미디어 유형 협상 중에 선택한 출력 미디어 유형에서 평균 비트 비율을 얻습니다. MF _ MT _ AUDIO _ AVG _ BYTES _ PER _ SECOND 특성(오디오 스트림의 경우) 또는 MF _ MT _ AVG _ BITRATE 특성(비디오 스트림의 경우)을 사용합니다.
  • 버퍼 창: 인코더 인스턴스가 있고 출력 미디어 형식을 협상한 경우 나중에 IWMCodecLeakyBucket 인터페이스에 대한 인코더를 쿼리한 다음 IWMCodecLeakyBucket::GetBufferSizeBits(wmcodecifaces.h, wmcodecdspuuid.lib)를 호출하여 이 값을 업데이트할 수 있습니다. 그렇지 않으면 기본값인 3000밀리초 를 사용합니다.
  • 초기 버퍼 크기: 0으로 설정합니다.

애플리케이션에서 제공하는 값은 인코딩 유형과 스트림의 미디어 형식에 따라 달라집니다. 예를 들어 상수 비트 비율 인코딩에는 미리 결정된 고정 비트 속도와 버퍼 창이 필요합니다. 응용 프로그램은 스트림에 MFPKEY _ videowindow encoding 속성과 MF _ ASFSTREAMCONFIG _ LEAKYBUCKET1 특성을 설정 하 여 이러한 누설 버킷 값을 지정할 수 있습니다. 지정 된 버퍼 창 값은 인코딩된 파일에 데이터 패킷에 표시 된 올바른 전송 시간이 있는지 확인 하 고, 미리 받기 값이 ASF 헤더 개체에 표시 되도록 하는 데 사용 됩니다. 지정 된 값은 mf _ ASFSTREAMCONFIG _ LEAKYBUCKET2 특성에 복사 되므로 mf _ ASFSTREAMCONFIG _ LEAKYBUCKET1 를 설정 하는 것으로 충분 합니다.

2 패스 인코딩 모드의 경우 평균 및 최대값을 지정 하도록 두 특성을 모두 설정 해야 합니다.

VBR 인코딩의 경우 응용 프로그램은 인코딩 패스가 완료 된 후에만 인코더에서 사용 하는 누설 버킷 값을 쿼리할 수 있습니다. 따라서 미디어 싱크를 구성 하는 동안 응용 프로그램은 누설 버킷에 관련 된 특성이 나 속성을 설정 하지 않도록 선택할 수 있습니다. 인코딩 후 응용 프로그램은 MFPKEY _ ravg, MFPKEY _ bavg, MFPKEY _ ravgMFPKEY _ Bavg 속성에 대해 인코더를 쿼리하고 정확한 값이 헤더 개체에 반영 되도록 미디어 싱크에 설정 해야 합니다. VBR 인코딩에 대 한 값을 업데이트 하는 방법에 대 한 코드 예제는 자습서: 1-Windows 미디어 인코딩 전달의 "파일 싱크에서 인코딩 속성 업데이트"를 참조 하세요.

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

ASF 멀티플렉서에서 버킷 값 누설

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

응용 프로그램은 멀티플렉서에서 직접 누설 버킷 값을 설정할 수 없습니다. 값은 멀티플렉서에서 적절 한 값을 설정 하는 ASF 미디어 싱크에 제공 되어야 합니다. Mf _ ASFSTREAMCONFIG _ LEAKYBUCKET1mf _ ASFSTREAMCONFIG _ LEAKYBUCKET2 에 설정 된 값은 지정 된 값을 사용 하 여 ASF 미디어 싱크로 전송 된 샘플이 생성 되었는지 확인 하는 데 사용 됩니다.

ASF 미디어 싱크에서 누설 버킷 값 업데이트

응용 프로그램은 미디어 싱크의 속성 저장소에서 MFPKEY _ ASFSTREAMSINK _ 수정 된 _ LEAKYBUCKET 속성을 설정 하 여 스트림 생성 중에 ASF 프로필에 설정 된 스트림 수준 누설 버킷 값을 덮어쓸 수 있습니다. 속성 저장소에 대 한 참조를 가져오려면 미디어 싱크에 의해 구현 된 ContentInfo 개체를 사용 합니다. 자세한 내용은 파일 싱크에서 속성 설정을 참조 하세요.

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

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

누설 버킷에 대 한 스트림 구성 특성과 마찬가지로, 평균 비트 전송률 및 버퍼 크기와 Dword 배열의 초기 버퍼 사용률을 설정 합니다. 자세한 내용은이 항목에서 "ASF 스트림에 대 한 누설 버킷 값 설정" 섹션을 참조 하십시오.

미디어 파운데이션에서 ASF 지원

Windows 미디어 코덱