[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 Source Reader 和 Sink Writer已經取代了它。 來源讀取器 和 接收寫入器 已針對 Windows 10 和 Windows 11 優化。 Microsoft強烈建議新程式碼盡可能使用 來源讀取器 和 匯出寫入器,而非 Windows Media Format 11 SDK。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
ASF 檔案的播放是由 WM ASF 讀取器 篩選器處理。 當 WM ASF 讀取器讀取檔案時,它會自動為每個數據流建立輸出釘選,包括 Web 數據流、腳本命令數據流,以及任何其他類型的任意數據流。 如果是多種位元率檔案,則只會針對目前選取的數據流建立端點。
WM ASF 讀取器支援 DirectShow IMediaSeeking 介面,讓應用程式能夠在檔案內執行時態搜尋。 不過,不支援以 1.0 以外的速度播放(如 IMediaSeeking::SetRate中所指定)。
此篩選器也會公開數個 Windows Media Format SDK 介面,如下表所述。
介面 | 暴露程度 | 評論 |
---|---|---|
IWMDRMReader | 透過篩選上的 IServiceProvider | 提供給需要播放受數位版權管理 (DRM) 保護之內容的應用程式。 這個介面也可以用來直接取得讀取器物件上的其他介面。 |
IWMHeaderInfo | 在篩選器上 QueryInterface | 提供以便應用程式可以讀取檔案和內容屬性,以及標記、腳本資訊和其他元數據。 |
IWMReaderAdvanced | 在篩選條件上使用 QueryInterface | 部分實作在篩選上,讓應用程式可以存取 WM Reader 物件上的資訊方法。 |
IWMReaderAdvanced2 | 篩選時 QueryInterface | 已在篩選器上進行部分實作,以允許應用程式存取讀取器物件上的資訊方法。 |
WM ASF 讀取器 篩選器首次在 DirectShow 8.0 中提供。 DirectShow 8.1 和 9.0 隨附的篩選器版本支援 Windows Media Format SDK 的 7.x 版。 最新的篩選版本,以及其他 QASF 元件,隨附並支援 Windows Media Format 9 Series SDK 和更新版本,並取代 DirectX 9.0 中的篩選。 如果您在安裝 DirectX 8x 或 9x SDK 之後安裝 Windows Media Format SDK,您將用 9 系列版本覆寫 DirectX 版本的 qasf.dll。 這不應該產生任何問題,只是可能在某個情況下會導致 DirectShow IGraphBuilder::RenderFile 方法中出現不同的行為。 WM ASF 讀取器之 Windows Media Format 9 Series SDK 版本是.asf、.wmv和.wma擴展名的預設來源篩選。 這表示當指定此類型檔案時,WM ASF 讀取器會自動建立並新增至篩選器圖形,由篩選圖形管理員透過 IGraphBuilder::RenderFile 或 IGraphBuilder::AddSourceFilter 等方法實現。 在 DirectX 9.0 和更早版本中,以及 Windows XP Service Pack 1 和更早版本中,RenderFile 方法會使用較舊的 Windows 媒體來源篩選。 此行為已維持,以確保與使用 Windows Media Player 6.4 的應用程式向後相容性。 如需舊版 Windows 媒體來源篩選的詳細資訊,請參閱 DirectShow SDK 檔。
若要使用 WM ASF 讀取器搭配 Windows Media 型內容播放 ASF 檔案,三個主要步驟是建立 Filter Graph 管理員的實例、呼叫 IGraphBuilder::RenderFile 以建立圖形,然後呼叫 IMediaControl::Run 播放檔案。 下列程式代碼範例是使用 DirectShow 播放 ASF 檔案的完整程式。 若要執行此範例,您必須安裝 DirectX SDK,且您的組建環境必須根據 DirectShow SDK 檔案主題「設定組建環境」中的指示進行設定。此外,您必須在呼叫 RenderFile中指定電腦上的檔案。
#include <dshow.h>
#include <stdio.h>
void main(void)
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return;
}
// Create the Filter Graph Manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// Build the graph. IMPORTANT: Change this string to a file
// on your system.
hr = pGraph->RenderFile(L"test.wmv", NULL);
if (SUCCEEDED(hr))
{
// Run the graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// Note: Do not use INFINITE in a real application, because it
// can block indefinitely.
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
請注意,這個簡單範例的應用程式程式代碼絕不會特別參考 WM ASF 讀取器。 濾鏡是由篩選圖形管理員建立、連接、執行,並最終釋放的。 不過,在許多情況下,您可能想要在開始播放之前設定WM ASF讀取器。