[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 資料來源讀取器 和 匯出器已取代它。 來源讀取器 和 接收寫入器 已針對 Windows 10 和 Windows 11 優化。 Microsoft強烈建議新程式碼盡可能使用 Source Reader 和 Sink Writer,而不是 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 會變更下列任何標記的索引編號。 下列程式代碼中,pInfo 是指向 IWMHeaderInfo 介面的指標,會移除檔案中的所有標記:
WORD count = 0;
pInfo->GetMarkerCount(&count);
while (count--)
{
pInfo->RemoveMarker(0);
}
擷取標記
若要擷取標記的名稱和時間,請執行下列步驟:
- 呼叫 IWMHeaderInfo::GetMarkerCount 方法來判斷檔案包含多少標記。
- 擷取包含標記名稱所需的字串大小。 若要這樣做,請呼叫 IWMHeaderInfo::GetMarker 方法。 指定要擷取的標記索引,並針對字串緩衝區 NULL(pwszMarkerName 參數)。 方法會傳回字串長度,包括終止的 '\0' 字符,於 pcchMarkerNameLen 參數。
- 配置寬字元字串以接收名稱。
- 再次呼叫 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();
}
相關主題