Compartilhar via


Usando marcadores

[O recurso associado a esta página, Windows Media Format 11 SDK, é um recurso herdado. Ele foi substituído por Leitor de Origem e Gravador de Coletor. O Leitor de Origem e o Gravador do Coletor foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o Leitor de Origem e o Gravador do Coletor em vez do SDK do Windows Media Format 11, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Um marcador é um ponto nomeado dentro de um arquivo ASF. Cada marcador consiste em um nome e uma hora associada, medidos como um deslocamento do início do arquivo. Um aplicativo pode usar marcadores para atribuir nomes a vários pontos dentro do conteúdo, exibir esses nomes para o usuário e, em seguida, buscar as posições do marcador. Um aplicativo pode adicionar ou remover marcadores de um arquivo ASF existente.

A interface IWMHeaderInfo contém métodos para trabalhar com marcadores. O objeto do editor de metadados dá suporte à adição e remoção de marcadores. Os objetos gravador e leitor podem recuperar marcadores, mas não podem adicionar ou remover marcadores.

Adicionando marcadores

Para adicionar um marcador, consulte o editor de metadados para a interface IWMHeaderInfo . Em seguida, chame o método IWMHeaderInfo::AddMarker , especificando o nome do marcador como uma cadeia de caracteres largos e a hora em unidades de 100 nanossegundos. O tempo não deve exceder a duração do arquivo. Dois marcadores podem ter o mesmo tempo.

O exemplo a seguir adiciona vários marcadores a um arquivo:

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();

Removendo marcadores

Para remover um marcador, chame IWMHeaderInfo::RemoveMarker, especificando o índice do marcador a ser removido. Os marcadores são classificados automaticamente em ordem de tempo crescente, portanto, o índice 0 é sempre o primeiro marcador. Observe que chamar RemoveMarker altera os números de índice de todos os marcadores a seguir. O código a seguir, em que pInfo é um ponteiro para uma interface IWMHeaderInfo , remove todos os marcadores de um arquivo:

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

Recuperando marcadores

Para recuperar o nome e a hora de um marcador, execute as seguintes etapas:

  1. Chame o método IWMHeaderInfo::GetMarkerCount para determinar quantos marcadores o arquivo contém.
  2. Recupere o tamanho da cadeia de caracteres necessária para conter o nome do marcador. Para fazer isso, chame o método IWMHeaderInfo::GetMarker . Especifique o índice do marcador a ser recuperado e NULL para o buffer de cadeia de caracteres (o parâmetro pwszMarkerName ). O método retorna o comprimento da cadeia de caracteres, incluindo o caractere de terminação '\0', no parâmetro pcchMarkerNameLen .
  3. Aloque uma cadeia de caracteres largos para receber o nome.
  4. Chame GetMarker novamente, mas desta vez passe o endereço da cadeia de caracteres no parâmetro pwszMarkerName . O método grava o nome do marcador na cadeia de caracteres e retorna a hora do marcador no parâmetro pcnsMarkerTime .

O código a seguir executa um loop em cada marcador na ordem e recupera o nome e a hora:

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;

Buscando um marcador

Para iniciar a reprodução de um local de marcador, chame o método IWMReaderAdvanced2::StartAtMarker do objeto leitor, especificando o índice do marcador. Os parâmetros restantes são idênticos aos do método IWMReader::Start . O exemplo a seguir consulta o leitor para a interface IWMReaderAdvanced2 e procura o primeiro marcador.

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 Interface

IWMReaderAdvanced2::StartAtMarker

Trabalhando com metadados