在 DirectShow (中讀取 ASF 檔案 Windows 媒體格式 11 SDK)

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

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

篩選準則也會公開數個 Windows 媒體格式 SDK 介面,如下表所述。

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

WM ASF 讀取器」篩選器先在 DirectShow 8.0 中提供。 DirectShow 8.1 和9.0 隨附的篩選版本支援第7版。Windows 媒體格式 SDK x 。 最新版本的篩選器和其他 QASF 元件隨附于,並支援 Windows 媒體格式9系列 SDK 和更新版本,並取代 DirectX 9.0 中的篩選器。 如果您在安裝 DirectX 8 之後安裝 Windows 媒體格式 SDK。x 或9。x SDK,您將會以9系列版本覆寫 qasf.dll 的 DirectX 版本。 這應該不會呈現任何問題,但可能在某個情況下,可能會在 DirectShow IGraphBuilder:: RenderFile 方法中造成不同的行為。 「WM asf 讀取器」 Windows 媒體格式9系列 SDK 版本是 .asf、.wmv 和 .wma 副檔名的預設來源篩選器。 這表示,當指定了這個類型的檔案時,會在 IGraphBuilder:: RenderFileIGraphBuilder:: AddSourceFilter 這類方法中,透過篩選 Graph 管理員,自動建立並加入至篩選圖形中的 WM ASF 讀取器。 在 DirectX 9.0 及更早版本中,以及 Windows XP Service Pack 1 及更早版本中, RenderFile 方法會使用較舊的 Windows 媒體來源篩選器。 維護此行為的目的,是為了確保與使用 Windows Media Player 6.4 的應用程式回溯相容。 如需舊版 Windows 媒體來源篩選器的詳細資訊,請參閱 DirectShow SDK 檔。

若要使用以 WM asf 讀取器 Windows 媒體內容來播放 ASF 檔案,三個主要步驟是建立篩選 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 讀取器。 篩選準則會建立、連線、執行,而且最終會由篩選 Graph 管理員釋放。 不過,在許多情況下,您可能會想要先設定 WM ASF 讀取器,再開始播放。