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 |
程式庫 | Mfuuid.lib |