다음을 통해 공유


타임스탬핑 및 기간

이 항목에서는 Media Foundation 변환에서 타임스탬프를 처리하는 방법을 설명합니다.

MFT는 모든 출력 샘플에서 가능한 한 정확한 타임스탬프 및 기간을 설정해야 합니다. 하나의 입력 버퍼를 사용하여 출력 버퍼로 완전히 처리하는 간단한 MFT의 경우 MFT는 입력 샘플에서 출력 샘플로 직접 타임스탬프 및 기간을 복사해야 합니다. 그러나 많은 변환이 이보다 더 복잡하며 출력 시간을 더 복잡하게 계산해야 할 수 있습니다. 모든 MFT는 다음 기본 규칙을 준수해야 합니다.

  • 입력 샘플에 정확한 타임스탬프 또는 기간이 지정되거나 계산될 수 있는 경우 MFT는 압축되지 않은 모든 비디오 또는 오디오 출력 샘플에 타임스탬프와 기간을 배치해야 합니다. 특히 디코더의 경우 일부 출력 타임스탬프를 보간해야 할 수 있습니다.
  • 입력 샘플의 타임스탬프를 최대한 많이 출력 샘플에 보존해야 합니다.
  • MFT가 데이터를 보류하거나 출력을 입력과 다른 크기의 조각으로 나누기 때문에 출력 타임스탬프 또는 기간이 입력과 일치하지 않을 수 있습니다. 이 경우 MFT는 출력 샘플을 만드는 데 사용되는 데이터를 포함하는 초기 입력 샘플의 출력 타임스탬프를 계산해야 합니다. 출력 타임스탬프를 계산하려면 해당 샘플에서 이미 변환된 데이터 기간에 적절한 입력 샘플의 입력 타임스탬프를 추가합니다. 이 섹션의 끝에 있는 두 번째 예제에서는 이 아이디어를 보여 줍니다.
  • 입력 샘플에 기간이 있는 경우 해당 기간이 유지되어야 합니다. 입력 샘플에 기간이 없는 경우 MFT는 출력 버퍼의 크기 또는 미디어 형식에서 제공한 데이터 속도에서 가능한 경우 기간을 계산해야 합니다.
  • 계산된 기간은 가장 가까운 증분으로 반올림되지 않고 잘려야 합니다(반올림). 파이프라인에는 약간 부정확한 기간을 처리하기에 충분한 여유 공간이 있지만 파이프라인이 1% 너무 긴 기간보다 1% 너무 짧은 기간을 처리하는 것이 더 쉽습니다. 즉, 반올림하는 것 외에는 의도적으로 기간을 단축 할 이유가 없습니다.

디코더

디코더는 압축된 패킷을 압축되지 않은 데이터로 변환합니다. 출력이 압축되지 않으므로 디코더에는 타임스탬프를 올바르게 지정해야 하는 특별한 의무가 있습니다. 일부 압축된 형식( 특히 MPEG-2)은 모든 입력 패킷에 타임스탬프를 포함하지 않으며 패킷에 대한 기간이 없는 경우가 많습니다. 이러한 형식의 경우 디코더는 마지막 타임스탬프를 적용한 입력 샘플 이후 모든 출력의 묵시적 기간을 합산하여 모든 출력 샘플에 유효한 타임스탬프를 배치합니다.

비디오의 경우 기간을 압축된 형식으로 사용할 수 없는 경우 디코더는 프레임 속도의 역으로 기간을 계산하고 100나노초 단위로 변환하고 반올림해야 합니다.

오디오의 경우 기간을 압축된 형식으로 사용할 수 없는 경우 디코더는 출력 버퍼의 샘플 수를 곱한 오디오 샘플 속도의 역방향으로 기간을 계산하여 100나노초 단위로 변환하고 반올림해야 합니다.

