Aracılığıyla paylaş


İşaretçileri Kullanma

[Windows Media Format 11 SDK bu sayfayla ilişkilendirilmiş özellik eski bir özelliktir. Kaynak Okuyucu ve Sink Yazıcısıtarafından değiştirildi. Kaynak Okuyucu ve Havuz Yazıcısı Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, yeni kodun mümkün olduğunda Source Reader ve Sink Writer yerine Windows Media Format 11 SDKkullanmasını kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]

işaretçisi, ASF dosyasındaki adlandırılmış bir noktadır. Her işaretçi, dosyanın başından uzaklık olarak ölçülen bir ad ve ilişkili bir süreden oluşur. Uygulama, içerik içindeki çeşitli noktalara ad atamak, bu adları kullanıcıya görüntülemek ve sonra işaretçi konumlarını aramak için işaretçileri kullanabilir. Bir uygulama, var olan bir ASF dosyasına işaretçi ekleyebilir veya bu dosyadan işaretçileri kaldırabilir.

IWMHeaderInfo arabirimi, işaretçilerle çalışmaya yönelik yöntemler içerir. Meta veri düzenleyicisi nesnesi, işaretçilerin eklenmesini ve kaldırılmasını destekler. Yazıcı ve okuyucu nesneleri işaretçileri alabilir, ancak işaretçi ekleyemez veya kaldıramaz.

İşaretleyiciler Eklemek

İşaretçi eklemek için IWMHeaderInfo arabirimi için meta veri düzenleyicisini sorgulayın. Ardından IWMHeaderInfo::AddMarker yöntemini çağırın ve işaretçi adını geniş karakterli bir dize olarak ve saati 100 nanosaniye cinsinden belirtin. Süre dosya süresini aşmamalıdır. İki işaretçi aynı zamana sahip olabilir.

Aşağıdaki örnek bir dosyaya birkaç işaretçi ekler:

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

İşaretçileri Kaldırma

İşaretçiyi kaldırmak için, kaldırılacak işaretçinin dizinini belirterek IWMHeaderInfo::RemoveMarkerçağrısı yapın. İşaretçiler otomatik olarak artan zaman sırasına göre sıralanır, bu nedenle dizin 0 her zaman ilk işaretçidir. RemoveMarker çağrısının, izleyen tüm işaretçilerin dizin numaralarını değiştirdiğini unutmayın. pInfo, IWMHeaderInfo arabiriminin göstericisi olduğu aşağıdaki kod, dosyadaki tüm işaretleri kaldırır:

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

İşaretçileri Alma

İşaretçinin adını ve saatini almak için aşağıdaki adımları gerçekleştirin:

  1. Dosyanın kaç işaretçi içerdiğini belirlemek için IWMHeaderInfo::GetMarkerCount yöntemini çağırın.
  2. İşaretçi adını içermesi için gereken dizenin boyutunu alın. Bunu yapmak için IWMHeaderInfo::GetMarker yöntemini çağırın. Alınacak işaretçinin dizinini belirtin ve dize arabelleği için NULL ( pwszMarkerName parametresi). yöntemi, pcchMarkerNameLen parametresinde sonlandırıcı '\0' karakteri de dahil olmak üzere dizenin uzunluğunu döndürür.
  3. Adı almak için geniş karakterli bir dize ayarlayın.
  4. GetMarker yeniden çağırın, ancak bu kez pwszMarkerName parametresindeki dizenin adresini geçirin. yöntemi, işaretçi adını dizeye yazar ve pcnsMarkerTime parametresinde işaretçi süresini döndürür.

Aşağıdaki kod, her bir işaretçiyi sırasıyla döngüye sokar ve adını ve zaman bilgisini alır.

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;

Bir İşaretçiye Yönelme

İşaretçi konumundan oynatmayı başlatmak için, işaretçinin dizinini belirtip okuyucu nesnesi üzerinden IWMReaderAdvanced2::StartAtMarker yöntemini çağırın. Kalan parametreler IWMReader::Start yöntemiyle aynıdır. Aşağıdaki örnek, IWMReaderAdvanced2 arabirimi için okuyucuyu sorgular ve ilk işaretçiyi arar.

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 Arayüzü

IWMReaderAdvanced2::StartAtMarker

Meta Veri ile Çalışma