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


Создание и настройка индексатора

Индексатор ASF — это компонент уровня WMContainer, который используется для чтения или записи объектов индекса в файле ASF. В этом разделе содержатся сведения о создании объекта индексатора по умолчанию, предоставляемого Media Foundation.

Сведения о структуре ASF-файла см. в разделе Структура файлов ASF.

Создание и инициализация индексатора ASF

  1. Вызовите функцию MFCreateASFIndexer , чтобы получить указатель IMFASFIndexer на объект индексатора.

  2. Вызовите IMFASFIndexer::SetFlags , чтобы указать режим чтения или записи для объекта индексатора. По умолчанию индексатор настроен для прямого поиска.

    Использование Flag
    Чтение (поиск вперед) Ноль (по умолчанию)
    Чтение (обратный поиск) MFASF_INDEXER_READ_FOR_REVERSEPLAYBACK
    Запись MFASF_INDEXER_WRITE_NEW_INDEX

     

    Примечание

    Один и тот же экземпляр индексатора нельзя использовать как для чтения, так и для записи. Необходимо настроить индексатор для одного или другого.

     

  3. Вызовите IMFASFIndexer::Initialize , чтобы инициализировать индексатор, указав указатель IMFASFContentInfo объекта ContentInfo, который описывает файл для записи или чтения. Объект ContentInfo содержит сведения, составляющие объект заголовка ASF. Объект индексатора требует наличия допустимого объекта ContentInfo перед созданием или чтением записей индекса ASF-файла.

В следующем примере кода показано, как приложение может создать и инициализировать объект индексатора для работы с определенным содержимым ASF. Объект ContentInfo представляет объект заголовка ASF; содержимое передается в виде потока байтов.

HRESULT CreateASFIndexer(
    IMFASFContentInfo* pContentInfo, 
    DWORD dwFlags,
    IMFASFIndexer** ppIndexer
    )
{
    *ppIndexer = NULL;

    IMFASFIndexer *pIndexer = NULL;

    HRESULT hr = MFCreateASFIndexer(&pIndexer);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pIndexer->SetFlags(dwFlags);
    if (FAILED(hr))
    {
        goto done;
    }

    hr =  pIndexer->Initialize(pContentInfo);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the object to the caller.
    *ppIndexer = pIndexer;
    (*ppIndexer)->AddRef();

done:
    // Clean up.
    SafeRelease(&pIndexer);
    return hr;
}

Индексатор ASF

Использование индексатора для поиска в ASF-файле

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