변환이 타임스탬프 없이 샘플을 출력해야 하는 유일한 시간은 MFT가 입력 샘플에서 타임스탬프를 받은 적이 없거나 이전 입력 타임스탬프에서 정확한 출력 타임스탬프를 계산할 방법이 없는 경우입니다.

오디오 디코더

오디오 디코더의 경우 각 출력 샘플의 기간은 오디오 샘플링 속도 및 출력 버퍼의 채널당 PCM 샘플 수에서 계산됩니다.

출력 타임스탬프를 계산하는 올바른 방법은 입력 샘플에 타임스탬프를 포함하는지 여부에 따라 달라집니다.

입력 샘플에 타임스탬프를 포함하는 경우 디코더는 다음과 같이 입력 타임스탬프를 통해 출력 타임스탬프를 계산합니다.

  • 각 입력 버퍼에 부분 프레임이 없는 하나 이상의 완전한 압축 프레임이 포함된 경우 출력 타임스탬프는 디코더의 알려진 대기 시간을 뺀 입력 타임스탬프를 뺀 값입니다. 예를 들어 DOlby Digital(AC-3) 디코더의 대기 시간은 256개 PCM 샘플입니다. 예를 들어 48kHz 샘플링 속도에서 대기 시간은 5.33밀리초(msec)입니다. 따라서 입력 타임스탬프를 1000msec이면 출력 타임스탬프는 1000 – 5.33 = 994.66msec입니다. 입력 버퍼에 둘 이상의 전체 압축 프레임이 포함된 경우 디코더는 입력 샘플의 모든 프레임에 대해 하나의 출력 샘플을 생성합니다. 모든 출력 샘플은 간격이 없게 타임스탬프를 올바르게 찍습니다.
  • 전송 형식에 따라 입력 버퍼에 부분 프레임이 포함될 수 있습니다. 예를 들어 버퍼에는 이전 입력 버퍼의 프레임 일부가 포함될 수 있으며, 그 다음에는 하나 이상의 전체 프레임과 다음 프레임의 시작이 뒤따를 수 있습니다. 이 경우 일반적으로 입력 타임스탬프는 버퍼 내에서 시작되는 첫 번째 프레임에 해당한다고 가정하는 것이 옳습니다. 즉, 이전 버퍼에서 시작된 부분 프레임은 현재 버퍼의 타임스탬프를 포함하지 않습니다. 그에 따라 출력 타임스탬프를 계산합니다.

입력 샘플에 타임스탬프를 포함하지 않는 경우:

  • 디코더는 자체 타임스탬프를 생성하여 첫 번째 출력 타임스탬프를 0으로 설정해야 합니다.
  • 샘플 기간은 버퍼의 출력 샘플 수와 샘플 속도에서 계산됩니다.
  • 후속 타임스탬프는 이전 타임스탬프를 기준으로 계산됩니다. 현재 타임스탬프를 + 현재 기간 = 다음 타임스탬프를 사용합니다. 출력 타임스탬프는 간격이 없어야 합니다.

입력 스트림에 처음에 타임스탬프를 포함하지만 어떤 이유로 타임스탬프를 사용하지 않는 경우 디코더는 연속되고 간격이 없도록 자체 출력 타임스탬프를 계속 생성해야 합니다.

입력 스트림에 타임스탬프가 포함되어 있지만 시간에 간격이 있는 경우 디코더는 단순히 이러한 간격을 전파합니다. 즉, 디코더는 입력 스트림에서 일관되지 않은 타임스탬프를 수정하려고 시도해서는 안 됩니다.

믹서

참고

Windows Vista에서 Media Foundation 파이프라인은 둘 이상의 입력이 있는 MFT를 지원하지 않습니다. 다중 입력 MFT는 Windows 7에서 지원됩니다.

 

