Delen via


Markeringen gebruiken

[De functie die is gekoppeld aan deze pagina, Windows Media Format 11 SDK, is een verouderde functie. Het is vervangen door Source Reader en Sink Writer. Bronlezer en Sink Writer zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken bronlezer en Sink Writer- in plaats van Windows Media Format 11 SDK, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Een markering is een benoemd punt in een ASF-bestand. Elke markering bestaat uit een naam en een bijbehorende tijd, gemeten als een verschuiving vanaf het begin van het bestand. Een toepassing kan markeringen gebruiken om namen toe te wijzen aan verschillende punten binnen de inhoud, deze namen weer te geven aan de gebruiker en vervolgens naar de markeringsposities te zoeken. Een toepassing kan markeringen toevoegen aan of verwijderen uit een bestaand ASF-bestand.

De interface IWMHeaderInfo bevat methoden voor het werken met markeringen. Het object metagegevenseditor ondersteunt het toevoegen en verwijderen van markeringen. De schrijf- en lezerobjecten kunnen markeringen ophalen, maar kunnen geen markeringen toevoegen of verwijderen.

Markeringen toevoegen

Als u een markering wilt toevoegen, voert u een query uit in de metagegevenseditor voor de IWMHeaderInfo interface. Roep vervolgens de methode IWMHeaderInfo::AddMarker aan, waarbij de markeringsnaam wordt opgegeven als een tekenreeks met een breed teken en de tijd in eenheden van 100 nanoseconden. De tijd mag niet langer zijn dan de duur van het bestand. Twee markeringen kunnen dezelfde tijd hebben.

In het volgende voorbeeld worden verschillende markeringen aan een bestand toegevoegd:

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

Markeringen verwijderen

Als u een markering wilt verwijderen, roept u IWMHeaderInfo::RemoveMarkeraan, waarbij u de index van de markering opgeeft die u wilt verwijderen. Markeringen worden automatisch gesorteerd in toenemende tijdsvolgorde, dus index 0 is altijd de eerste markering. Houd er rekening mee dat het aanroepen van RemoveMarker de indexnummers wijzigt van markeringen die volgen. De volgende code, waarbij pInfo een aanwijzer is naar een IWMHeaderInfo interface, verwijdert u alle markeringen uit een bestand:

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

Markeringen ophalen

Voer de volgende stappen uit om de naam en tijd van een markering op te halen:

  1. Roep de methode IWMHeaderInfo::GetMarkerCount aan om te bepalen hoeveel markeringen het bestand bevat.
  2. Haal de lengte van de tekenreeks op die nodig is om de naam van de markering te bevatten. Hiervoor roept u de methode IWMHeaderInfo::GetMarker aan. Geef de index van de markering op die moet worden opgehaald en NULL voor de tekenreeksbuffer (de parameter pwszMarkerName). De methode retourneert de lengte van de tekenreeks, inclusief het afsluitteken \0, in de parameter pcchMarkerNameLen.
  3. Wijs een tekenreeks voor breed teken toe om de naam te ontvangen.
  4. Roep GetMarker opnieuw aan, maar deze keer geeft u het adres van de tekenreeks door in de parameter pwszMarkerName. De methode schrijft de naam van de markering in de tekenreeks en retourneert de tijd van de markering in de parameter pcnsMarkerTime.

Met de volgende code wordt elke markering op volgorde doorlopen en wordt de naam en tijd opgehaald:

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;

Op zoek naar een markering

Als u het afspelen vanaf een markeringslocatie wilt starten, roept u de IWMReaderAdvanced2::StartAtMarker methode aan, waarbij u de index van de markering opgeeft. De resterende parameters zijn identiek aan de parameters voor de methode IWMReader::Start. In het volgende voorbeeld wordt de lezer gevraagd naar de IWMReaderAdvanced2 interface en wordt er gezocht naar de eerste markering.

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

Werken met metagegevens