Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído por Source Reader e Sink Writer. do Source Reader e Sink Writer foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o código novo utilize Leitor de Origem e Gravador de Acessórios em vez de SDK do Windows Media Format 11, sempre que 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 ficheiro ASF. Cada marcador consta de um nome e um tempo associado, medido como uma diferença desde o início do ficheiro. 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, procurar as posições do marcador. Um aplicativo pode adicionar ou remover marcadores de um arquivo ASF existente.
A interfaceIWMHeaderInfo contém métodos para trabalhar com marcadores. O objeto do editor de metadados suporta a adição e remoção de marcadores. Os objetos de 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 da interface IWMHeaderInfo. Em seguida, chame o método IWMHeaderInfo::AddMarker, especificando o nome do marcador como uma cadeia de caracteres largos e o tempo 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();
Remoção de marcadores
Para remover um marcador, chame IWMHeaderInfo::RemoveMarker, especificando o índice do marcador a ser removido. Os marcadores são automaticamente classificados em ordem de tempo crescente, de modo que o índice 0 é sempre o primeiro marcador. Observe que chamar RemoveMarker altera os números de índice de quaisquer marcadores que se seguem. O código a seguir, onde pInfo é um ponteiro para uma interface IWMHeaderInfo, remove todos os marcadores de um ficheiro:
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:
- Chame o método IWMHeaderInfo::GetMarkerCount para determinar quantos marcadores o arquivo contém.
- Recupere o tamanho da cadeia de caracteres necessária para conter o nome do marcador. Para fazer isso, chame o IWMHeaderInfo::GetMarker método. Especifique o índice do marcador a ser recuperado e NULL para o buffer de string (o parâmetro pwszMarkerName). O método retorna o comprimento da cadeia de caracteres, incluindo o caractere de terminação '\0', no pcchMarkerNameLen parâmetro.
- Aloque uma cadeia de caracteres larga para receber o nome.
- 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 o tempo do marcador no parâmetro pcnsMarkerTime.
O código a seguir percorre cada marcador em 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;
Procurando um marcador
Para iniciar a reprodução a partir de um local de marcador, chame o do objeto leitor IWMReaderAdvanced2::StartAtMarker método, 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 interfaceIWMReaderAdvanced2 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();
}
Tópicos relacionados