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,并且只需进行一次调用。 否则,连续缓冲区之间不应有间隙。

在 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 索引对象

IMFASFIndexer

使用索引器编写新索引