次の方法で共有


IMFASFIndexer::GetCompletedIndex メソッド (wmcontainer.h)

ASF インデクサー オブジェクトから完成したインデックスを取得します。

構文

HRESULT GetCompletedIndex(
  [in] IMFMediaBuffer *pIIndexBuffer,
  [in] QWORD          cbOffsetWithinIndex
);

パラメーター

[in] pIIndexBuffer

インデックス データを受信するメディア バッファーの IMFMediaBuffer インターフェイスへのポインター。

[in] cbOffsetWithinIndex

取得するデータのオフセット (インデックス データの先頭からのバイト単位)。 最初の呼び出しの場合は 0 に設定します。 後続の呼び出しが必要な場合 (バッファーはインデックス全体を保持するのに十分な大きさではありません)、最後に取得されたバイトに設定します。

戻り値

このメソッドは HRESULT を返します。 有効な値を次の表に示しますが、これ以外にもあります。

リターン コード 説明
S_OK
メソッドが成功しました。
MF_E_INDEX_NOT_COMMITTED
完了したインデックスの取得を試みる前に、インデックスがコミットされませんでした。 詳細については、「解説」を参照してください。

注釈

このメソッドは、できるだけ多くのバッファーを使用し、バッファーの長さを適切に更新します。

pIIndexBuffer がバッファー全体を格納するのに十分な大きさの場合、cbOffsetWithinIndex は 0 にする必要があり、呼び出しは 1 回だけ行う必要があります。 それ以外の場合は、連続するバッファー間にギャップはありません。

ユーザーは、ASF データ オブジェクトの末尾の後の cbOffsetFromIndexStart バイトのコンテンツにこのデータを書き込む必要があります。 IMFASFIndexer::GetIndexPosition を呼び出して、ASF インデックスの開始位置を決定できます。

IMFASFIndexer::CommitIndex が呼び出されていない限り、この呼び出しは成功しません。 GetCompletedIndex を呼び出した後、呼び出し元は IMFASFContentInfo::GenerateHeader を呼び出し、既存の ASF ヘッダーを新しいヘッダーで上書きする必要があります。それ以外の場合、ASF ヘッダーはコンテンツと一致せず、ファイルが正しく再生されるとは限りません。

このメソッドは、インデックスの読み取りシナリオでは使用できません。 このメソッドは、インデックスを作成する場合にのみ使用できます。

次の例は、ASF インデックス全体をバイト ストリームに書き込む方法を示しています。

HRESULT WriteASFIndex(IMFASFIndexer *pIndex,IMFByteStream *pStream)
{
    const DWORD cbChunkSize = 4096;

    IMFMediaBuffer *pBuffer = NULL;

    QWORD cbIndex = 0;
    DWORD cbIndexWritten = 0;

    HRESULT hr = pIndex->GetIndexWriteSpace(&cbIndex);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFCreateMemoryBuffer(cbChunkSize, &pBuffer);
    if (FAILED(hr))
    {
        goto done;
    }

    while (cbIndexWritten < cbIndex)
    {
        BYTE *pData = NULL;
        DWORD cbData = 0;
        DWORD cbWritten = 0;

        hr = pIndex->GetCompletedIndex(pBuffer, cbIndexWritten);
        if (FAILED(hr))
        {
            goto done;
        }

        hr = pBuffer->Lock(&pData, NULL, &cbData);
        if (FAILED(hr))
        {
            goto done;
        }

        hr = pStream->Write(pData, cbData, &cbWritten);

        (void)pBuffer->Unlock();

        if (FAILED(hr))
        {
            goto done;
        }

        cbIndexWritten += cbData;
    }

done:
    SafeRelease(&pBuffer);
    return hr;
};

要件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー wmcontainer.h
Library Mfuuid.lib

こちらもご覧ください

ASF Index オブジェクト

IMFASFIndexer

インデクサーを使用して新しいインデックスを書き込む