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

IWMWriterAdvanced

COM
IID96406be3-2b2b-11d3-b36b-00c04f6108ff継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IWMWriterAdvanced インターフェースは、高度な書き込み機能を提供します。このインターフェースは、ライターオブジェクトのすべてのインスタンスに存在します。このインターフェースへのポインターを取得するには、ライターオブジェクトに対して QueryInterface を呼び出します。

メソッド 11

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

vtbl 3 HRESULT GetSinkCount(DWORD* pcSinks)

GetSinkCount メソッドは、ライターオブジェクトに関連付けられているライターシンクの数を取得します。

pcSinksDWORD*outライターオブジェクトに関連付けられているシンクの総数を示す DWORD。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

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

解説(Remarks)

IWMWriter::SetOutputFilename を呼び出してファイルを指定すると、ライターオブジェクトは自動的にファイルシンクを作成し、ライターに追加します。そのシンクは、このメソッドで取得されるカウントに含まれます。

vtbl 4 HRESULT GetSink(DWORD dwSinkNum, IWMWriterSink** ppSink)

GetSink メソッドは、ライターシンクオブジェクトを取得します。IWMWriterAdvanced::GetSinkCount と組み合わせて使用することで、このメソッドを使ってライターオブジェクトに関連付けられたシンクを列挙できます。

dwSinkNumDWORDinシンク番号(インデックス)を格納した DWORD。これは 0 から、IWMWriterAdvanced::GetSinkCount で取得したファイルに関連付けられたシンクの総数より 1 小さい値までの番号です。
ppSinkIWMWriterSink**outIWMWriterSink インターフェースへのポインターへのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
ppSink パラメーターが NULL であるか、dwSinkNum パラメーターがシンクの数より大きい値です。

解説(Remarks)

GetSink を使用すると、IWMWriter::SetOutputFilename を呼び出したときに自動的に作成されるファイルシンクにアクセスできます。自動的に作成されたファイルシンクにのみ書き込む場合、それは常にシンク番号 0 になります。

vtbl 5 HRESULT AddSink(IWMWriterSink* pSink)

AddSink メソッドは、ライターの出力を受け取るライターシンクを追加します。Windows Media Format SDK は、ディスク上に ASF ファイルを作成するファイルシンク、ネットワーク越しに ASF コンテンツをストリーミングするネットワークシンク、および他のメディアサーバーに ASF コンテンツを配信するプッシュシンクをサポートします。シンクオブジェクトを作成するには、次のいずれかの関数を呼び出します。

pSinkIWMWriterSink*inIWMWriterSink インターフェースへのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
pSink パラメーターが NULL です。
NS_E_INVALID_STATE
ライターが構成可能な状態ではありません。

解説(Remarks)

単一のファイルにのみ書き込む必要がある場合は、既定のファイルシンクの作成と管理をライターオブジェクトに任せることができます。既定のファイルシンクを使用するには、IWMWriter::SetOutputFilename を呼び出してライターにファイル名を渡します。

vtbl 6 HRESULT RemoveSink(IWMWriterSink* pSink)

RemoveSink メソッドは、ライターシンクオブジェクトを削除します。

pSinkIWMWriterSink*in削除するシンクオブジェクトの IWMWriterSink インターフェースへのポインター。すべてのシンクを削除する場合は NULL

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
S_FALSE
指定されたシンクを削除できませんでした。
NS_E_INVALID_STATE
ライターが構成可能な状態ではありません。
vtbl 7 HRESULT WriteStreamSample(WORD wStreamNum, ULONGLONG cnsSampleTime, DWORD msSampleSendTime, ULONGLONG cnsSampleDuration, DWORD dwFlags, INSSBuffer* pSample)

WriteStreamSample メソッドは、通常の圧縮処理を経由せずに、ストリームサンプルを ASF ファイルに直接書き込みます。

wStreamNumWORDinストリーム番号を格納した WORD。ストリーム番号は 1 から 63 の範囲です。
cnsSampleTimeULONGLONGinサンプル時刻を 100 ナノ秒単位で格納した QWORD
msSampleSendTimeDWORDinサンプル送信時刻をミリ秒単位で格納した DWORD。このパラメーターは使用されません。
cnsSampleDurationULONGLONGinサンプルの継続時間を 100 ナノ秒単位で格納した QWORD。このパラメーターは使用されません。
dwFlagsDWORDin

次のフラグのうち 1 つ以上を格納した DWORD

フラグ 説明
フラグなし 他のフラグの条件がいずれも当てはまりません。たとえば、ほとんどの場合、デルタフレームにはフラグが設定されません。
WM_SF_CLEANPOINT サンプルがキーフレームであることを示します。圧縮された入力サンプルがキーフレームである場合に限り、このフラグを設定します。
WM_SF_DISCONTINUITY オーディオ入力の場合、このフラグはサンプル間に生じる可能性のあるギャップの処理に役立ちます。ギャップの後の最初のサンプルに、このフラグを設定してください。
WM_SF_DATALOSS このフラグはライターオブジェクトでは使用されません。
pSampleINSSBuffer*inサンプルを表す INSSBuffer インターフェースへのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
NS_E_INVALID_STATE
ライターを現在実行できません。
NS_E_INVALID_DATA
サンプルが有効ではありません。これは、入力スクリプトストリームに有効でないスクリプトサンプルが含まれている場合に発生することがあります。

