共用方式為


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

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

WM ASF 讀取器 篩選器會處理 ASF 檔案的播放。 當 WM ASF 讀取器讀取檔案時,它會自動為每個資料流程建立輸出釘選,包括 Web 資料流程、指令碼命令資料流程,以及任何類型的任意資料流程。 如果是多個位元速率檔案,則只會針對目前選取的資料流程建立釘選。

WM ASF 讀取器支援 DirectShow IMediaSeeking 介面,可讓應用程式在檔案內執行時態搜尋。 不過,不支援在 IMediaSeeking::SetRate) 中指定的 1.0 (以外的速度播放。

此篩選器也會公開數個 Windows Media Format SDK 介面,如下表所述。

介面 公開方式 註解
IWMDRMReader 透過篩選上的 IServiceProvider 提供給需要播放受 Digital Rights Management 保護之內容的應用程式, (DRM) 。 此介面也可以用來直接取得讀取器物件上的其他介面。
IWMHeaderInfo 篩選上的 QueryInterface 提供 ,讓應用程式可以讀取檔案和內容屬性,以及標記和腳本資訊和中繼資料。
IWMReaderAdvanced 篩選上的 QueryInterface 在篩選上部分實作,讓應用程式可以存取 WM Reader 物件上的資訊方法。
IWMReaderAdvanced2 篩選上的 QueryInterface 在篩選上部分實作,讓應用程式可以存取 Reader 物件上的資訊方法。

 

WM ASF 讀取器篩選器最初是在 DirectShow 8.0 中提供。 DirectShow 8.1 和 9.0 隨附的篩選器版本支援 7 版。Windows Media Format SDK 的 x。 最新版的篩選器以及其他 QASF 元件隨附並支援 Windows Media Format 9 系列 SDK 和更新版本,並取代 DirectX 9.0 中的篩選器。 如果您在安裝 DirectX 8 之後安裝 Windows Media Format SDK。x 或 9。x SDK,您將使用 9 系列版本覆寫 qasf.dll 的 DirectX 版本。 除了可能會導致 DirectShow IGraphBuilder::RenderFile 方法發生不同行為的一個案例之外,這不應該顯示任何問題。 WM ASF 讀取器 Windows Media Format 9 Series SDK 版本是 .asf、.wmv 和 .wma 副檔名的預設來源篩選器。 這表示當指定此類型的檔案時,WM ASF 讀取器會在IGraphBuilder::RenderFile 或 IGraphBuilder::AddSourceFilter等方法中,由 Filter Graph 管理員自動建立並新增至篩選圖形。 在 DirectX 9.0 和更早版本中,以及 Windows XP Service Pack 1 和更早版本中, RenderFile 方法會使用較舊的 Windows 媒體來源篩選器。 此行為已維持,以確保與使用 Windows 媒體播放機 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 讀取器。