Поделиться через


Метод 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, а вызов необходимо выполнить только один раз. В противном случае между последовательными буферами не должно быть пробелов.

Пользователь должен записать эти данные в содержимое в байтах cbOffsetFromIndexStart после окончания объекта данных ASF. Чтобы определить начальную позицию индекса ASF, можно вызвать IMFASFIndexer::GetIndexPosition .

Этот вызов не будет выполнен, если не был вызван 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
Header wmcontainer.h
Библиотека Mfuuid.lib

См. также раздел

Объект индекса ASF

IMFASFIndexer

Использование индексатора для записи нового индекса