Dela via


Använda markörer

[Funktionen som är associerad med den här sidan, Windows Media Format 11 SDK, är en äldre funktion. Det har ersatts av Source Reader och Sink Writer. Source Reader och Sink Writer har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder Source Reader och Sink Writer i stället för Windows Media Format 11 SDK, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

En markör är en namngiven punkt i en ASF-fil. Varje markör består av ett namn och en tillhörande tid, mätt som en förskjutning från början av filen. Ett program kan använda markörer för att tilldela namn till olika punkter i innehållet, visa dessa namn för användaren och sedan söka efter markörpositionerna. Ett program kan lägga till eller ta bort markörer från en befintlig ASF-fil.

Gränssnittet IWMHeaderInfo innehåller metoder för att arbeta med markörer. Metadataredigerarens objekt har stöd för att lägga till och ta bort markörer. Skrivar- och läsarobjekten kan hämta markörer men kan inte lägga till eller ta bort markörer.

Lägga till markörer

Om du vill lägga till en markör frågar du metadataredigeraren efter gränssnittet IWMHeaderInfo. Anropa sedan metoden IWMHeaderInfo::AddMarker och ange markörnamnet som en sträng med brett tecken och tiden i 100 nanosekunder. Tiden får inte överskrida filvaraktigheten. Två markörer kan ha samma tid.

I följande exempel läggs flera markörer till i en fil:

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

Ta bort markörer

Om du vill ta bort en markör anropar du IWMHeaderInfo::RemoveMarkeroch anger indexet för markören som du vill ta bort. Markörer sorteras automatiskt i ökande tidsordning, så index 0 är alltid den första markören. Observera att om du anropar RemoveMarker ändras indexnumren för eventuella markörer som följer. Följande kod, där pInfo är en pekare till ett IWMHeaderInfo- gränssnitt, tar bort alla markörer från en fil:

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

Hämtar markörer

Utför följande steg för att hämta namnet och tiden för en markör:

  1. Anropa metoden IWMHeaderInfo::GetMarkerCount för att avgöra hur många markörer filen innehåller.
  2. Hämta storleken på strängen som behövs för att rymma markörens namn. Det gör du genom att anropa metoden IWMHeaderInfo::GetMarker. Ange indexet för markören som ska hämtas och NULL- för strängbufferten (parametern pwszMarkerName). Metoden returnerar längden på strängen, inklusive det avslutande tecknet \0, i parametern pcchMarkerNameLen.
  3. Allokera en sträng med breda tecken för att ta emot namnet.
  4. Anropa GetMarker igen, men skicka den här gången adressen till strängen i parametern pwszMarkerName. Metoden skriver markörnamnet i strängen och returnerar markörtiden i parametern pcnsMarkerTime.

Följande kod loopar igenom varje markör i ordning och hämtar namn och tid:

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;

Söker till en markör

Om du vill starta uppspelningen från en markörplats anropar du läsarobjektets IWMReaderAdvanced2::StartAtMarker-metoden och anger indexet för markören. De återstående parametrarna är identiska med dem för metoden IWMReader::Start. I följande exempel frågar läsaren efter IWMReaderAdvanced2-gränssnittet och söker till den första markören.

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-gränssnitt

IWMReaderAdvanced2::StartAtMarker

Arbeta med metadata