IMFMediaSource::Start メソッド (mfidl.h)
再生を開始する場所を指定して、メディア ソースを開始、シーク、または再起動します。
構文
HRESULT Start(
[in] IMFPresentationDescriptor *pPresentationDescriptor,
[in] const GUID *pguidTimeFormat,
[in] const PROPVARIANT *pvarStartPosition
);
パラメーター
[in] pPresentationDescriptor
メディア ソースのプレゼンテーション記述子の IMFPresentationDescriptor インターフェイスへのポインター。 プレゼンテーション記述子を取得するには、 IMFMediaSource::CreatePresentationDescriptor を呼び出します。 Start を呼び出す前にプレゼンテーション記述子を変更して、ストリームを選択または選択解除したり、メディアの種類を変更したりできます。
[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 を返します。 有効な値を次の表に示しますが、これ以外にもあります。
リターン コード | 説明 |
---|---|
|
メソッドが成功しました。 |
|
開始位置がプレゼンテーションの最後 (ASF メディア ソース) を超えています。 |
|
ハードウェア デバイスでストリーミングを開始できませんでした。 このエラー コードは、カメラなどのハードウェア デバイスを表すメディア ソースから返すことができます。 たとえば、カメラが既に別のアプリケーションで使用されている場合、メソッドはこのエラー コードを返す可能性があります。 |
|
開始要求が無効です。 たとえば、開始位置はプレゼンテーションの末尾を超えて表示されます。 |
|
メディア ソースの Shutdown メソッドが呼び出されました。 |
|
メディア ソースでは、 pguidTimeFormat で指定された時刻形式はサポートされていません。 |
注釈
このメソッドは非同期です。 操作が成功すると、メディア ソースは次のイベントを送信します。
- 新しいストリームごとに、ソースは MENewStream イベントを送信します。 このイベントは、ストリームが表示される最初の Start 呼び出しに対して送信されます。 イベント データは、ストリームの 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 |
Library | Mfuuid.lib |