Freigeben über


Verwenden von Markern

[Das dieser Seite zugeordnete Feature Windows Media Format 11 SDK ist ein Legacyfeature. Sie wurde durch den Quellleser und den Senkenschreiber ersetzt. Quellleser und Senkenschreiber wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit den Quellleser und senkenden Writer anstelle des Windows Media Format 11 SDK verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

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 innerhalb des Inhalts Namen zuzuweisen, diese Namen dem Benutzer anzuzeigen und dann nach den Markerpositionen zu suchen. Eine Anwendung kann Marker 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 Reader-Objekte 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 den Markernamen als Breitzeichenzeichenfolge und die Zeit in 100 Nanosekundeneinheiten an. Die Zeit darf die Dateidauer nicht überschreiten. Zwei Marker können dieselbe Zeit haben.

Im folgenden Beispiel werden einer Datei mehrere Marker hinzugefü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

Um einen Marker zu entfernen, rufen Sie IWMHeaderInfo::RemoveMarker auf, und geben Sie 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 beim Aufrufen von RemoveMarker die Indexnummern der 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:

  1. Rufen Sie die IWMHeaderInfo::GetMarkerCount-Methode auf, um zu bestimmen, wie viele Marker die Datei enthält.
  2. Rufen Sie die Größe der Zeichenfolge ab, die erforderlich ist, um den Markernamen zu enthalten. Rufen Sie hierzu die IWMHeaderInfo::GetMarker-Methode auf. Geben Sie den Index des abzurufenden Markers und NULL für den Zeichenfolgenpuffer (pwszMarkerName-Parameter ) an. Die -Methode gibt die Länge der Zeichenfolge zurück, einschließlich des beendenden Zeichens "\0" im pcchMarkerNameLen-Parameter .
  3. Ordnen Sie eine Breitzeichenzeichenfolge zu, um den Namen zu erhalten.
  4. Rufen Sie GetMarker erneut auf, übergeben Sie aber diesmal 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 durchläuft jeden Marker in der richtigen 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 einem Markerstandort aus zu starten, rufen Sie die IWMReaderAdvanced2::StartAtMarker-Methode des Leserobjekts auf, und geben Sie 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 gesucht.

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-Schnittstelle

IWMReaderAdvanced2::StartAtMarker

Arbeiten mit Metadaten