Udostępnij przez


Używanie znaczników

[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez czytnik źródła i zapisujący sink . czytnik źródeł i zapis ujścia zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał Source Reader i Sink Writer zamiast Windows Media Format 11 SDK, jeśli jest to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Znacznik jest nazwanym punktem w pliku ASF. Każdy znacznik składa się z nazwy oraz czasu, który jest mierzony jako przesunięcie od początku pliku. Aplikacja może użyć znaczników, aby przypisać nazwy do różnych punktów w zawartości, wyświetlić te nazwy użytkownikowi, a następnie wyszukać pozycje znacznika. Aplikacja może dodawać lub usuwać znaczniki z istniejącego pliku ASF.

Interfejs IWMHeaderInfo zawiera metody pracy ze znacznikami. Obiekt edytora metadanych obsługuje dodawanie i usuwanie znaczników. Obiekty zapisywania i czytnika mogą pobierać znaczniki, ale nie mogą dodawać ani usuwać znaczników.

Dodawanie znaczników

Aby dodać znacznik, zapytaj edytora metadanych o interfejs IWMHeaderInfo. Następnie wywołaj metodę IWMHeaderInfo::AddMarker, określając nazwę znacznika jako ciąg wieloznaczny i czas w jednostkach 100-nanosekundowych. Czas nie może przekraczać czasu trwania pliku. Dwa znaczniki mogą mieć ten sam czas.

Poniższy przykład dodaje kilka znaczników do pliku:

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

Usuwanie znaczników

Aby usunąć znacznik, wywołaj metodę IWMHeaderInfo::RemoveMarker, określając indeks znacznika do usunięcia. Znaczniki są automatycznie sortowane w kolejności rosnącej czasu, więc indeks 0 jest zawsze pierwszym znacznikiem. Należy pamiętać, że wywoływanie RemoveMarker zmienia numery indeksów wszystkich znaczników, które następują po nich. Poniższy kod, w którym pInfo jest wskaźnikiem do interfejsu IWMHeaderInfo, usuwa wszystkie znaczniki z pliku:

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

Pobieranie znaczników

Aby pobrać nazwę i godzinę znacznika, wykonaj następujące kroki:

  1. Wywołaj metodę IWMHeaderInfo::GetMarkerCount, aby określić, ile znaczników zawiera plik.
  2. Pobierz rozmiar ciągu potrzebnego do przechowywania nazwy znacznika. W tym celu wywołaj metodę IWMHeaderInfo::GetMarker. Określ indeks znacznika do pobrania, a NULL dla buforu ciągu (parametr pwszMarkerName). Metoda zwraca długość ciągu, w tym znak zakończenia "\0" w pcchMarkerNameLen parametru.
  3. Przydziel ciąg o szerokim znaku, aby otrzymać nazwę.
  4. Wywołaj GetMarker ponownie, ale tym razem przekaż adres ciągu w parametrze pwszMarkerName. Metoda zapisuje nazwę znacznika w ciągu i zwraca czas znacznika w parametrze pcnsMarkerTime.

Poniższy kod wykonuje pętlę przez każdy znacznik w kolejności i pobiera nazwę i godzinę:

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;

Poszukiwanie znacznika

Aby rozpocząć odtwarzanie z lokalizacji znacznika, wywołaj obiektu czytnika IWMReaderAdvanced2::StartAtMarker metodę, określając indeks znacznika. Pozostałe parametry są identyczne z tymi dla metody IWMReader::Start. Poniższy przykład pyta czytelnika o interfejs IWMReaderAdvanced2 i przechodzi do pierwszego znacznika.

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

Interfejs IWMHeaderInfo

IWMReaderAdvanced2::StartAtMarker

Praca z metadanymi