共用方式為


在 DirectShow 中讀取 ASF 檔案 (Windows Media Format 11 SDK)

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 Source ReaderSink 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::RenderFileIGraphBuilder::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讀取器。