共用方式為


使用標記

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows Media Format 11 SDK。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

標記是 ASF 檔案內的具名點。 每個標記都包含名稱和相關聯的時間,以從檔案開頭的位移來測量。 應用程式可以使用標記將名稱指派給內容內的各種點、向使用者顯示這些名稱,然後搜尋標記位置。 應用程式可以從現有的 ASF 檔案新增或移除標記。

IWMHeaderInfo介面包含使用標記的方法。 中繼資料編輯器物件支援新增和移除標記。 寫入器和讀取器物件可以擷取標記,但無法加入或移除標記。

新增標記

若要新增標記,請查詢 IWMHeaderInfo 介面的中繼資料編輯器。 然後呼叫 IWMHeaderInfo::AddMarker 方法,將標記名稱指定為寬字元字串,並以 100 奈秒為單位的時間。 時間不得超過檔案持續時間。 兩個標記可以有相同的時間。

下列範例會將數個標記新增至檔案:

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

移除標記

若要移除標記,請呼叫 IWMHeaderInfo::RemoveMarker,並指定要移除的標記索引。 標記會以遞增的時間順序自動排序,因此索引 0 一律是第一個標記。 請注意,呼叫 RemoveMarker 會變更下列任何標記的索引編號。 下列程式碼,其中 pInfoIWMHeaderInfo 介面的指標,會移除檔案中的所有標記:

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

擷取標記

若要擷取標記的名稱和時間,請執行下列步驟:

  1. 呼叫 IWMHeaderInfo::GetMarkerCount 方法,以判斷檔案包含的標記數目。
  2. 擷取包含標記名稱所需的字串大小。 若要這樣做,請呼叫 IWMHeaderInfo::GetMarker 方法。 指定要擷取的標記索引,並在pwszMarkerName參數) (字串緩衝區的Null。 方法會傳回字串的長度,包括 pcchMarkerNameLen 參數中的終止 '\0' 字元。
  3. 配置寬字元字串以接收名稱。
  4. 再次呼叫 GetMarker ,但這次會傳遞 pwszMarkerName 參數中的字串位址。 方法會將標記名稱寫入字串中,並傳回 pcnsMarkerTime 參數中的標記時間。

下列程式碼會依序迴圈查看每個標記,並擷取名稱和時間:

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;

搜尋標記

若要從標記位置開始播放,請呼叫讀取器物件的 IWMReaderAdvanced2::StartAtMarker 方法,並指定標記的索引。 其餘參數與 IWMReader::Start 方法的參數相同。 下列範例會查詢讀取器是否有 IWMReaderAdvanced2 介面,並搜尋第一個標記。

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 介面

IWMReaderAdvanced2::StartAtMarker

使用中繼資料