Bagikan melalui


Menggunakan Penanda

[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Penanda adalah titik bernama dalam file ASF. Setiap penanda terdiri dari nama dan waktu terkait, diukur sebagai offset dari awal file. Aplikasi dapat menggunakan penanda untuk menetapkan nama ke berbagai titik dalam konten, menampilkan nama tersebut kepada pengguna, lalu mencari posisi penanda. Aplikasi dapat menambahkan atau menghapus penanda dari file ASF yang ada.

Antarmuka IWMHeaderInfo berisi metode untuk bekerja dengan penanda. Objek editor metadata mendukung penambahan dan penghapusan penanda. Objek penulis dan pembaca dapat mengambil penanda tetapi tidak dapat menambahkan atau menghapus penanda.

Menambahkan Penanda

Untuk menambahkan penanda, kueri editor metadata untuk antarmuka IWMHeaderInfo . Kemudian panggil metode IWMHeaderInfo::AddMarker , yang menentukan nama penanda sebagai string karakter lebar dan waktu dalam unit 100 nanodetik. Waktu tidak boleh melebihi durasi file. Dua penanda dapat memiliki waktu yang sama.

Contoh berikut menambahkan beberapa penanda ke file:

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

Menghapus Penanda

Untuk menghapus penanda, panggil IWMHeaderInfo::RemoveMarker, yang menentukan indeks penanda yang akan dihapus. Penanda secara otomatis diurutkan dalam urutan waktu yang meningkat, sehingga indeks 0 selalu menjadi penanda pertama. Perhatikan bahwa memanggil RemoveMarker mengubah nomor indeks penanda apa pun yang mengikuti. Kode berikut, di mana pInfo adalah penunjuk ke antarmuka IWMHeaderInfo , menghapus semua penanda dari file:

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

Mengambil Penanda

Untuk mengambil nama dan waktu penanda, lakukan langkah-langkah berikut:

  1. Panggil metode IWMHeaderInfo::GetMarkerCount untuk menentukan berapa banyak penanda yang dikandung file.
  2. Ambil ukuran string yang diperlukan untuk berisi nama penanda. Untuk melakukannya, panggil metode IWMHeaderInfo::GetMarker . Tentukan indeks penanda yang akan diambil, dan NULL untuk buffer string (parameter pwszMarkerName ). Metode mengembalikan panjang string, termasuk karakter '\0' yang mengakhiri, dalam parameter pcchMarkerNameLen .
  3. Alokasikan string karakter lebar untuk menerima nama.
  4. Panggil GetMarker lagi, tetapi kali ini berikan alamat string dalam parameter pwszMarkerName . Metode menulis nama penanda ke dalam string, dan mengembalikan waktu penanda dalam parameter pcnsMarkerTime .

Kode berikut mengulang setiap penanda secara berurutan dan mengambil nama dan waktu:

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;

Mencari Penanda

Untuk memulai pemutaran dari lokasi penanda, panggil metode IWMReaderAdvanced2::StartAtMarker objek pembaca, yang menentukan indeks penanda. Parameter yang tersisa identik dengan parameter untuk metode IWMReader::Start . Contoh berikut meminta pembaca untuk antarmuka IWMReaderAdvanced2 dan mencari penanda pertama.

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

Antarmuka IWMHeaderInfo

IWMReaderAdvanced2::StartAtMarker

Bekerja dengan Metadata