Использование маркеров
[Функция, связанная с этой страницей, 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);
}
Получение маркеров
Чтобы получить имя и время маркера, выполните следующие действия.
- Вызовите метод IWMHeaderInfo::GetMarkerCount , чтобы определить, сколько маркеров содержит файл.
- Получение размера строки, необходимой для хранения имени маркера. Для этого вызовите метод IWMHeaderInfo::GetMarker . Укажите индекс извлекаемого маркера и значение NULL для буфера строки (параметр pwszMarkerName ). Метод возвращает длину строки, включая символ конца "\0", в параметре pcchMarkerNameLen .
- Выделите строку с расширенными символами для получения имени.
- Вызовите 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();
}
Связанные темы