IMFASFIndexer::GetCompletedIndex 方法 (wmcontainer.h)
从 ASF 索引器对象检索已完成的索引。
语法
HRESULT GetCompletedIndex(
[in] IMFMediaBuffer *pIIndexBuffer,
[in] QWORD cbOffsetWithinIndex
);
参数
[in] pIIndexBuffer
指向接收索引数据的媒体缓冲区的 IMFMediaBuffer 接口的指针。
[in] cbOffsetWithinIndex
要检索的数据的偏移量,以字节为单位,从索引数据开始。 对于第一次调用,设置为 0。 如果需要后续调用 (缓冲区不够大,无法保留整个索引) ,请将 设置为最后一个检索到的字节。
返回值
该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。
返回代码 | 说明 |
---|---|
|
方法成功。 |
|
在尝试获取已完成的索引之前,未提交索引。 有关详细信息,请参阅“备注”。 |
注解
此方法使用尽可能多的缓冲区,并相应地更新缓冲区的长度。
如果 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 |