IWMWriter
COM公式ドキュメント
IWMWriter インターフェースは、ASF ファイルの書き込みに使用します。
メソッド 13
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetProfileByID メソッドは、現在の書き込みタスクで使用するプロファイルを、その GUID によって識別して指定します。
| guidProfile | GUID* | in | プロファイルの GUID。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 原因不明の理由でメソッドが失敗しました。 |
解説(Remarks)
ID を持つのはシステムプロファイルのみです。システムプロファイルを調べるには、IWMProfileManager インターフェースのメソッドを使用してください。ヘッダーファイル Wmsysprf.h に、システムプロファイルとその ID の一覧が記載されています。
SetProfile メソッドは、現在の書き込みタスクで使用するプロファイルを指定します。
| pProfile | IWMProfile* | in | IWMProfile インターフェースへのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
プロファイル内の複数のストリームが同じストリーム番号を持っています。 |
|
プロファイルのストリーム数がゼロです。
CBR エンコードモードでビットレートがゼロに指定されました。 複数のスクリプトストリームが指定されました。 帯域幅共有情報が正しくないか、一貫性がありません。 |
|
|
ライターが構成可能な状態ではありません。 |
すべてのストリームに共通:
|
|
| オーディオストリーム内の言語文字列に指定されたサイズが小さすぎます。 |
解説(Remarks)
このメソッドを呼び出すと、それまでに設定されたヘッダー属性情報はすべて削除されます。
このメソッドを呼び出した後にプロファイルオブジェクトへ加えた変更は、SetProfile を再度呼び出すまで有効になりません。
プロファイル内のストリームの最大数は、定数 WM_MAX_STREAMS で定義されているとおり 63 です。別の定数 WM_MAX_VIDEO_STREAMS はビデオストリームの最大数を定義しており、これも 63 です。
SetOutputFilename メソッドは、書き込むファイルの名前を指定します。
| pwszFilename | LPWSTR | in | ファイル名を格納したワイド文字の null 終端文字列へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 原因不明の理由でメソッドが失敗しました。 | |
|
ライターが構成可能な状態ではありません。 |
解説(Remarks)
このメソッドは、インデックス 0 のファイルシンクを作成し、IWMWriterAdvanced::AddSink の呼び出しを通じて追加することと同等であり、便宜のために提供されています。
このメソッドで作成されたファイルシンクの IWMWriterSink インターフェースへのポインターは、IWMWriterAdvanced::GetSink を呼び出すことで取得できます。ライターは、関連付けられたシンクのステータスメッセージを配信しないため、これは重要です。IWMWriterSink に対して QueryInterface を呼び出すことで、IWMRegisterCallback へのポインターを取得できます。これは、シンクがステータスメッセージを配信する先の IWMStatusCallback::OnStatus コールバックメソッドを設定するために使用します。
GetInputCount メソッドは、非圧縮入力ストリームの数を取得します。
| pcInputs | DWORD* | out | 入力数へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pcInputs パラメーターが NULL です。 |
解説(Remarks)
このメソッドは GetInputProps とともに使用して、さまざまな入力を列挙し、それぞれの入力フォーマットを取得できます。これらは、プロファイルで指定される出力 Windows Media ストリームではありません。マルチビットレートのシナリオでは、1 つの入力ストリームが複数の Windows Media ストリームに対応することがあります。
GetInputProps メソッドは、指定した入力ストリームの現在のメディアプロパティを取得します。
| dwInputNum | DWORD | in | 入力インデックス番号を格納した DWORD。 |
| ppInput | IWMInputMediaProps** | out | IWMInputMediaProps オブジェクトへのポインターへのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| dwInputNum の値が最大インデックス番号を超えています。 |
解説(Remarks)
dwInputNum パラメーターに使用するインデックスの範囲は、GetInputCount を呼び出すことで確認できます。
IWMInputMediaProps オブジェクトを操作しても、アプリケーションが入力を構成するために SetInputProps メソッドを呼び出さない限り、ライターには影響しません。
SetInputProps メソッドは、入力ストリームのメディアプロパティを指定します。
| dwInputNum | DWORD | in | 入力番号を格納した DWORD。 |
| pInput | IWMInputMediaProps* | in | IWMInputMediaProps インターフェースへのポインター。「解説」を参照してください。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| dwInputNum が最大インデックス番号を超えています。 | |
| 使用可能なメモリが不足しています。 | |
| 原因不明の理由でメソッドが失敗しました。 |
解説(Remarks)
IWMInputMediaProps オブジェクトを操作しても、アプリケーションが入力を構成するためにこのメソッドを呼び出すまでは、ライターには影響しません。
入力が、再圧縮されずに (IWMWriterAdvanced::WriteStreamSample を使用して) 新しいストリームに直接書き込まれる圧縮済みサンプルを含む場合は、pInput に NULL を指定してください。
GetInputFormatCount メソッドは、ライター上のこの入力がサポートするメディアフォーマットタイプの数を取得します。
| dwInputNumber | DWORD | in | 入力番号を格納した DWORD。 |
| pcFormats | DWORD* | out | フォーマット数へのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
pcFormats パラメーターが NULL です。
または dwInputNumber が大きすぎます。 |
GetInputFormat メソッドは、指定した入力に対して可能なメディアフォーマットを取得します。
| dwInputNumber | DWORD | in | 入力番号を格納した DWORD。 |
| dwFormatNumber | DWORD | in | フォーマット番号を格納した DWORD。 |
| pProps | IWMInputMediaProps** | out | IWMInputMediaProps インターフェースへのポインターへのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| dwInputNumber が大きすぎます。 |
BeginWriting メソッドは、書き込みプロセスを初期化します。
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 使用可能なメモリが不足しています。 | |
| 原因不明の理由でメソッドが失敗しました。 | |
| オーディオコーデックでエラーが発生しました。 | |
| 必要なオーディオコーデックが利用できません。 | |
| より新しいコンテンツ失効リストが必要です。 | |
| 出力フォーマットが有効ではありません。 | |
| ビデオコーデックでエラーが発生しました。 | |
| 必要なビデオコーデックが利用できません。 |
解説(Remarks)
BeginWriting メソッドは、サンプルを書き込む前に呼び出す必要があります。このメソッドは実際に書き込みを開始するのではなく、プロセスを初期化します。この呼び出しから EndWriting の呼び出しまでの間、ライターの構成を変更することはできません。サンプルの書き込みを正常に終了するには、EndWriting メソッドを呼び出す必要があります。
次の操作は、BeginWriting を呼び出す前にのみ実行できます:
- SetProfile によるプロファイルの設定
- 出力ファイル名の設定 (IWMWriter::SetOutputFilename を使用する場合)
- IWMHeaderInfo::SetAttribute による属性の設定
- マーカー操作 (IWMHeaderInfo::GetMarkerCount、GetMarker、AddMarker、RemoveMarker。ただし AddMarker はライターには実装されておらず、マーカーがない場合は残りのメソッドも役に立ちません)
- 入力ストリームが WriteStreamSample を使用して書き込まれることを示すために、NULL の IWMInputMediaProps パラメーターを指定して IWMWriter::SetInputProps を呼び出す。
- ヘッダースクリプト操作 (IWMHeaderInfo::GetScriptCount、GetScript、AddScript、RemoveScript)
- コーデック情報操作 (IWMHeaderInfo2::GetCodecInfoCount と GetCodecInfo)
- IWMWriterPostView::SetPostViewProps
- IWMHeaderInfo::GetAttributeCount
- IWMHeaderInfo::GetAttributeByIndex
- IWMHeaderInfo::GetAttributeByName
- IWMWriterAdvanced2::SetInputSetting
注: SetInputSetting は、g_wszDeinterlaceMode、g_wszInitialPatternForInverseTelecine、g_wszInterlacedCoding、および g_wszJPEGCompressionQuality については BeginWriting の後に呼び出すことができます。
次の操作は、プロファイルが設定された後であればいつでも実行できます:
- SetPostViewProps を除くすべてのポストビュー操作
- IWMWriter::SetInputProps。ただし NULL の IWMInputMediaProps パラメーターを渡す場合を除きます。
- IWMWriter::GetInputProps
- IWMWriter::GetInputFormatCount
- IWMWriter::GetInputFormat
- IWMWriter::AllocateSample によるサンプルの割り当て
- IWMWriter::WriteSample および IWMWriterAdvanced::WriteStreamSample によるサンプルの書き込み
- IWMWriter::EndWriting
- IWMWriterAdvanced::AddSink および IWMWriterAdvanced::RemoveSink によるシンクの追加と削除
- IWMWriterAdvanced::SetLiveSource
- IWMWriterAdvanced::IsRealTime
- IWMWriterAdvanced::GetWriterTime (ただし意味のある値は返しません)
- IWMWriterAdvanced::GetStatistics
- IWMWriterAdvanced::SetSyncTolerance
- IWMWriterAdvanced::GetSyncTolerance
例
次のサンプルコードは、ライターをセットアップし、出力をネットワークシンクとアーカイブファイルの両方に送信する方法の概要を示しています。
IWMWriter * pWriter = NULL;
IWMWriterAdvanced * pWriterAdvanced = NULL;
IWMWriterFileSink2 * pWriterFileSink = NULL;
IWMWriterNetworkSink2 * pWriterNetworkSink = NULL;
HRESULT hr = S_OK;
DWORD dwPort;
// エラー処理を簡単にするため、すべてをダミーループ内で行います。
do
{
// 基本オブジェクトを作成します。
hr = WMCreateWriter( &pWriter );
if( FAILED( hr ) )
{
break;
}
hr = WMCreateWriterFileSink( &pWriterFileSink );
if( FAILED( hr ) )
{
break;
}
hr = WMCreateWriterNetworkSink( &pWriterNetworkSink );
if( FAILED( hr ) )
{
break;
}
// IWMWriterAdvanced インターフェースへのポインターを取得し、シンクを追加します。
hr = pWriter->QueryInterface( IID_IWMWriterAdvanced, (void **)&pWriterAdvanced );
if( FAILED( hr ) )
{
break;
}
hr = pWriterAdvanced->AddSink( pWriterFileSink );
if( FAILED( hr ) )
{
break;
}
hr = pWriterAdvanced->AddSink( pWriterNetworkSink );
if( FAILED( hr ) )
{
break;
}
hr = pWriterFileSink->Open( L"Archive file name" );
if( FAILED( hr ) )
{
break;
}
// ポート番号をゼロに設定すると、SDK が適切な
// ポート番号を選択できるようになります。
dwPort = 0;
hr = pWriterNetworkSink->Open( &dwPort );
if( FAILED( hr ) )
{
break;
}
hr = pWriter->BeginWriting();
if( FAILED( hr ) )
{
break;
}
// ライターへデータを送信するコードをここに記述します (省略)。
// 両方のシンクを閉じます。
hr = pWriterFileSink->Close();
if( FAILED( hr ) )
{
break;
}
hr = pWriterNetworkSink->Close();
if( FAILED( hr ) )
{
break;
}
hr = pWriter-> EndWriting();
if( FAILED( hr ) )
{
break;
}
}
while( FALSE );
// クリーンアップします。
if ( pWriter )
{
pWriter->Release();
}
if ( pWriterAdvanced )
{
pWriterAdvanced->Release();
}
if ( pWriterFileSink )
{
pWriterFileSink->Release();
}
if ( pWriterNetworkSink )
{
pWriterNetworkSink->Release();
}
EndWriting メソッドは、書き込みセッションの終了時に必要なタスクを実行します。
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
現在、ライターを実行できません。 |
解説(Remarks)
エンコードが完了する前にディスク領域を使い果たした場合でも、このメソッドは失敗コードを返しません。ファイル書き込みエラーの通知を受け取るには、アプリケーションで IWMStatusCallback メソッドを実装し、NS_E_FILE_WRITE イベントをリッスンする必要があります。
AllocateSample メソッドは、ライターにサンプルを提供するために使用できるバッファーを割り当てます。
| dwSampleSize | DWORD | in | サンプルサイズ (バイト単位) を格納した DWORD。 |
| ppSample | INSSBuffer** | out | サンプルを含むオブジェクトの INSSBuffer インターフェースへのポインターへのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 現在、ライターが実行されていません。 |
解説(Remarks)
ライターオブジェクトに渡す各サンプルには、新しいバッファーを使用する必要があります。IWMWriter::WriteSample の呼び出しに渡した後のバッファーを再利用すると、ライターオブジェクトはバッファーオブジェクトへの参照をすぐには解放しないため、エラーが発生します。バッファーオブジェクトのインターフェースは、WriteSample の呼び出しが返った後であればいつでも安全に解放できます。
WriteSample メソッドは、圧縮されて作成中のファイルに追加される非圧縮データを渡します。
| dwInputNum | DWORD | in | 入力番号を格納した DWORD。 | ||||||||||
| cnsSampleTime | ULONGLONG | in | サンプル時間 (100 ナノ秒単位) を格納した QWORD。 | ||||||||||
| dwFlags | DWORD | in | 次のフラグを 1 つ以上格納した DWORD。
| ||||||||||
| pSample | INSSBuffer* | in | サンプルを表す INSSBuffer インターフェースへのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| dwInputNum の値が最大インデックス番号を超えています。 | |
| 原因不明の理由でメソッドが失敗しました。 | |
|
ライターが実行されていません。 |
| サンプルが有効ではありません。これは、入力スクリプトストリームに有効でないスクリプトサンプルが含まれている場合に発生することがあります。 | |
|
ストリームの出力タイプに対して、前処理パスの数が誤っています。
通常、このエラーは、ストリーム構成が前処理パスを必要とするにもかかわらず、前処理を先に構成せずにサンプルが渡された場合に返されます。このエラーをチェックすることで、ストリームが前処理パスを必要とするかどうかを判断できます。前処理パスが必要になるのは、ビットレートベースの VBR の場合のみです。 |
|
|
ライターが、プレゼンテーション時間の差が最大同期許容値を超えるサンプルを受け取りました。同期許容値は、IWMWriterAdvanced::SetSyncTolerance を呼び出すことで設定できます。
このエラーは、ストリームが複数あり、アプリケーションが一方のストリームのサンプルをもう一方のストリームより速いレートで送信した場合に発生することがあります。ある時点で、2 番目のストリームが 1 番目のストリームより大きく遅れ、ライターはこのエラーコードを返します。 |
|
| リアルタイムソースからのサンプルが予想より速く到着しています。このエラーは、ライブソースを示すために IWMWriterAdvanced::SetLiveSource が呼び出されている場合にのみ返されます。 |
解説(Remarks)
出力ストリームにタイムコードのデータユニット拡張があり、サンプルにタイムコード拡張がない場合、後でファイルをインデックス化する際に問題を引き起こさないよう、このメソッドは失敗します。その他のデータユニット拡張は、サンプルでは省略可能です。つまり、ストリームに対してデータユニット拡張が指定されていても、サンプルに実際のデータ拡張が存在しない場合、このメソッドは成功します。WriteSample は、サンプルに拡張が指定されていないサンプルについては、ファイルにゼロを書き込みます。
Flush メソッドの機能は削除されました。IWMWriter::EndWriting が必要なチェックを内部で実行するためです。古いアプリケーションとの互換性のため、flush の呼び出しは何も行いませんが、常に S_OK を返します。
戻り値
このメソッドは常に S_OK を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMWriter "{96406BD4-2B2B-11D3-B36B-00C04F6108FF}" #usecom global IWMWriter IID_IWMWriter "{}" #comfunc global IWMWriter_SetProfileByID 3 var #comfunc global IWMWriter_SetProfile 4 sptr #comfunc global IWMWriter_SetOutputFilename 5 wstr #comfunc global IWMWriter_GetInputCount 6 var #comfunc global IWMWriter_GetInputProps 7 int,sptr #comfunc global IWMWriter_SetInputProps 8 int,sptr #comfunc global IWMWriter_GetInputFormatCount 9 int,var #comfunc global IWMWriter_GetInputFormat 10 int,int,sptr #comfunc global IWMWriter_BeginWriting 11 #comfunc global IWMWriter_EndWriting 12 #comfunc global IWMWriter_AllocateSample 13 int,sptr #comfunc global IWMWriter_WriteSample 14 int,int64,int,sptr #comfunc global IWMWriter_Flush 15 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWMWriter "{96406BD4-2B2B-11D3-B36B-00C04F6108FF}" #usecom global IWMWriter IID_IWMWriter "{}" #comfunc global IWMWriter_SetProfileByID 3 sptr #comfunc global IWMWriter_SetProfile 4 sptr #comfunc global IWMWriter_SetOutputFilename 5 wstr #comfunc global IWMWriter_GetInputCount 6 sptr #comfunc global IWMWriter_GetInputProps 7 int,sptr #comfunc global IWMWriter_SetInputProps 8 int,sptr #comfunc global IWMWriter_GetInputFormatCount 9 int,sptr #comfunc global IWMWriter_GetInputFormat 10 int,int,sptr #comfunc global IWMWriter_BeginWriting 11 #comfunc global IWMWriter_EndWriting 12 #comfunc global IWMWriter_AllocateSample 13 int,sptr #comfunc global IWMWriter_WriteSample 14 int,int64,int,sptr #comfunc global IWMWriter_Flush 15 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。