믹서는 여러 입력을 사용하여 하나의 출력으로 혼합합니다. 입력 스트림이 완전히 속도 잠금이 아니거나 서로 시간이 약간 오프셋되는 경우 출력에서 설정할 시간이 모호할 수 있습니다. 다음은 미디어 유형에 따라 몇 가지 지침입니다.

  • 오디오. 시작 시 또는 드레이닝 또는 플러시 직후에 오디오 믹서는 필요한 모든 입력 스트림에서 입력 샘플을 받을 때까지 출력 샘플을 생성할 때까지 기다려야 합니다. 이 시점에서 출력 타임스탬프를 기준으로 사용할 초기 샘플의 초기 타임스탬프를 선택해야 합니다. 다른 스트림은 시간 불일치를 만회하기 위해 무음으로 채워져야 합니다. 선택적 입력 스트림에서 샘플을 수신하는 경우 계산에도 고려되어야 합니다. 이 시점부터 MFT는 출력 타임스탬프의 연속적이고 끊어지지 않은 체인을 생성하기 위해 노력해야 합니다. 일반적으로 MFT는 한 스트림이 다른 스트림을 기준으로 표류하는 것을 고려하지 않아야 합니다. 대신 기준 타임스탬프를 통해 출력 타임스탬프를 계산하고 출력 속도와 버퍼 크기를 계산해야 합니다. 다른 드레이닝 또는 플러시가 발생하면 MFT는 기준 타임스탬프를 다시 설정해야 합니다.

  • 비디오. 시작 시 또는 드레이닝 또는 플러시 직후에 비디오 믹서는 필요한 모든 입력 스트림에서 입력 샘플을 받을 때까지 출력 샘플을 생성하기 위해 기다려야 합니다. 이 시점에서 출력 타임스탬프를 기준으로 사용할 초기 샘플의 초기 타임스탬프를 선택해야 합니다. 일반적으로 입력 프레임을 반복하여 필요한 경우 입력이 일반적이지 않더라도 연속 및 일반 출력 타임스탬프를 유지하고 기간을 고정해야 합니다.

인코더

인코더는 압축되지 않은 오디오 또는 비디오를 압축된 패킷으로 변환합니다. 인코더는 다음 지침을 따라야 합니다.

  • 인코더는 출력 형식의 규칙을 따라야 합니다. 형식이 일반적으로 MPEG-2와 같이 모든 샘플에 타임스탬프를 지정하지 않는 경우 모든 출력 샘플에 타임스탬프를 사용하고 기간이 필요한 것은 아닙니다.

  • 애플리케이션 자체와 같은 다른 원본에서 더 나은 시간 정보를 사용할 수 없는 한 형식에 타임스탬프에 대한 필드가 있는 경우 입력 타임스탬프는 출력 형식으로 유지되어야 합니다.

멀티플렉서

참고

Windows Vista에서 Media Foundation 파이프라인은 둘 이상의 입력이 있는 MFT를 지원하지 않습니다. 다중 입력 MFT는 Windows 7에서 지원됩니다.

 

멀티플렉서는 두 개의 서로 다른 오디오 또는 비디오 스트림을 하나의 인터리브 형식(예: AVI 또는 MPEG-2 전송 스트림)으로 결합합니다. 멀티플렉서는 다음 지침을 따라야 합니다.

  • 멀티플렉서는 출력 형식의 규칙을 따라야 합니다. 형식이 일반적으로 MPEG-2와 같이 모든 샘플에 타임스탬프를 지정하지 않는 경우 모든 출력 샘플에 타임스탬프를 사용하고 기간이 필요한 것은 아닙니다.

  • 타임스탬프는 해당 패킷에서 시작되는 모든 프레임에 배치되는 가장 빠른 시간 또는 해당 패킷에서 디코딩될 첫 번째 오디오 샘플의 시간을 반영해야 합니다. 출력 형식의 규칙과 충돌하는 경우 이 지침을 무시합니다.

Demultiplexers

demultiplexer는 AVI 또는 MPEG-2 전송 스트림과 같은 인터리브 형식을 기본 오디오 및 비디오 스트림으로 분할합니다.

