시퀀스 프레젠테이션 시간

이 항목에서는 시퀀서 원본 이 재생 중에 프레젠테이션 시간을 처리하는 방법을 설명합니다.

개요

시퀀서 소스는 재생 목록 시퀀스와 편집 시퀀스의 두 가지 모드를 지원합니다.

편집 시퀀스에서 애플리케이션은 재생을 시작하기 전에 각 세그먼트의 기간을 미리 지정합니다. 재생 목록 시퀀스에서 애플리케이션은 기간을 미리 지정하지 않습니다. (실제로 기간을 알 수 없습니다.)

두 경우 모두 세그먼트의 미디어 시작 및 미디어 중지 시간을 지정할 수 있습니다. 이러한 시간은 세그먼트가 시작되고 끝나는 원본 파일의 위치를 지정합니다. 예를 들어 원본 파일의 길이가 90초라고 가정합니다. 처음 10초와 마지막 10초를 자르려면 다음 값을 지정합니다.

  • 미디어 시작: 10초
  • 미디어 중지: 80초

미디어 시작 시간을 지정하려면 원본 노드에서 MF_TOPONODE_MEDIASTART 특성을 설정합니다. 미디어 중지 시간을 지정하려면 원본 노드에서 MF_TOPONODE_MEDIASTOP 특성을 설정합니다.

편집 시퀀스를 만들려면 미디어 세션을 만들 때 MF_SESSION_GLOBAL_TIME 특성을 설정합니다. 그렇지 않으면 미디어 세션에서 재생 목록 시퀀스를 예상합니다. 편집 시퀀스에서 모든 세그먼트 토폴로지에는 MF_TOPOLOGY_PROJECTSTART 특성과 MF_TOPOLOGY_PROJECTSTOP 특성이 있어야 합니다.

재생 목록 시퀀스

재생 목록 시퀀스에서 프레젠테이션 시계는 0에서 시작하여 세그먼트 경계를 넘어 계속됩니다. 네이티브 소스는 미디어 시간과 동일한 타임스탬프를 가진 샘플을 제공합니다. 파이프라인은 다음과 같이 타임스탬프를 올바른 프레젠테이션 시간으로 변환합니다.

  • 새 타임스탬프를 = 미디어 시간 + 오프셋 - 미디어 시작

오프셋 값은 이전 세그먼트가 종료된 프레젠테이션 시간입니다. 첫 번째 세그먼트의 경우 오프셋은 0입니다. 다음은 이러한 타임스탬프를 변환하는 방법의 두 가지 예입니다.

  • 예제 1: 첫 번째 세그먼트(S1)의 길이가 10초이고 두 번째 세그먼트(S2)의 미디어 시작 시간이 0이라고 가정합니다. 네이티브 소스는 타임스탬프를 위해 미디어 시간을 사용하므로 S2의 첫 번째 샘플에는 타임스탬프는 0입니다. 오프셋은 10초(S1 기간)이므로 조정된 타임스탬프는 :0 + 10 - 0 = 10초입니다.
  • 예제 2: 세그먼트 S1의 길이가 10초이고 S2의 미디어 시작 시간이 5초라고 가정합니다. S2의 첫 번째 샘플에는 5초(미디어 시간)의 타임스탬프를 포함합니다. 오프셋은 10초이므로 조정된 타임스탬프는 :5 + 10 - 5 = 10초입니다.

원본 노드의 모든 파이프라인 구성 요소 다운스트림은 조정된 타임스탬프를 사용하여 샘플을 받습니다. 토폴로지의 원본 노드는 미디어 시작 시간이 다를 수 있으므로 조정은 토폴로지의 각 분기에 대해 별도로 계산됩니다.

프레젠테이션이 다음 세그먼트로 전환되면 프레젠테이션 시계가 중지되거나 다시 설정되지 않으며 프레젠테이션 시간이 단조롭게 증가합니다. 새 세그먼트가 시작되기 전에 미디어 세션은 애플리케이션에 MESessionNotifyPresentationTime 이벤트를 보냅니다. 이벤트는 프레젠테이션 클록과 오프셋 값을 기준으로 세그먼트의 시작 시간을 지정합니다. 새 세그먼트가 시작되면 파이프라인은 값이 VT_EMPTY 시퀀서 원본에서 Start 를 호출합니다. 시퀀서 원본은 시작 시간 없이 MESourceStarted 이벤트를 보냅니다.

검색하기 위해 애플리케이션은 세그먼트 식별자와 세그먼트 내의 시간 오프셋을 지정합니다. 검색 후 프레젠테이션 시계는 세그먼트 오프셋에서 시작됩니다. 해당 프로세스가 작동하는 방식의 예는 다음과 같습니다.

  • 예제 3: 애플리케이션은 세그먼트 오프셋이 10초인 S3 세그먼트를 찾습니다. 프레젠테이션 클록은 10초(세그먼트 오프셋)에서 시작됩니다. 오프셋에는 세그먼트 S1 및 S2 기간이 포함되지 않습니다. 시퀀서 소스는 시작 시간이 세그먼트 오프셋인 10초와 같은 MESourceStarted 이벤트를 보냅니다.

검색 후 재생이 다음 세그먼트로 계속되는 경우 오프셋에 건너뛴 세그먼트가 포함되지 않는다는 점을 제외하고 전환은 이전 예제와 마찬가지로 작동합니다.

다음은 샘플에 타임스탬프를 적용하는 방법에 영향을 주는 몇 가지 추가 세부 정보입니다.

  • 디코더는 미디어 중지 시간 이후의 데이터가 필요할 수 있습니다. 파이프라인은 디코더에 필요한 만큼의 데이터를 원본에서 가져온 다음 디코더의 출력 샘플을 트리밍합니다.
  • 변환은 데이터를 버퍼링할 수 있습니다. 예를 들어 오디오 효과가 이 작업을 수행해야 할 수 있습니다. 세그먼트가 종료되면 변환에서 마지막 샘플의 타임스탬프는 세그먼트의 끝보다 이전입니다. 변환이 일부 데이터를 보류하기 때문입니다. 다음 세그먼트가 시작되면 첫 번째 샘플의 타임스탬프는 세그먼트의 시작보다 약간 이전입니다. 타임스탬프는 간격이 없으므로 미디어 싱크에 도달하는 데이터는 연속됩니다. 최종 세그먼트가 종료되면 파이프라인이 변환을 드레이닝하므로 데이터가 손실되지 않습니다.
  • 원본은 이전 키 프레임을 선택하기 위해 미디어 시작 시간보다 약간 일찍 시작해야 할 수 있습니다. 따라서 조정 후 첫 번째 샘플의 프레젠테이션 시간이 음수일 수 있습니다.

시퀀스 편집

편집 시퀀스에서 애플리케이션은 MF_TOPOLOGY_PROJECTSTARTMF_TOPOLOGY_PROJECTSTOP 특성을 설정하여 세그먼트 경계를 미리 지정합니다. 파이프라인은 재생 목록 시퀀스의 경우와 거의 동일한 방식으로 타임스탬프를 조정합니다.

  • 오프셋의 경우 세그먼트의 관찰된 끝을 사용하는 대신 MF_TOPOLOGY_PROJECTSTART 값을 사용합니다.

  • 검색을 위해 오프셋은 세그먼트의 MF_TOPOLOGY_PROJECTSTART 값과 세그먼트 오프셋과 같은 값을 사용합니다.

따라서 편집 시퀀스의 프레젠테이션 시간은 애플리케이션이 다른 세그먼트를 찾는 경우에도 항상 프레젠테이션 시작에 상대적입니다.

미디어 세션

Sequencer 원본