新しい ASF ヘッダー オブジェクトの生成
ContentInfo オブジェクトに含まれる情報をバイナリ ASF ヘッダー オブジェクト形式に変換するには、アプリケーションで IMFASFContentInfo::GenerateHeader呼び出す必要があります。 この呼び出しは、データ パケットが生成され、ContentInfo オブジェクトに更新された情報が含まれている後に行う必要があります。 GenerateHeader は、ヘッダー情報を有効な形式で含むメディア バッファーへのポインターを返します。 その後、アプリケーションは、メディア バッファーが指すデータを新しい ASF ファイルの先頭に書き込むことができます。
ContentInfo オブジェクトを使用して新しい Header オブジェクトを書き込むには
IMFASFContentInfo::SetProfile呼び出して、プロファイル オブジェクトを ContentInfo オブジェクトに提供します。 プロファイルの作成については、「ASF プロファイルの作成」を参照してください。
IMFASFContentInfo::GenerateHeader呼び出し、pIHeader パラメーター NULL を渡し、pcbHeader パラメーターに設定された ContentInfo オブジェクトのサイズを受け取ります。 アプリケーションは、この値を使用して、Header オブジェクトを格納するメモリまたはメディア バッファーを割り当てることができます。
受け取るヘッダー サイズには、ヘッダー オブジェクトの実際のサイズに応じて調整されるパディング サイズが含まれます。 ヘッダー オブジェクトの最大サイズは 10 MB です。 サイズがこの値を超えると、GenerateHeader はMF_E_ASF_INVALIDDATA エラーで失敗します。
GenerateHeader をもう一度呼び出して、手順 4 で作成したメディア バッファーの ContentInfo オブジェクトから新しい ASF ヘッダー オブジェクトを生成します。
メディア バッファー内のデータの長さが更新され、pcbHeader パラメーターで新しいサイズが返されます。
ファイルの先頭にメディア バッファーの内容を書き込みます。 アプリケーションはバイト ストリームを使用して書き込み操作を実行できます。 コード例については、「IMFByteStream::Write」を参照してください。
例
次のコード例は、ContentInfo オブジェクトを作成し、新しい Header オブジェクトを格納するメディア バッファーを生成する方法を示しています。 このコードを使用する完全な例については、「チュートリアル: ASF ストリームを 1 つのファイルから別のファイルにコピーするを参照してください。
//-------------------------------------------------------------------
// WriteASFFile
//
// Writes the complete ASF file.
//-------------------------------------------------------------------
HRESULT WriteASFFile(
IMFASFContentInfo *pContentInfo, // ASF Content Info for the output file.
IMFByteStream *pDataStream, // Data stream.
PCWSTR pszFile // Output file name.
)
{
IMFMediaBuffer *pHeaderBuffer = NULL;
IMFByteStream *pWmaStream = NULL;
DWORD cbHeaderSize = 0;
DWORD cbWritten = 0;
// Create output file.
HRESULT hr = MFCreateFile(
MF_ACCESSMODE_WRITE,
MF_OPENMODE_DELETE_IF_EXIST,
MF_FILEFLAGS_NONE,
pszFile,
&pWmaStream
);
// Get the size of the ASF Header Object.
if (SUCCEEDED(hr))
{
hr = pContentInfo->GenerateHeader(NULL, &cbHeaderSize);
}
// Create a media buffer.
if (SUCCEEDED(hr))
{
hr = MFCreateMemoryBuffer(cbHeaderSize, &pHeaderBuffer);
}
// Populate the media buffer with the ASF Header Object.
if (SUCCEEDED(hr))
{
hr = pContentInfo->GenerateHeader(pHeaderBuffer, &cbHeaderSize);
}
// Write the header contents to the byte stream for the output file.
if (SUCCEEDED(hr))
{
hr = WriteBufferToByteStream(pWmaStream, pHeaderBuffer, &cbWritten);
}
if (SUCCEEDED(hr))
{
hr = pDataStream->SetCurrentPosition(0);
}
// Append the data stream to the file.
if (SUCCEEDED(hr))
{
hr = AppendToByteStream(pDataStream, pWmaStream);
}
SafeRelease(&pHeaderBuffer);
SafeRelease(&pWmaStream);
return hr;
}
関連トピック