Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFASFMultiplexer

IMFASFMultiplexer

COM
IID57bdd80a-9b38-4838-b737-c58f670d7d4f継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

Advanced Systems Format (ASF) データパケットを作成するためのメソッドを提供します。

メソッド 9

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Initialize(IMFASFContentInfo* pIContentInfo)

ASF ContentInfo オブジェクトのデータを使用してマルチプレクサーを初期化します。

pIContentInfoIMFASFContentInfo*in新しい ASF ファイルのヘッダー情報を含む MFASFContentInfo オブジェクトの IMFASFContentInfo インターフェイスへのポインター。マルチプレクサーはこのファイル用のデータパケットを生成します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。

解説(Remarks)

この呼び出しは、エンコードの開始時に一度だけ行う必要があり、pIContentInfo にはエンコード対象のコンテンツを記述する ASF ContentInfo オブジェクトを指定します。これにより、ASF マルチプレクサーは、とりわけどのストリームがエンコードセッションに存在するかを把握できます。この呼び出しは通常、ASF ContentInfo オブジェクト内のデータに影響を与えません。

vtbl 4 HRESULT SetFlags(DWORD dwFlags)

マルチプレクサーのオプションを設定します。

dwFlagsDWORDinMFASF_MULTIPLEXERFLAGS 列挙体の 0 個以上のメンバーのビットごとの OR。これらのフラグは、使用するマルチプレクサーオプションを指定します。詳細については、Creating the Multiplexer Object の「Multiplexer Initialization and Leaky Bucket Settings」を参照してください。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
vtbl 5 HRESULT GetFlags(DWORD* pdwFlags)

構成されたマルチプレクサーオプションを示すフラグを取得します。

pdwFlagsDWORD*outMFASF_MULTIPLEXERFLAGS 列挙体の 0 個以上の値のビットごとの OR を受け取ります。これらのフラグを設定するには、IMFASFMultiplexer::SetFlags を呼び出します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
vtbl 6 HRESULT ProcessSample(WORD wStreamNumber, IMFSample* pISample, LONGLONG hnsTimestampAdjust)

入力サンプルをマルチプレクサーに渡します。

wStreamNumberWORDinサンプルが属するストリームのストリーム番号。
pISampleIMFSample*in入力サンプルの IMFSample インターフェイスへのポインター。入力サンプルには、ASF データパケットに変換されるメディアデータが含まれます。可能な場合、このサンプルのタイムスタンプは正確であるべきです。
hnsTimestampAdjustLONGLONGinサンプルのタイムスタンプに適用する調整値。このパラメーターは、呼び出し元が pISample のサンプル時刻をシフトさせたい場合に使用します。タイムスタンプを前に進める場合はこの値を正、後ろに戻す場合は負にします。このタイムスタンプは pISample のサンプル時刻に加算され、その結果の時刻が元のサンプル時刻の代わりにマルチプレクサーによって使用されます。調整が不要な場合は、この値を 0 に設定します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_NOTACCEPTING
マルチプレクサーから取得されるのを待っているパケットが多すぎます。IMFASFMultiplexer::GetNextPacket を呼び出してパケットを取得してください。
MF_E_BANDWIDTH_OVERRUN
処理されたサンプルが、ASF ContentInfo オブジェクトでストリームに指定された帯域幅の制限に違反しています。このエラーが生成されると、サンプルは破棄されます。
MF_E_INVALIDSTREAMNUMBER
wStreamNumber に渡された値が無効です。
MF_E_LATE_SAMPLE
入力メディアサンプルのプレゼンテーション時刻が送信時刻よりも前です。

解説(Remarks)

アプリケーションはサンプルを ProcessSample に渡し、ASF マルチプレクサーは ASF パケットに配置できる状態になるまでそれらを内部的にキューに入れます。ASF データパケットを取得するには、IMFASFMultiplexer::GetNextPacket を呼び出します。

ProcessSample を呼び出すたびに、GetNextPacket をループ内で呼び出して、利用可能なすべてのデータパケットを取得します。コード例については、Generating New ASF Data Packets を参照してください。

vtbl 7 HRESULT GetNextPacket(DWORD* pdwStatusFlags, IMFSample** ppIPacket)

マルチプレクサーから次の出力 ASF パケットを取得します。

