속도 제어 구현

이 항목에서는 사용자 지정 파이프라인 개체가 역방향 재생을 포함하여 가변 재생 속도를 지원하는 방법에 대해 설명합니다. 애플리케이션에서 속도 제어를 사용하는 방법에 대한 자세한 내용은 Rate Control을 참조하세요.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

Microsoft Media Foundation 파이프라인 개체(미디어 원본, 변환 또는 미디어 싱크)를 작성하는 경우 가변 재생 속도를 지원해야 할 수 있습니다. 이렇게 하려면 다음 인터페이스를 구현합니다.

  1. IMFGetService 인터페이스를 구현합니다.
  2. MF_RATE_CONTROL_SERVICE 서비스를 지원합니다. ( 서비스 인터페이스를 참조하세요.)
  3. 개체에서 지원하는 재생 속도를 가져오는 IMFRateSupport 인터페이스를 구현합니다.
  4. 재생 속도를 가져오거나 설정하는 IMFRateControl 인터페이스를 구현합니다.

미디어 원본

미디어 원본이 속도 제어를 지원하는 경우 IMFRateSupportIMFRateControl을 모두 구현해야 합니다. 그렇지 않으면 Media Session은 파이프라인에 있는 다른 구성 요소에 관계없이 최소 및 최대 재생 속도가 1.0이라고 보고합니다.

재생 속도는 샘플의 프레젠테이션 시간에 영향을 주지 않으므로 미디어 원본이 타임스탬프를 조정해서는 안 됩니다. 대신 프레젠테이션 시계가 더 빠르거나 느린 속도로 실행됩니다. 역방향 재생의 경우 소스는 타임스탬프를 줄이는 역순으로 샘플을 제공합니다.

IMFRateControl::SetRate 메서드의 fThin 매개 변수는 미디어 원본이 콘텐츠를 해야 하는지 여부를 나타냅니다. 씬닝은 주로 비디오 스트림에 적용됩니다. 씬 모드에서 원본은 델타 프레임을 삭제하고 키 프레임만 제공합니다. 매우 높은 재생 속도로 원본은 일부 키 프레임을 건너뛸 수 있습니다(예: 다른 모든 키 프레임 제공).

원본은 오디오 샘플을 씬닝 모드로 삭제할 필요가 없습니다. 그러나 매우 높은 재생 속도로 원본이 파이프라인의 샘플 요청을 채우기 위해 데이터를 빠르게 읽지 못할 수 있습니다. 이 경우 원본에서 일부 오디오 데이터를 삭제해야 할 수 있습니다. 그렇다면 비디오 샘플에 근접한 오디오 샘플을 제공하려고 시도해야 합니다(원본에 두 가지 유형의 스트림이 모두 있다고 가정).

스트림이 씬 모드와 씬이 아닌 모드 간에 전환되면 MEStreamThinMode 이벤트를 보냅니다.

미디어 원본이 SetRate에 대한 호출을 완료하면 MESourceRateChanged 이벤트를 보냅니다.

역방향 재생 중:

  • 미디어 소스는 타임스탬프를 조정하지 않고 역순으로 샘플을 제공합니다.
  • 스트림 내의 타임스탬프는 단조롭게 감소해야 합니다.
  • 콘텐츠의 시작은 스트림의 끝으로 간주됩니다. 각 미디어 스트림이 스트림의 첫 번째 샘플(즉, 프레젠테이션 시간 = 0)을 전달한 후 MEEndOfStream 이벤트를 보냅니다.

Media Foundation 변환

일반적으로 MFT(Media Foundation 변환)는 MFT가 씬되지 않은 역방향 재생을 구현하지 않는 한 속도 제어에 대한 명시적 지원이 필요하지 않습니다.

MFT가 IMFRateSupport 인터페이스를 구현하지 않는 경우 미디어 세션은 다음을 가정합니다.

  • MFT는 얇고 얇지 않은 전방 재생에 대한 중재 재생 속도를 지원합니다.
  • MFT는 씬 역방향 재생을 지원하지만 얇지 않은 역방향 재생을 지원하지 않습니다.

이러한 조건 중 하나가 사실이 아닌 경우 MFT는 IMFRateSupportIMFRateControl을 구현해야 합니다.

역방향 재생

파이프라인에서 하나 이상의 변환이 역방향 재생을 명시적으로 지원하지 않더라도 미디어 세션은 역방향으로 재생할 수 있습니다.

MFT가 IMFRateSupport 인터페이스를 노출하지 않는 경우 미디어 세션은 다음과 같이 역방향 재생에 씬닝 을 사용합니다.

  • 미디어 세션은 IMFTransform::P rocessInput을 호출하여 일반적인 방식으로 MFT에 키 프레임을 보냅니다.

  • 미디어 세션은 델타 프레임을 삭제하고 MEStreamTick 이벤트로 대체합니다.

  • 각 샘플 간에 미디어 세션은 MFT를 플러시하여 타임스탬프가 감소하고 있다는 사실로 인한 오류를 방지합니다.

샘플은 MFSampleExtension_CleanPoint 특성이 TRUE로 설정된 경우 키 프레임으로 간주되며, 이 특성이 FALSE 이거나 설정되지 않은 경우 델타 프레임으로 간주됩니다.

MFT가 IMFRateSupport를 구현하는 경우 미디어 세션은 이 인터페이스를 사용하여 MFT가 씬되지 않은 역방향 재생을 지원하는지 여부를 검색합니다. MFT가 얇지 않은 역방향 재생을 지원하는 경우 미디어 세션은 샘플을 삭제하거나 MFT를 플러시하지 않고 모든 샘플을 역순으로 제공합니다.

MFT가 씬되지 않은 역방향 재생을 지원하는 경우 IMFRateControl 인터페이스를 구현해야 합니다. 미디어 세션은 역방향 재생이 발생할 때 이 인터페이스를 사용하여 MFT에 알립니다. 이 시점에서 MFT는 타임스탬프가 감소하고 델타 프레임이 역순으로 도착할 수 있도록 준비해야 합니다. 디코더는 일반적으로 전체 GOP(사진 그룹)를 받을 때까지 샘플을 버퍼링한 다음, 전체 GOP를 디코딩하고 디코딩된 프레임을 올바른(역방향) 순서로 출력해야 합니다.

미디어 싱크

미디어 싱크가 속도 없는 경우 미디어 세션은 미디어 싱크가 재생 속도를 처리할 수 있다고 가정합니다. 미디어 싱크는 IMFRateSupport를 구현할 필요가 없습니다. (속도 없는 미디어 싱크는 IMFMediaSink::GetCharacteristics 메서드에서 MEDIASINK_RATELESS 플래그를 반환합니다.

그렇지 않으면 미디어 싱크가 1.0 이외의 재생 속도를 처리할 수 있는 경우 IMFRateSupport 를 구현해야 합니다.

미디어 싱크는 IMFRateControl을 구현해서는 안 됩니다. 재생 속도가 변경되면 프레젠테이션 클록은 미디어 싱크의 IMFClockStateSink::OnClockSetRate 메서드를 호출합니다 .

속도 제어

검색, 빠른 전달 및 역방향 플레이