IMFASFMultiplexer
COM公式ドキュメント
Advanced Systems Format (ASF) データパケットを作成するためのメソッドを提供します。
メソッド 9
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ASF ContentInfo オブジェクトのデータを使用してマルチプレクサーを初期化します。
| pIContentInfo | IMFASFContentInfo* | in | 新しい ASF ファイルのヘッダー情報を含む MFASFContentInfo オブジェクトの IMFASFContentInfo インターフェイスへのポインター。マルチプレクサーはこのファイル用のデータパケットを生成します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
この呼び出しは、エンコードの開始時に一度だけ行う必要があり、pIContentInfo にはエンコード対象のコンテンツを記述する ASF ContentInfo オブジェクトを指定します。これにより、ASF マルチプレクサーは、とりわけどのストリームがエンコードセッションに存在するかを把握できます。この呼び出しは通常、ASF ContentInfo オブジェクト内のデータに影響を与えません。
マルチプレクサーのオプションを設定します。
| dwFlags | DWORD | in | MFASF_MULTIPLEXERFLAGS 列挙体の 0 個以上のメンバーのビットごとの OR。これらのフラグは、使用するマルチプレクサーオプションを指定します。詳細については、Creating the Multiplexer Object の「Multiplexer Initialization and Leaky Bucket Settings」を参照してください。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
構成されたマルチプレクサーオプションを示すフラグを取得します。
| pdwFlags | DWORD* | out | MFASF_MULTIPLEXERFLAGS 列挙体の 0 個以上の値のビットごとの OR を受け取ります。これらのフラグを設定するには、IMFASFMultiplexer::SetFlags を呼び出します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
入力サンプルをマルチプレクサーに渡します。
| wStreamNumber | WORD | in | サンプルが属するストリームのストリーム番号。 |
| pISample | IMFSample* | in | 入力サンプルの IMFSample インターフェイスへのポインター。入力サンプルには、ASF データパケットに変換されるメディアデータが含まれます。可能な場合、このサンプルのタイムスタンプは正確であるべきです。 |
| hnsTimestampAdjust | LONGLONG | in | サンプルのタイムスタンプに適用する調整値。このパラメーターは、呼び出し元が pISample のサンプル時刻をシフトさせたい場合に使用します。タイムスタンプを前に進める場合はこの値を正、後ろに戻す場合は負にします。このタイムスタンプは pISample のサンプル時刻に加算され、その結果の時刻が元のサンプル時刻の代わりにマルチプレクサーによって使用されます。調整が不要な場合は、この値を 0 に設定します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| マルチプレクサーから取得されるのを待っているパケットが多すぎます。IMFASFMultiplexer::GetNextPacket を呼び出してパケットを取得してください。 | |
| 処理されたサンプルが、ASF ContentInfo オブジェクトでストリームに指定された帯域幅の制限に違反しています。このエラーが生成されると、サンプルは破棄されます。 | |
| wStreamNumber に渡された値が無効です。 | |
| 入力メディアサンプルのプレゼンテーション時刻が送信時刻よりも前です。 |
解説(Remarks)
アプリケーションはサンプルを ProcessSample に渡し、ASF マルチプレクサーは ASF パケットに配置できる状態になるまでそれらを内部的にキューに入れます。ASF データパケットを取得するには、IMFASFMultiplexer::GetNextPacket を呼び出します。
ProcessSample を呼び出すたびに、GetNextPacket をループ内で呼び出して、利用可能なすべてのデータパケットを取得します。コード例については、Generating New ASF Data Packets を参照してください。
マルチプレクサーから次の出力 ASF パケットを取得します。
| pdwStatusFlags | DWORD* | out | 0 個以上のステータスフラグを受け取ります。複数のパケットが待機している場合、メソッドは ASF_STATUSFLAGS_INCOMPLETE フラグを設定します。 |
| ppIPacket | IMFSample** | out | データパケットの最初の出力サンプルの IMFSample インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
クライアントは、出力 ASF パケットを取得するために、理想的には IMFASFMultiplexer::ProcessSample を呼び出すたびに、このメソッドを呼び出す必要があります。ASF_STATUSFLAGS_INCOMPLETE フラグを受け取っている限り、このメソッドをループ内で呼び出します。
準備ができているパケットがない場合、メソッドは S_OK を返しますが、ppIPacket にサンプルは返しません。
キューに入れられたすべての出力メディアサンプルを処理するようマルチプレクサーに指示します。最後のサンプルをマルチプレクサーに渡した後にこのメソッドを呼び出します。
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
最後のサンプルを ASF マルチプレクサーに渡した後、かつ IMFASFMultiplexer::End を呼び出す前に、Flush を呼び出す必要があります。これにより、処理中のすべての出力メディアサンプルが完了します。Flush を呼び出した後、保留中のすべてのメディアサンプルがパケット化されるまで、IMFASFMultiplexer::GetNextPacket をループ内で呼び出します。
マルチプレクサーからデータを収集し、その情報を ASF Header Object に含めるために ASF ContentInfo オブジェクトを更新します。
| pIContentInfo | IMFASFContentInfo* | in | ContentInfo オブジェクトの IMFASFContentInfo インターフェイスへのポインター。これはマルチプレクサーの初期化に使用したものと同じオブジェクトである必要があります。ContentInfo オブジェクトは、マルチプレクサーがデータパケットを生成した対象ファイルの ASF Header Object を表します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| マルチプレクサー内に保留中の出力メディアサンプルが待機しています。IMFASFMultiplexer::Flush を呼び出して、メディアサンプルを強制的にパケット化してください。 |
解説(Remarks)
ライブ以外のエンコードシナリオ (ファイルへのエンコードなど) では、指定した ContentInfo オブジェクトを更新するために End を呼び出し、パケット生成プロセス中にマルチプレクサーが収集したデータを追加する必要があります。その後、IMFASFContentInfo::GenerateHeader を呼び出し、出力ヘッダーを ASF ファイルの先頭に書き込みます (エンコードセッションの開始時に取得したヘッダーを上書きします)。詳細については、Writing an ASF Header Object for a New File を参照してください。
ライブエンコード中は、通常ヘッダーを書き直すことができないため、ライブエンコードではこの呼び出しは不要です。(その場合、ヘッダーには、エンコードセッションの終了まで利用できなかった一部の情報が単に欠けることになります。)
マルチプレクサーの統計情報を取得します。
| wStreamNumber | WORD | in | 統計情報を取得する対象のストリーム番号。 |
| pMuxStats | ASF_MUX_STATISTICS* | out | 統計情報を受け取る ASF_MUX_STATISTICS 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
さまざまなストリームのサンプルが同期をずらすことができる最大時間を設定します。
| msSyncTolerance | DWORD | in | 同期許容時間 (ミリ秒単位)。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
同期許容時間とは、ASF マルチプレクサーが許容できる、任意の時点における異なるストリームのサンプル間のプレゼンテーション時刻の最大差です。つまり、同期許容時間が 3 秒の場合、マルチプレクサーに渡されるタイムスタンプにおいて、どのストリームも他のどのストリームより 3 秒を超えて遅れることはできません。マルチプレクサーは使用するデフォルトの同期許容時間を決定しますが、このメソッドはそれを上書きします (通常は増やすために使用します)。許容時間が大きいほど、マルチプレクサーでの遅延が大きくなる可能性があります。ストリーム間でタイムスタンプが同期している場合、実際の遅延は msSyncTolerance よりもはるかに小さくなります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFASFMultiplexer "{57BDD80A-9B38-4838-B737-C58F670D7D4F}" #usecom global IMFASFMultiplexer IID_IMFASFMultiplexer "{}" #comfunc global IMFASFMultiplexer_Initialize 3 sptr #comfunc global IMFASFMultiplexer_SetFlags 4 int #comfunc global IMFASFMultiplexer_GetFlags 5 var #comfunc global IMFASFMultiplexer_ProcessSample 6 int,sptr,int64 #comfunc global IMFASFMultiplexer_GetNextPacket 7 var,sptr #comfunc global IMFASFMultiplexer_Flush 8 #comfunc global IMFASFMultiplexer_End 9 sptr #comfunc global IMFASFMultiplexer_GetStatistics 10 int,var #comfunc global IMFASFMultiplexer_SetSyncTolerance 11 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFASFMultiplexer "{57BDD80A-9B38-4838-B737-C58F670D7D4F}" #usecom global IMFASFMultiplexer IID_IMFASFMultiplexer "{}" #comfunc global IMFASFMultiplexer_Initialize 3 sptr #comfunc global IMFASFMultiplexer_SetFlags 4 int #comfunc global IMFASFMultiplexer_GetFlags 5 sptr #comfunc global IMFASFMultiplexer_ProcessSample 6 int,sptr,int64 #comfunc global IMFASFMultiplexer_GetNextPacket 7 sptr,sptr #comfunc global IMFASFMultiplexer_Flush 8 #comfunc global IMFASFMultiplexer_End 9 sptr #comfunc global IMFASFMultiplexer_GetStatistics 10 int,sptr #comfunc global IMFASFMultiplexer_SetSyncTolerance 11 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。