Verwenden von Markern
Ein Marker ist ein benannter Punkt in einer ASF-Datei. Jeder Marker besteht aus einem Namen und einer zugeordneten Zeit, die als Offset vom Anfang der Datei gemessen wird. Eine Anwendung kann Marker verwenden, um verschiedenen Punkten im Inhalt Namen zu zuweisen, diese Namen dem Benutzer anzuzeigen und dann nach den Markerpositionen zu suchen. Eine Anwendung kann Marker zu einer vorhandenen ASF-Datei hinzufügen oder daraus entfernen.
Die IWMHeaderInfo-Schnittstelle enthält Methoden zum Arbeiten mit Markern. Das Metadaten-Editor-Objekt unterstützt das Hinzufügen und Entfernen von Markern. Die Writer- und Readerobjekte können Marker abrufen, aber keine Marker hinzufügen oder entfernen.
Hinzufügen von Markern
Um einen Marker hinzuzufügen, fragen Sie den Metadaten-Editor für die IWMHeaderInfo-Schnittstelle ab. Rufen Sie dann die IWMHeaderInfo::AddMarker-Methode auf, und geben Sie dabei den Markernamen als Breitzeichenzeichenfolge und die Zeit in Einheiten von 100 Nanosekunden an. Die Zeit darf die Dateidauer nicht überschreiten. Zwei Marker können dieselbe Zeit haben.
Im folgenden Beispiel werden einer Datei mehrere Marker hinzufügt:
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();
Entfernen von Markern
Rufen Sie zum Entfernen eines Markers IWMHeaderInfo::RemoveMarkerauf, und geben Sie dabei den Index des zu entfernenden Markers an. Marker werden automatisch in zunehmender Zeitreihenfolge sortiert, sodass Index 0 immer der erste Marker ist. Beachten Sie, dass durch aufrufen von RemoveMarker die Indexnummern aller folgenden Marker geändert werden. Der folgende Code, bei dem pInfo ein Zeiger auf eine IWMHeaderInfo-Schnittstelle ist, entfernt alle Marker aus einer Datei:
WORD count = 0;
pInfo->GetMarkerCount(&count);
while (count--)
{
pInfo->RemoveMarker(0);
}
Abrufen von Markern
Führen Sie die folgenden Schritte aus, um den Namen und die Uhrzeit eines Markers abzurufen:
- Rufen Sie die IWMHeaderInfo::GetMarkerCount-Methode auf, um zu bestimmen, wie viele Marker die Datei enthält.
- Ruft die Größe der Zeichenfolge ab, die erforderlich ist, um den Markernamen zu enthalten. Rufen Sie dazu die IWMHeaderInfo::GetMarker-Methode auf. Geben Sie den Index des abzurufenden Markers und NULL für den Zeichenfolgenpuffer (den pwszMarkerName-Parameter) an. Die -Methode gibt die Länge der Zeichenfolge einschließlich des endenden \ 0-Zeichens im pcchMarkerNameLen-Parameter zurück.
- Ordnen Sie eine Breitzeichenzeichenfolge zu, um den Namen zu erhalten.
- Rufen Sie GetMarker erneut auf, übergeben Sie dieses Mal jedoch die Adresse der Zeichenfolge im pwszMarkerName-Parameter. Die -Methode schreibt den Markernamen in die Zeichenfolge und gibt die Markerzeit im pcnsMarkerTime-Parameter zurück.
Der folgende Code durchfing alle Marker in der Reihenfolge und ruft den Namen und die Uhrzeit ab:
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;
Suchen nach einem Marker
Um die Wiedergabe von einer Markerposition aus zu starten, rufen Sie die IWMReaderAdvanced2::StartAtMarker-Methode des Readerobjekts auf, und geben Sie dabei den Index des Markers an. Die verbleibenden Parameter sind identisch mit denen für die IWMReader::Start-Methode. Im folgenden Beispiel wird der Reader nach der IWMReaderAdvanced2-Schnittstelle abgefragt und nach dem ersten Marker sucht.
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();
}