IMFMediaSource::Start 메서드(mfidl.h)

재생을 시작할 위치를 지정하여 미디어 원본을 시작, 검색 또는 다시 시작합니다.

구문

HRESULT Start(
  [in] IMFPresentationDescriptor *pPresentationDescriptor,
  [in] const GUID                *pguidTimeFormat,
  [in] const PROPVARIANT         *pvarStartPosition
);

매개 변수

[in] pPresentationDescriptor

미디어 원본 프레젠테이션 설명자의 IMFPresentationDescriptor 인터페이스에 대한 포인터입니다. 프레젠테이션 설명자를 얻으려면 IMFMediaSource::CreatePresentationDescriptor를 호출합니다. 시작을 호출하기 전에 프레젠테이션 설명자를 수정하여 스트림을 선택하거나 선택 취소하거나 미디어 형식을 변경할 수 있습니다.

[in] pguidTimeFormat

시간 형식을 지정하는 GUID에 대한 포인터입니다. 시간 형식은 pvarStartPosition 매개 변수의 단위를 정의합니다. 값 GUID_NULL 시간 형식은 100나노초 단위입니다. 일부 미디어 원본은 추가 시간 형식 GUID를 지원할 수 있습니다. 이 매개 변수는 NULL일 수 있습니다. 값이 NULL이면 GUID_NULL 동일합니다.

[in] pvarStartPosition

재생을 시작할 위치를 지정합니다. 이 매개 변수의 단위는 pguidTimeFormat에 지정된 시간 형식으로 표시됩니다. 시간 형식이 GUID_NULL 경우 변형 형식은 VT_I8 또는 VT_EMPTY 합니다. VT_I8 사용하여 100나노초 단위로 새 시작 위치를 지정합니다. VT_EMPTY 사용하여 현재 위치에서 시작합니다. 다른 시간 형식은 다른 PROPVARIANT 형식을 사용할 수 있습니다.

반환 값

이 메서드는 HRESULT를 반환합니다. 가능한 값에는 다음 표에 있는 값이 포함되지만, 이에 국한되는 것은 아닙니다.

반환 코드 Description
S_OK
메서드가 성공했습니다.
MF_E_ASF_OUTOFRANGE
시작 위치가 프레젠테이션의 끝을 지났습니다(ASF 미디어 원본).
MF_E_HW_MFT_FAILED_START_STREAMING
하드웨어 디바이스에서 스트리밍을 시작할 수 없습니다. 이 오류 코드는 카메라와 같은 하드웨어 디바이스를 나타내는 미디어 소스에서 반환할 수 있습니다. 예를 들어 카메라가 이미 다른 애플리케이션에서 사용 중인 경우 메서드는 이 오류 코드를 반환할 수 있습니다.
MF_E_INVALIDREQUEST
시작 요청이 잘못되었습니다. 예를 들어 시작 위치가 프레젠테이션의 끝을 지났습니다.
MF_E_SHUTDOWN
미디어 원본의 Shutdown 메서드가 호출되었습니다.
MF_E_UNSUPPORTED_TIME_FORMAT
미디어 원본은 pguidTimeFormat에 지정된 시간 형식을 지원하지 않습니다.

설명

이 메서드는 비동기적이며, 작업이 성공하면 미디어 원본은 다음 이벤트를 보냅니다.

  • 각 새 스트림에 대해 원본은 MENewStream 이벤트를 보냅니다. 이 이벤트는 스트림이 표시되는 첫 번째 시작 호출에 대해 전송됩니다. 이벤트 데이터는 스트림의 IMFMediaStream 인터페이스에 대한 포인터입니다.
  • 업데이트된 각 스트림에 대해 원본은 MEUpdatedStream 이벤트를 보냅니다. 스트림은 Start가 호출될 때 스트림이 이미 있는 경우(예: 애플리케이션이 재생 중에 찾은 경우) 업데이트됩니다. 이벤트 데이터는 스트림의 IMFMediaStream 인터페이스에 대한 포인터입니다.
  • 이전 상태가 중지된 경우 원본은 MESourceStarted 이벤트를 보냅니다.
  • 이전 상태가 시작되거나 일시 중지되고 시작 위치가 현재 위치(VT_EMPTY)인 경우 원본은 MESourceStarted 이벤트를 보냅니다.
  • 이전 상태가 시작되거나 일시 중지되고 새 시작 위치가 지정된 경우 원본은 MESourceSeeked 이벤트를 보냅니다.
  • 원본이 MESourceStarted 이벤트를 보내는 경우 각 미디어 스트림은 MEStreamStarted 이벤트를 보냅니다. 원본이 MESourceSeeked 이벤트를 보내는 경우 각 스트림은 MEStreamSeeked 이벤트를 보냅니다.
