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 |
---|---|
|
메서드가 성공했습니다. |
|
시작 위치가 프레젠테이션의 끝을 지났습니다(ASF 미디어 원본). |
|
하드웨어 디바이스에서 스트리밍을 시작할 수 없습니다. 이 오류 코드는 카메라와 같은 하드웨어 디바이스를 나타내는 미디어 소스에서 반환할 수 있습니다. 예를 들어 카메라가 이미 다른 애플리케이션에서 사용 중인 경우 메서드는 이 오류 코드를 반환할 수 있습니다. |
|
시작 요청이 잘못되었습니다. 예를 들어 시작 위치가 프레젠테이션의 끝을 지났습니다. |
|
미디어 원본의 Shutdown 메서드가 호출되었습니다. |
|
미디어 원본은 pguidTimeFormat에 지정된 시간 형식을 지원하지 않습니다. |
설명
이 메서드는 비동기적이며, 작업이 성공하면 미디어 원본은 다음 이벤트를 보냅니다.
- 각 새 스트림에 대해 원본은 MENewStream 이벤트를 보냅니다. 이 이벤트는 스트림이 표시되는 첫 번째 시작 호출에 대해 전송됩니다. 이벤트 데이터는 스트림의 IMFMediaStream 인터페이스에 대한 포인터입니다.
- 업데이트된 각 스트림에 대해 원본은 MEUpdatedStream 이벤트를 보냅니다. 스트림은 Start가 호출될 때 스트림이 이미 있는 경우(예: 애플리케이션이 재생 중에 찾은 경우) 업데이트됩니다. 이벤트 데이터는 스트림의 IMFMediaStream 인터페이스에 대한 포인터입니다.
- 이전 상태가 중지된 경우 원본은 MESourceStarted 이벤트를 보냅니다.
- 이전 상태가 시작되거나 일시 중지되고 시작 위치가 현재 위치(VT_EMPTY)인 경우 원본은 MESourceStarted 이벤트를 보냅니다.
- 이전 상태가 시작되거나 일시 중지되고 새 시작 위치가 지정된 경우 원본은 MESourceSeeked 이벤트를 보냅니다.
- 원본이 MESourceStarted 이벤트를 보내는 경우 각 미디어 스트림은 MEStreamStarted 이벤트를 보냅니다. 원본이 MESourceSeeked 이벤트를 보내는 경우 각 스트림은 MEStreamSeeked 이벤트를 보냅니다.
Start를 호출하면 이전 상태가 시작되었거나 일시 중지되고 새 시작 위치가 VT_EMPTY 않은 경우 검색이 발생합니다. 모든 미디어 원본이 검색할 수 있는 것은 아닙니다. 미디어 원본이 검색할 수 있는 경우 IMFMediaSource::GetCharacteristics 메서드는 MFMEDIASOURCE_CAN_SEEK 플래그를 반환합니다.
미디어 원본의 이벤트는 미디어 스트림의 이벤트와 동기화되지 않습니다. 따라서 미디어 원본을 찾는 경우 MESourceSeeked 이벤트를 받은 후에도 이전 위치에서 샘플을 받을 수 있습니다. 작업을 동기화해야 하는 경우 검색이 발생하는 스트림의 정확한 지점을 표시하는 스트림 이벤트 MEStreamSeeked를 기다립니다.
Stream 끝
스트림이 끝까지 재생되면 스트림은 MEEndOfStream 이벤트를 보냅니다. 선택한 모든 스트림이 끝에 도달하면 미디어 원본은 MEEndOfPresentation 이벤트를 보냅니다.시작 위치가 선택한 스트림의 끝을 지나면(프레젠테이션이 끝나기 전에) 스트림은 MEStreamStartedMEStreamSeeked/ 직후 MEEndOfStream을 보내야 합니다. 재생이 프레젠테이션의 끝에 도달하고 Start 가 현재 위치에서 다시 호출되면 스트림은 MEEndOfStream 이벤트를 다시 보내고 미디어 원본은 MEEndOfPresentation 이벤트를 다시 보냅니다. 이러한 이벤트는 파이프라인에 더 이상 데이터를 요청하지 않도록 알릴 수 있습니다.
역방향 재생 중에 파일의 시작은 스트림의 끝으로 간주됩니다. 자세한 내용은 속도 제어 구현을 참조하세요.
시작 구현
미디어 원본이 검색을 실행할 때 디코더가 대상 시작 시간에 대한 샘플을 디코딩할 수 있도록 검색 시간 이전의 첫 번째 키 프레임에서 시작해야 합니다. 파이프라인은 너무 일찍 디코딩된 샘플을 모두 삭제합니다.시작 시간이 VT_EMPTY 이전 상태가 시작되거나 일시 중지된 경우 원본은 현재 위치에서 다시 시작해야 합니다. 이 경우 디코더에 이전에 전송된 데이터가 계속 있으므로 이전 키 프레임을 다시 보낼 필요가 없습니다.
pPresentationDescriptor 매개 변수의 유효성을 검사할 때 미디어 원본은 제대로 작동하는 데 필요한 정보에 대해서만 검사 합니다. 특히 클라이언트는 프레젠테이션 설명자에 프라이빗 특성을 추가할 수 있습니다. 추가 특성이 있으면 Start 메서드가 실패하지 않아야 합니다.
Start가 호출된 후 미디어 원본의 각 스트림은 다음 중 하나를 수행해야 합니다.
- IMFMediaStream::RequestSample 호출에 대한 응답으로 미디어 데이터를 전달합니다.
- MEStreamTick 이벤트를 보내 스트림의 간격을 나타냅니다.
- 스트림의 끝을 나타내는 MEEndOfStream 이벤트를 보냅니다.
예제
다음 예제에서는 프레젠테이션에 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 |