Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
[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:
- Wywołaj metodę IWMHeaderInfo::GetMarkerCount, aby określić, ile znaczników zawiera plik.
- 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.
- Przydziel ciąg o szerokim znaku, aby otrzymać nazwę.
- 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();
}
Tematy pokrewne