형식에 입력 타임스탬프를 기반으로 정확한 출력 타임스탬프를 계산하는 데 사용할 수 있는 특정 타임스탬프를 포함하는 경우 해당 정보를 사용해야 합니다. 그러나 형식에 입력 타임스탬프와 아무런 관계가 없는 완전히 다른 기준의 시간이 포함되어 있고 입력 타임스탬프에 대한 정확한 오프셋을 계산할 수 없는 경우 형식의 자체 시간을 무시해야 합니다.

형식에 사용 가능한 타임스탬프 정보가 없는 경우 demultiplexer는 다음 규칙을 따라야 합니다.

  • 압축되지 않은 출력 스트림은 가능한 경우 가장 가까운 이전 입력 타임스탬프를 계산한 유효한 타임스탬프를 가져야 합니다.

  • 압축된 출력 스트림에는 타임스탬프를 사용하는 입력 샘플에서 파생된 첫 번째 출력 샘플에만 타임스탬프를 가져야 합니다. 입력 샘플에 타임스탬프를 포함하지 않는 경우 해당 입력 샘플에서 파생된 출력 샘플에는 타임스탬프를 가져야 합니다. 입력 샘플이 여러 출력 샘플로 나뉘어 있는 경우 첫 번째 출력 샘플에만 타임스탬프를 가져야 하며 나머지는 타임스탬프를 갖지 않아야 합니다.

예제 1. 비디오 효과가 항상 압축되지 않은 입력 프레임을 사용하고, 효과를 적용하고, 출력에 복사한다고 가정합니다. 프레임이나 버퍼는 입력을 다시 보유하지 않습니다. 이 MFT는 입력 샘플에서 출력 샘플로 타임스탬프 및 기간을 복사합니다(사용 가능한 경우). 시간 계산은 전혀 수행하지 않습니다.

예제 2. 오디오 효과가 각 입력 버퍼의 10밀리초(밀리초)를 제외한 모든 값을 변환하여 추가 10ms를 저장하여 다음 버퍼와 결합한다고 가정합니다. 모두 50ms의 기간이 있는 샘플 스트림을 가져옵니다. 입력 시간은 다음 표에 나와 있습니다.

샘플 입력 시간 입력 기간 출력 시간 출력 기간
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

샘플 2의 실제 기간과 다음 타임스탬프(121 ? 70 = 51)를 기반으로 하는 암시적 기간 간의 1ms 불일치를 확인합니다.

MFT는 10ms를 유지하므로 입력 샘플 1의 처음 40ms를 출력 샘플 1로 출력하고 타임스탬프는 20ms, 기간은 40ms입니다.

출력 샘플 2는 이전에 보유했던 10ms를 입력 샘플 2의 40ms와 결합합니다. 이 샘플에는 60ms의 타임스탬프(이전 입력 샘플의 타임스탬프, 20ms 및 해당 샘플에서 이미 처리된 데이터의 기간 40ms)가 제공됩니다. 그것은 50ms의 기간을 부여한다.

마찬가지로 다음 샘플에는 50ms의 기간으로 110ms(70ms + 40ms)의 타임스탬프가 있습니다.

다음 계산은 더 흥미롭습니다. 이전 출력 시간과 기간의 암시적 타임스탬프는 160ms(타임스탬프 110ms + 기간 50ms)입니다. 그러나 출력 타임스탬프는 출력 샘플과 시간 및 해당 샘플에서 이미 처리된 데이터의 길이와 겹치는 초기 입력 샘플의 입력 타임스탬프를 통해 계산되어야 합니다. 가장 가까운 겹치는 입력 샘플은 샘플 4(타임스탬프를 = 171)이지만 가장 이른 것은 아닙니다. 가장 빠른 겹치는 샘플은 샘플 3(타임스탬프를 = 121)입니다. 해당 샘플에서 이미 처리된 40ms를 추가하면 결과는 161입니다.

사용자 지정 MFT 작성