메서드가 S_OK 반환한 후 시작 작업이 비동기적으로 실패하면 미디어 원본은 여기에 나열된 다른 이벤트를 보내지 않고 오류 코드가 포함된 MESourceStarted 이벤트를 보냅니다. 메서드가 동기적으로 실패하면(오류 코드 반환) 이벤트가 발생하지 않습니다.

Start를 호출하면 이전 상태가 시작되었거나 일시 중지되고 새 시작 위치가 VT_EMPTY 않은 경우 검색이 발생합니다. 모든 미디어 원본이 검색할 수 있는 것은 아닙니다. 미디어 원본이 검색할 수 있는 경우 IMFMediaSource::GetCharacteristics 메서드는 MFMEDIASOURCE_CAN_SEEK 플래그를 반환합니다.

미디어 원본의 이벤트는 미디어 스트림의 이벤트와 동기화되지 않습니다. 따라서 미디어 원본을 찾는 경우 MESourceSeeked 이벤트를 받은 후에도 이전 위치에서 샘플을 받을 수 있습니다. 작업을 동기화해야 하는 경우 검색이 발생하는 스트림의 정확한 지점을 표시하는 스트림 이벤트 MEStreamSeeked를 기다립니다.

Stream 끝

스트림이 끝까지 재생되면 스트림은 MEEndOfStream 이벤트를 보냅니다. 선택한 모든 스트림이 끝에 도달하면 미디어 원본은 MEEndOfPresentation 이벤트를 보냅니다.

시작 위치가 선택한 스트림의 끝을 지나면(프레젠테이션이 끝나기 전에) 스트림은 MEStreamStartedMEStreamSeeked/ 직후 MEEndOfStream을 보내야 합니다. 재생이 프레젠테이션의 끝에 도달하고 Start 가 현재 위치에서 다시 호출되면 스트림은 MEEndOfStream 이벤트를 다시 보내고 미디어 원본은 MEEndOfPresentation 이벤트를 다시 보냅니다. 이러한 이벤트는 파이프라인에 더 이상 데이터를 요청하지 않도록 알릴 수 있습니다.

역방향 재생 중에 파일의 시작은 스트림의 끝으로 간주됩니다. 자세한 내용은 속도 제어 구현을 참조하세요.

시작 구현

미디어 원본이 검색을 실행할 때 디코더가 대상 시작 시간에 대한 샘플을 디코딩할 수 있도록 검색 시간 이전의 첫 번째 키 프레임에서 시작해야 합니다. 파이프라인은 너무 일찍 디코딩된 샘플을 모두 삭제합니다.

시작 시간이 VT_EMPTY 이전 상태가 시작되거나 일시 중지된 경우 원본은 현재 위치에서 다시 시작해야 합니다. 이 경우 디코더에 이전에 전송된 데이터가 계속 있으므로 이전 키 프레임을 다시 보낼 필요가 없습니다.

pPresentationDescriptor 매개 변수의 유효성을 검사할 때 미디어 원본은 제대로 작동하는 데 필요한 정보에 대해서만 검사 합니다. 특히 클라이언트는 프레젠테이션 설명자에 프라이빗 특성을 추가할 수 있습니다. 추가 특성이 있으면 Start 메서드가 실패하지 않아야 합니다.

Start가 호출된 후 미디어 원본의 각 스트림은 다음 중 하나를 수행해야 합니다.

자세한 내용은 사용자 지정 미디어 원본 작성을 참조하세요.

예제

다음 예제에서는 프레젠테이션에 1초 후에 재생을 시작합니다.

PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.

hr = pSource->Start(pPresentationDescriptor, NULL, &var);

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 mfidl.h
라이브러리 Mfuuid.lib

추가 정보

IMFMediaSource

미디어 원본