pdwStatusFlagsDWORD*out0 個以上のステータスフラグを受け取ります。複数のパケットが待機している場合、メソッドは ASF_STATUSFLAGS_INCOMPLETE フラグを設定します。
ppIPacketIMFSample**outデータパケットの最初の出力サンプルの IMFSample インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。

解説(Remarks)

クライアントは、出力 ASF パケットを取得するために、理想的には IMFASFMultiplexer::ProcessSample を呼び出すたびに、このメソッドを呼び出す必要があります。ASF_STATUSFLAGS_INCOMPLETE フラグを受け取っている限り、このメソッドをループ内で呼び出します。

準備ができているパケットがない場合、メソッドは S_OK を返しますが、ppIPacket にサンプルは返しません。

vtbl 8 HRESULT Flush()

キューに入れられたすべての出力メディアサンプルを処理するようマルチプレクサーに指示します。最後のサンプルをマルチプレクサーに渡した後にこのメソッドを呼び出します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。

解説(Remarks)

最後のサンプルを ASF マルチプレクサーに渡した後、かつ IMFASFMultiplexer::End を呼び出す前に、Flush を呼び出す必要があります。これにより、処理中のすべての出力メディアサンプルが完了します。Flush を呼び出した後、保留中のすべてのメディアサンプルがパケット化されるまで、IMFASFMultiplexer::GetNextPacket をループ内で呼び出します。

vtbl 9 HRESULT End(IMFASFContentInfo* pIContentInfo)

マルチプレクサーからデータを収集し、その情報を ASF Header Object に含めるために ASF ContentInfo オブジェクトを更新します。

pIContentInfoIMFASFContentInfo*inContentInfo オブジェクトの IMFASFContentInfo インターフェイスへのポインター。これはマルチプレクサーの初期化に使用したものと同じオブジェクトである必要があります。ContentInfo オブジェクトは、マルチプレクサーがデータパケットを生成した対象ファイルの ASF Header Object を表します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_FLUSH_NEEDED
マルチプレクサー内に保留中の出力メディアサンプルが待機しています。IMFASFMultiplexer::Flush を呼び出して、メディアサンプルを強制的にパケット化してください。

解説(Remarks)

ライブ以外のエンコードシナリオ (ファイルへのエンコードなど) では、指定した ContentInfo オブジェクトを更新するために End を呼び出し、パケット生成プロセス中にマルチプレクサーが収集したデータを追加する必要があります。その後、IMFASFContentInfo::GenerateHeader を呼び出し、出力ヘッダーを ASF ファイルの先頭に書き込みます (エンコードセッションの開始時に取得したヘッダーを上書きします)。詳細については、Writing an ASF Header Object for a New File を参照してください。

ライブエンコード中は、通常ヘッダーを書き直すことができないため、ライブエンコードではこの呼び出しは不要です。(その場合、ヘッダーには、エンコードセッションの終了まで利用できなかった一部の情報が単に欠けることになります。)

vtbl 10 HRESULT GetStatistics(WORD wStreamNumber, ASF_MUX_STATISTICS* pMuxStats)

マルチプレクサーの統計情報を取得します。

wStreamNumberWORDin統計情報を取得する対象のストリーム番号。
pMuxStatsASF_MUX_STATISTICS*out統計情報を受け取る ASF_MUX_STATISTICS 構造体へのポインター。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
vtbl 11 HRESULT SetSyncTolerance(DWORD msSyncTolerance)

さまざまなストリームのサンプルが同期をずらすことができる最大時間を設定します。

msSyncToleranceDWORDin同期許容時間 (ミリ秒単位)。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。

解説(Remarks)

同期許容時間とは、ASF マルチプレクサーが許容できる、任意の時点における異なるストリームのサンプル間のプレゼンテーション時刻の最大差です。つまり、同期許容時間が 3 秒の場合、マルチプレクサーに渡されるタイムスタンプにおいて、どのストリームも他のどのストリームより 3 秒を超えて遅れることはできません。マルチプレクサーは使用するデフォルトの同期許容時間を決定しますが、このメソッドはそれを上書きします (通常は増やすために使用します)。許容時間が大きいほど、マルチプレクサーでの遅延が大きくなる可能性があります。ストリーム間でタイムスタンプが同期している場合、実際の遅延は msSyncTolerance よりもはるかに小さくなります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。