IWMWriterAdvanced
COM公式ドキュメント
IWMWriterAdvanced インターフェースは、高度な書き込み機能を提供します。このインターフェースは、ライターオブジェクトのすべてのインスタンスに存在します。このインターフェースへのポインターを取得するには、ライターオブジェクトに対して QueryInterface を呼び出します。
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetSinkCount メソッドは、ライターオブジェクトに関連付けられているライターシンクの数を取得します。
| pcSinks | DWORD* | out | ライターオブジェクトに関連付けられているシンクの総数を示す DWORD。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pcSinks が NULL です。 |
解説(Remarks)
IWMWriter::SetOutputFilename を呼び出してファイルを指定すると、ライターオブジェクトは自動的にファイルシンクを作成し、ライターに追加します。そのシンクは、このメソッドで取得されるカウントに含まれます。
GetSink メソッドは、ライターシンクオブジェクトを取得します。IWMWriterAdvanced::GetSinkCount と組み合わせて使用することで、このメソッドを使ってライターオブジェクトに関連付けられたシンクを列挙できます。
| dwSinkNum | DWORD | in | シンク番号(インデックス)を格納した DWORD。これは 0 から、IWMWriterAdvanced::GetSinkCount で取得したファイルに関連付けられたシンクの総数より 1 小さい値までの番号です。 |
| ppSink | IWMWriterSink** | out | IWMWriterSink インターフェースへのポインターへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ppSink パラメーターが NULL であるか、dwSinkNum パラメーターがシンクの数より大きい値です。 |
解説(Remarks)
GetSink を使用すると、IWMWriter::SetOutputFilename を呼び出したときに自動的に作成されるファイルシンクにアクセスできます。自動的に作成されたファイルシンクにのみ書き込む場合、それは常にシンク番号 0 になります。
AddSink メソッドは、ライターの出力を受け取るライターシンクを追加します。Windows Media Format SDK は、ディスク上に ASF ファイルを作成するファイルシンク、ネットワーク越しに ASF コンテンツをストリーミングするネットワークシンク、および他のメディアサーバーに ASF コンテンツを配信するプッシュシンクをサポートします。シンクオブジェクトを作成するには、次のいずれかの関数を呼び出します。
| pSink | IWMWriterSink* | in | IWMWriterSink インターフェースへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pSink パラメーターが NULL です。 | |
|
ライターが構成可能な状態ではありません。 |
解説(Remarks)
単一のファイルにのみ書き込む必要がある場合は、既定のファイルシンクの作成と管理をライターオブジェクトに任せることができます。既定のファイルシンクを使用するには、IWMWriter::SetOutputFilename を呼び出してライターにファイル名を渡します。
RemoveSink メソッドは、ライターシンクオブジェクトを削除します。
| pSink | IWMWriterSink* | in | 削除するシンクオブジェクトの IWMWriterSink インターフェースへのポインター。すべてのシンクを削除する場合は NULL。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 指定されたシンクを削除できませんでした。 | |
|
ライターが構成可能な状態ではありません。 |
WriteStreamSample メソッドは、通常の圧縮処理を経由せずに、ストリームサンプルを ASF ファイルに直接書き込みます。
| wStreamNum | WORD | in | ストリーム番号を格納した WORD。ストリーム番号は 1 から 63 の範囲です。 | ||||||||||
| cnsSampleTime | ULONGLONG | in | サンプル時刻を 100 ナノ秒単位で格納した QWORD。 | ||||||||||
| msSampleSendTime | DWORD | in | サンプル送信時刻をミリ秒単位で格納した DWORD。このパラメーターは使用されません。 | ||||||||||
| cnsSampleDuration | ULONGLONG | in | サンプルの継続時間を 100 ナノ秒単位で格納した QWORD。このパラメーターは使用されません。 | ||||||||||
| dwFlags | DWORD | in | 次のフラグのうち 1 つ以上を格納した DWORD。
| ||||||||||
| pSample | INSSBuffer* | in | サンプルを表す INSSBuffer インターフェースへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
ライターを現在実行できません。 |
| サンプルが有効ではありません。これは、入力スクリプトストリームに有効でないスクリプトサンプルが含まれている場合に発生することがあります。 |
解説(Remarks)
すべてのビデオキーフレームに対して、WM_SF_CLEANPOINT フラグを手動で設定する必要があります。キーフレームを指定しないと、読み取り可能になりません。読み取りオブジェクトによって配信される最初のビデオサンプルは、クリーンポイントとしてマークされた最初のサンプルです。
ストリームサンプルを使用して作成されたストリームを読み取るとき、リーダーオブジェクトおよび同期リーダーオブジェクトは、ストリーム内の最初のサンプルに WM_SF_DISCONTINUITY フラグを設定します。
通常、アプリケーションは IWMWriter インターフェース上の入力ファイルにサンプルを提供し、そのサンプルはその後圧縮されます。しかし、アプリケーションはこのインターフェースを使用して、圧縮やその他の変更を行わずにサンプルを直接ファイルに書き込むことができます。
出力ストリームにタイムコードデータユニット拡張があり、サンプルにタイムコード拡張がない場合、ファイルのインデックス作成時に後で問題が生じるのを防ぐために、このメソッドは失敗します。その他のすべてのデータユニット拡張は、サンプルにおいて省略可能です。つまり、ストリームに対してデータユニット拡張が指定されていても、実際のデータ拡張がサンプルに存在しない場合、このメソッドは成功します。WriteStreamSample は、サンプルに拡張が指定されていないサンプルに対して、ファイルにゼロを書き込みます。
IWMWriter::WriteSample と WriteStreamSample の両方を使用して、非圧縮サンプルと圧縮サンプルを同じストリームに書き込むことができます。ただし、ライターはストリームサンプルのビットレートやバッファーウィンドウの使用量を正確に測定できないため、問題が発生する可能性があります。その結果、一部のサンプルがドロップされることがあります。
SetLiveSource メソッドは、ソースがライブであるかどうかを示すフラグを設定します。
| fIsLiveSource | BOOL | in | ソースがライブである場合に True となるブール値。 |
戻り値
このメソッドは常に S_OK を返します。
解説(Remarks)
既定値は False です。受信するサンプルを正しく処理するために、ソースがライブであるかどうかをライターオブジェクトに通知する必要があります。
IsRealTime メソッドは、ライターがリアルタイムで実行されているかどうかを確認します。
| pfRealTime | BOOL* | out | ライターがリアルタイムで実行されている場合に True となるブール値へのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pfRealTime が NULL です。 |
解説(Remarks)
ライターがリアルタイムで実行されている場合、アプリケーションはライターから現在の時刻を取得できます。
既定では、ライターはリアルタイムでは実行されません。
GetWriterTime メソッドは、ライターが処理対象としているクロック時刻を取得します。
| pcnsCurrentTime | ULONGLONG* | out | 現在の時刻を 100 ナノ秒単位で格納する変数へのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pcnsCurrentTime が NULL です。 |
解説(Remarks)
このメソッドは、ライターが現在処理できる最大のタイムスタンプを返します。このタイムスタンプは、ライターがデータを生成するにつれて増加します。このメソッドを使用して、適切なレートでライターにデータが配信されるようにすることができます。
返される時刻は、IWMWriter::BeginWriting の呼び出し以降の 100 ナノ秒単位の数です。
ライターはリアルタイムで実行されている場合があります。これが該当するかどうかを確認するには、IWMWriterAdvanced::IsRealTime メソッドを呼び出します。
GetStatistics メソッドは、現在の書き込み操作を表す統計情報を取得します。
| wStreamNum | WORD | in | ストリーム番号を格納した WORD。ストリーム番号は 1 から 63 の範囲でなければなりません。値 0 は、ファイル全体の統計情報を取得します。 |
| pStats | WM_WRITER_STATISTICS* | out | 統計情報を受け取る WM_WRITER_STATISTICS 構造体へのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pStats が NULL です。 |
SetSyncTolerance メソッドは、サンプルが破棄される前に入力が同期からずれてもよい時間の長さを設定します。
| msWindow | DWORD | in | 入力が同期からずれてもよい時間の長さ(ミリ秒単位)。このパラメーターは 100 ナノ秒単位ではなくミリ秒単位である点に注意してください。 |
戻り値
このメソッドは常に S_OK を返します。
解説(Remarks)
既定の許容値は 3000 ミリ秒です。
許容値をどのように設定した場合でも、サンプルをできるだけ厳密に同期させておくことが、最高のパフォーマンスと最高品質のコンテンツにつながります。
GetSyncTolerance メソッドは、サンプルが破棄される前に入力が同期からずれてもよい時間の長さを取得します。
| pmsWindow | DWORD* | out | 入力が同期からずれてもよいミリ秒数の上限へのポインター。このパラメーターは 100 ナノ秒単位ではなくミリ秒単位である点に注意してください。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pmsWindow が NULL です。 |
解説(Remarks)
既定の許容値は 3000 ミリ秒です。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMWriterAdvanced "{96406BE3-2B2B-11D3-B36B-00C04F6108FF}" #usecom global IWMWriterAdvanced IID_IWMWriterAdvanced "{}" #comfunc global IWMWriterAdvanced_GetSinkCount 3 var #comfunc global IWMWriterAdvanced_GetSink 4 int,sptr #comfunc global IWMWriterAdvanced_AddSink 5 sptr #comfunc global IWMWriterAdvanced_RemoveSink 6 sptr #comfunc global IWMWriterAdvanced_WriteStreamSample 7 int,int64,int,int64,int,sptr #comfunc global IWMWriterAdvanced_SetLiveSource 8 int #comfunc global IWMWriterAdvanced_IsRealTime 9 var #comfunc global IWMWriterAdvanced_GetWriterTime 10 var #comfunc global IWMWriterAdvanced_GetStatistics 11 int,var #comfunc global IWMWriterAdvanced_SetSyncTolerance 12 int #comfunc global IWMWriterAdvanced_GetSyncTolerance 13 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWMWriterAdvanced "{96406BE3-2B2B-11D3-B36B-00C04F6108FF}" #usecom global IWMWriterAdvanced IID_IWMWriterAdvanced "{}" #comfunc global IWMWriterAdvanced_GetSinkCount 3 sptr #comfunc global IWMWriterAdvanced_GetSink 4 int,sptr #comfunc global IWMWriterAdvanced_AddSink 5 sptr #comfunc global IWMWriterAdvanced_RemoveSink 6 sptr #comfunc global IWMWriterAdvanced_WriteStreamSample 7 int,int64,int,int64,int,sptr #comfunc global IWMWriterAdvanced_SetLiveSource 8 int #comfunc global IWMWriterAdvanced_IsRealTime 9 sptr #comfunc global IWMWriterAdvanced_GetWriterTime 10 sptr #comfunc global IWMWriterAdvanced_GetStatistics 11 int,sptr #comfunc global IWMWriterAdvanced_SetSyncTolerance 12 int #comfunc global IWMWriterAdvanced_GetSyncTolerance 13 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。