解説(Remarks)

すべてのビデオキーフレームに対して、WM_SF_CLEANPOINT フラグを手動で設定する必要があります。キーフレームを指定しないと、読み取り可能になりません。読み取りオブジェクトによって配信される最初のビデオサンプルは、クリーンポイントとしてマークされた最初のサンプルです。

ストリームサンプルを使用して作成されたストリームを読み取るとき、リーダーオブジェクトおよび同期リーダーオブジェクトは、ストリーム内の最初のサンプルに WM_SF_DISCONTINUITY フラグを設定します。

通常、アプリケーションは IWMWriter インターフェース上の入力ファイルにサンプルを提供し、そのサンプルはその後圧縮されます。しかし、アプリケーションはこのインターフェースを使用して、圧縮やその他の変更を行わずにサンプルを直接ファイルに書き込むことができます。

出力ストリームにタイムコードデータユニット拡張があり、サンプルにタイムコード拡張がない場合、ファイルのインデックス作成時に後で問題が生じるのを防ぐために、このメソッドは失敗します。その他のすべてのデータユニット拡張は、サンプルにおいて省略可能です。つまり、ストリームに対してデータユニット拡張が指定されていても、実際のデータ拡張がサンプルに存在しない場合、このメソッドは成功します。WriteStreamSample は、サンプルに拡張が指定されていないサンプルに対して、ファイルにゼロを書き込みます。

IWMWriter::WriteSampleWriteStreamSample の両方を使用して、非圧縮サンプルと圧縮サンプルを同じストリームに書き込むことができます。ただし、ライターはストリームサンプルのビットレートやバッファーウィンドウの使用量を正確に測定できないため、問題が発生する可能性があります。その結果、一部のサンプルがドロップされることがあります。

vtbl 8 HRESULT SetLiveSource(BOOL fIsLiveSource)

SetLiveSource メソッドは、ソースがライブであるかどうかを示すフラグを設定します。

fIsLiveSourceBOOLinソースがライブである場合に True となるブール値。

戻り値

このメソッドは常に S_OK を返します。

解説(Remarks)

既定値は False です。受信するサンプルを正しく処理するために、ソースがライブであるかどうかをライターオブジェクトに通知する必要があります。

vtbl 9 HRESULT IsRealTime(BOOL* pfRealTime)

IsRealTime メソッドは、ライターがリアルタイムで実行されているかどうかを確認します。

pfRealTimeBOOL*outライターがリアルタイムで実行されている場合に True となるブール値へのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

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

解説(Remarks)

ライターがリアルタイムで実行されている場合、アプリケーションはライターから現在の時刻を取得できます。

既定では、ライターはリアルタイムでは実行されません。

vtbl 10 HRESULT GetWriterTime(ULONGLONG* pcnsCurrentTime)

GetWriterTime メソッドは、ライターが処理対象としているクロック時刻を取得します。

pcnsCurrentTimeULONGLONG*out現在の時刻を 100 ナノ秒単位で格納する変数へのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

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

解説(Remarks)

このメソッドは、ライターが現在処理できる最大のタイムスタンプを返します。このタイムスタンプは、ライターがデータを生成するにつれて増加します。このメソッドを使用して、適切なレートでライターにデータが配信されるようにすることができます。

返される時刻は、IWMWriter::BeginWriting の呼び出し以降の 100 ナノ秒単位の数です。

ライターはリアルタイムで実行されている場合があります。これが該当するかどうかを確認するには、IWMWriterAdvanced::IsRealTime メソッドを呼び出します。

vtbl 11 HRESULT GetStatistics(WORD wStreamNum, WM_WRITER_STATISTICS* pStats)

GetStatistics メソッドは、現在の書き込み操作を表す統計情報を取得します。

wStreamNumWORDinストリーム番号を格納した WORD。ストリーム番号は 1 から 63 の範囲でなければなりません。値 0 は、ファイル全体の統計情報を取得します。
pStatsWM_WRITER_STATISTICS*out統計情報を受け取る WM_WRITER_STATISTICS 構造体へのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_POINTER
pStatsNULL です。
vtbl 12 HRESULT SetSyncTolerance(DWORD msWindow)

SetSyncTolerance メソッドは、サンプルが破棄される前に入力が同期からずれてもよい時間の長さを設定します。

msWindowDWORDin入力が同期からずれてもよい時間の長さ(ミリ秒単位)。このパラメーターは 100 ナノ秒単位ではなくミリ秒単位である点に注意してください。

戻り値

このメソッドは常に S_OK を返します。

解説(Remarks)

既定の許容値は 3000 ミリ秒です。

許容値をどのように設定した場合でも、サンプルをできるだけ厳密に同期させておくことが、最高のパフォーマンスと最高品質のコンテンツにつながります。

vtbl 13 HRESULT GetSyncTolerance(DWORD* pmsWindow)

GetSyncTolerance メソッドは、サンプルが破棄される前に入力が同期からずれてもよい時間の長さを取得します。

pmsWindowDWORD*out入力が同期からずれてもよいミリ秒数の上限へのポインター。このパラメーターは 100 ナノ秒単位ではなくミリ秒単位である点に注意してください。

戻り値

このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。

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

解説(Remarks)

既定の許容値は 3000 ミリ秒です。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_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 指定が可能。