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


Использование маркеров

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Она была заменена средствами чтения источника и модуля записи приемников. Средство чтения источника и модуль записи приемников оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде средство чтения исходного кода и модуль записи приемников вместо пакета SDK для Windows Media Format 11, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Маркер — это именованной точкой в ASF-файле. Каждый маркер состоит из имени и связанного времени, измеряемого как смещение от начала файла. Приложение может использовать маркеры для назначения имен различным точкам в содержимом, отображения этих имен пользователю и последующего поиска по позициям маркеров. Приложение может добавлять или удалять маркеры из существующего ФАЙЛА ASF.

Интерфейс IWMHeaderInfo содержит методы для работы с маркерами. Объект редактора метаданных поддерживает добавление и удаление маркеров. Объекты модуля записи и чтения могут извлекать маркеры, но не могут добавлять или удалять маркеры.

Добавление маркеров

Чтобы добавить маркер, запросите в редакторе метаданных интерфейс IWMHeaderInfo . Затем вызовите метод IWMHeaderInfo::AddMarker , указав имя маркера в виде строки расширенных символов и время в 100-наносекундных единицах. Время не должно превышать длительность файла. Два маркера могут иметь одно и то же время.

В следующем примере к файлу добавляется несколько маркеров:

IWMMetadataEditor *pEdit = 0;
IWMHeaderInfo     *pInfo = 0;

// Create the metadata editor object.

WMCreateEditor(&pEdit);
pEdit->Open(L"C:\\example.wmv");
pEdit->QueryInterface(IID_IWMHeaderInfo, (void**)&pInfo);

// Add the markers. Note that we add the last ones first. Do this when possible
// for improved performance when writing the markers to the file.
hr = pInfo->AddMarker(L"End",  520000000);   // 52 sec.
hr = pInfo->AddMarker(L"Segue",  350000000); // 35 sec.
hr = pInfo->AddMarker(L"Intro",  15000000);  // 1.5 sec.

// Commit changes and clean up.

pEdit->Flush();
pEdit->Close(); 
pInfo->Release();
pEdit->Release();

Удаление маркеров

Чтобы удалить маркер, вызовите IWMHeaderInfo::RemoveMarker, указав индекс удаляемого маркера. Маркеры автоматически сортируются в порядке возрастания времени, поэтому индекс 0 всегда является первым маркером. Обратите внимание, что вызов RemoveMarker изменяет номера индексов всех следующих маркеров. Следующий код, где pInfo является указателем на интерфейс IWMHeaderInfo , удаляет все маркеры из файла:

WORD count = 0;
pInfo->GetMarkerCount(&count);
while (count--)
{
    pInfo->RemoveMarker(0);
}

Получение маркеров

Чтобы получить имя и время маркера, выполните следующие действия.

  1. Вызовите метод IWMHeaderInfo::GetMarkerCount , чтобы определить, сколько маркеров содержит файл.
  2. Получение размера строки, необходимой для хранения имени маркера. Для этого вызовите метод IWMHeaderInfo::GetMarker . Укажите индекс извлекаемого маркера и значение NULL для буфера строки (параметр pwszMarkerName ). Метод возвращает длину строки, включая символ конца "\0", в параметре pcchMarkerNameLen .
  3. Выделите строку с расширенными символами для получения имени.
  4. Вызовите GetMarker еще раз, но на этот раз передайте адрес строки в параметре pwszMarkerName . Метод записывает имя маркера в строку и возвращает время маркера в параметре pcnsMarkerTime .

Следующий код выполняет циклическое перебирает каждый маркер по порядку и извлекает имя и время:

WORD cMarkers = 0;
HRESULT hr = pInfo->GetMarkerCount(&cMarkers);

WCHAR *wszName = 0;
WORD  len = 0;
for (WORD iMarker = 0; iMarker < cMarkers; ++iMarker)
{
    QWORD rtTime = 0;
    WORD req_len = 0;
    hr = pInfo->GetMarker(iMarker, 0, &req_len, &rtTime);
    
    // Reallocate if necessary.
    if (len < req_len)
    {
        delete[] wszName;
        wszName = new WCHAR[req_len];
        len = req_len;
    }
    hr = pInfo->GetMarker(iMarker, wszName, &req_len, &rtTime);
    // Display the name...
}
delete[] wszName;

Поиск маркера

Чтобы начать воспроизведение из расположения маркера, вызовите метод IWMReaderAdvanced2::StartAtMarker объекта чтения, указав индекс маркера. Остальные параметры идентичны параметрам для метода IWMReader::Start . В следующем примере запрашивается у читателя интерфейс IWMReaderAdvanced2 и выполняется поиск к первому маркеру.

IWMReaderAdvanced2 *pReader2 = 0
WORD iMarkerIndex = 0;
hr = pReader->QueryInterface(IID_IWMReaderAdvanced2, (void**)&pReader2);
if (SUCCEEDED(hr))
{
    hr = pPlayer2->StartAtMarker(iMarkerIndex, 0, 1.0, 0);
    pPlayer2->Release();
}

Интерфейс IWMHeaderInfo

IWMReaderAdvanced2::StartAtMarker

Работа с метаданными