使用標記
[與此頁面相關聯的功能 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 會變更下列任何標記的索引編號。 下列程式碼,其中 pInfo 是 IWMHeaderInfo 介面的指標,會移除檔案中的所有標記:
WORD count = 0;
pInfo->GetMarkerCount(&count);
while (count--)
{
pInfo->RemoveMarker(0);
}
擷取標記
若要擷取標記的名稱和時間,請執行下列步驟:
- 呼叫 IWMHeaderInfo::GetMarkerCount 方法,以判斷檔案包含的標記數目。
- 擷取包含標記名稱所需的字串大小。 若要這樣做,請呼叫 IWMHeaderInfo::GetMarker 方法。 指定要擷取的標記索引,並在pwszMarkerName參數) (字串緩衝區的Null。 方法會傳回字串的長度,包括 pcchMarkerNameLen 參數中的終止 '\0' 字元。
- 配置寬字元字串以接收名稱。
- 再次呼叫 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();
}
相關主題