Share via


Uso de marcadores

[La característica asociada a esta página, WINDOWS Media Format 11 SDK, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. Lector de origen y escritor receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector fuente y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Un marcador es un punto con nombre dentro de un archivo ASF. Cada marcador consta de un nombre y un tiempo asociado, medido como un desplazamiento desde el inicio del archivo. Una aplicación puede usar marcadores para asignar nombres a varios puntos dentro del contenido, mostrar esos nombres al usuario y, a continuación, buscar las posiciones del marcador. Una aplicación puede agregar o quitar marcadores de un archivo ASF existente.

La interfaz IWMHeaderInfo contiene métodos para trabajar con marcadores. El objeto editor de metadatos admite la adición y eliminación de marcadores. Los objetos writer y reader pueden recuperar marcadores, pero no pueden agregar ni quitar marcadores.

Agregar marcadores

Para agregar un marcador, consulte el editor de metadatos para la interfaz IWMHeaderInfo . A continuación, llame al método IWMHeaderInfo::AddMarker , especificando el nombre del marcador como una cadena de caracteres anchos y el tiempo en unidades de 100 nanosegundos. El tiempo no debe superar la duración del archivo. Dos marcadores pueden tener la misma hora.

En el ejemplo siguiente se agregan varios marcadores a un archivo:

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

Quitar marcadores

Para quitar un marcador, llame a IWMHeaderInfo::RemoveMarker y especifique el índice del marcador que se va a quitar. Los marcadores se ordenan automáticamente en orden de tiempo creciente, por lo que el índice 0 siempre es el primer marcador. Tenga en cuenta que al llamar a RemoveMarker cambia los números de índice de los marcadores siguientes. El código siguiente, donde pInfo es un puntero a una interfaz IWMHeaderInfo , quita todos los marcadores de un archivo:

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

Recuperación de marcadores

Para recuperar el nombre y la hora de un marcador, realice los pasos siguientes:

  1. Llame al método IWMHeaderInfo::GetMarkerCount para determinar cuántos marcadores contiene el archivo.
  2. Recupere el tamaño de la cadena necesaria para contener el nombre del marcador. Para ello, llame al método IWMHeaderInfo::GetMarker . Especifique el índice del marcador que se va a recuperar y NULL para el búfer de cadenas (el parámetro pwszMarkerName ). El método devuelve la longitud de la cadena, incluido el carácter de terminación '\0', en el parámetro pcchMarkerNameLen .
  3. Asigne una cadena de caracteres anchos para recibir el nombre.
  4. Vuelva a llamar a GetMarker , pero esta vez pase la dirección de la cadena en el parámetro pwszMarkerName . El método escribe el nombre del marcador en la cadena y devuelve la hora del marcador en el parámetro pcnsMarkerTime .

El código siguiente recorre en bucle cada marcador en orden y recupera el nombre y la 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;

Buscar en un marcador

Para iniciar la reproducción desde una ubicación de marcador, llame al método IWMReaderAdvanced2::StartAtMarker del objeto lector, especificando el índice del marcador. Los parámetros restantes son idénticos a los del método IWMReader::Start . En el ejemplo siguiente se consulta al lector la interfaz IWMReaderAdvanced2 y se busca el primer 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();
}

Interfaz IWMHeaderInfo

IWMReaderAdvanced2::StartAtMarker

Trabajar con metadatos