Použití značek
[Funkce přidružená k této stránce, Windows Media Format 11 SDK, je starší funkce. Byla nahrazena čtečkou zdroje a zapisovače jímky. Čtečka zdroje a Zapisovač výstupu jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal čtečku zdroje a zapisovač výstupu místo Windows Media Format 11 SDK, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]
Značka je pojmenovaný bod v souboru ASF. Každá značka se skládá z názvu a přidruženého času měřeného jako posun od začátku souboru. Aplikace může pomocí značek přiřazovat názvy různým bodům v obsahu, zobrazovat tato jména uživateli a pak hledat pozice značek. Aplikace může přidat nebo odebrat značky z existujícího souboru ASF.
Rozhraní IWMHeaderInfo obsahuje metody pro práci se značkami. Objekt editoru metadat podporuje přidávání a odebírání značek. Objekty zapisovače a objekty čtečky mohou načítat značky, ale nemohou přidávat ani odebírat značky.
Přidání značek
Pokud chcete přidat značku, zadejte dotaz do editoru metadat pro rozhraní IWMHeaderInfo. Potom zavolejte metodu IWMHeaderInfo::AddMarker, přičemž zadejte název značky jako široký řetězec a čas vyjádřený v jednotkách 100 nanosekund. Doba nesmí překročit dobu trvání souboru. Dvě značky můžou mít stejný čas.
Následující příklad přidá do souboru několik značek:
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();
Odebrání značek
Pokud chcete odebrat značku, zavolejte IWMHeaderInfo::RemoveMarker, zadáním indexu značky, která se má odebrat. Značky se automaticky seřadí v rostoucím časovém pořadí, takže index 0 je vždy první značkou. Všimněte si, že volání RemoveMarker změní čísla indexů všech značek, které následují. Následující kód, kde pInfo je ukazatel na rozhraní IWMHeaderInfo, odebere všechny značky ze souboru:
WORD count = 0;
pInfo->GetMarkerCount(&count);
while (count--)
{
pInfo->RemoveMarker(0);
}
Načítání značek
Pokud chcete načíst název a čas značky, proveďte následující kroky:
- Zavolejte metodu IWMHeaderInfo::GetMarkerCount, aby se zjistilo, kolik značek soubor obsahuje.
- Načtěte velikost řetězce potřebného k zahrnutí názvu značky. Uděláte to tak, že zavoláte metodu IWMHeaderInfo::GetMarker. Zadejte index značky, která se má načíst, a NULL pro vyrovnávací paměť řetězce (parametr pwszMarkerName). Metoda vrátí délku řetězce včetně ukončujícího znaku '\0' v parametru pcchMarkerNameLen.
- Přidělte široký znakový řetězec pro příjem jména.
- Znovu volejte GetMarker, tentokrát ale předejte adresu řetězce v parametru pwszMarkerName. Metoda zapíše název značky do řetězce a vrátí čas značky v pcnsMarkerTime parametru.
Následující kód prochází každou značku v pořadí a načte název a čas:
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;
Hledání značky
Chcete-li zahájit přehrávání z umístění značky, zavolejte na objektu čtenáře metodu IWMReaderAdvanced2::StartAtMarker, která určuje index značky. Zbývající parametry jsou identické s těmi, které se používají pro metodu IWMReader::Start. Následující příklad dotazuje systém na rozhraní IWMReaderAdvanced2 a přechází na první značku.
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();
}
Související témata