Поделиться через


Чтение файлов ASF в DirectShow (пакет SDK для формата Windows Media 11)

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей. Он был заменен источником чтения и приемником записи . средства чтения источников и записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код средства чтения исходного кода и записи приемников вместо пакета SDK для Windows Media 11, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Воспроизведение файлов ASF осуществляется фильтром средства чтения WM ASF . Когда средство чтения WM ASF считывает файл, он автоматически создает выходной пин-код для каждого потока, включая веб-потоки, потоки команд скрипта и любой другой тип произвольного потока. В случае с несколькими файлами с битрейтом пины создаются только для выбранных в данный момент потоков.

Средство чтения WM ASF поддерживает интерфейс DirectShow IMediaSeeking, который позволяет приложениям выполнять временный поиск в файле. Однако воспроизведение на скоростях, отличных от 1.0 (как указано в IMediaSeeking::SetRate) не поддерживается.

Фильтр также предоставляет несколько интерфейсов пакета SDK для формата Windows Media, как описано в следующей таблице.

Интерфейс Насколько подвергнуто воздействию Комментарии
IWMDRMReader С помощью IServiceProvider для фильтрации Предоставляется для приложений, которые должны воспроизводить содержимое, защищенное цифровым управлением правами (DRM). Этот интерфейс также можно использовать для получения других интерфейсов на объекте Reader.
IWMHeaderInfo QueryInterface в фильтре Предоставлено, чтобы приложения могли считывать атрибуты файла и содержимого, а также сведения о маркерах и скриптах и метаданных.
IWMReaderAdvanced QueryInterface в фильтре Частично реализовано в фильтре, чтобы приложения могли получить доступ к информационным методам в объекте WM Reader.
IWMReaderAdvanced2 QueryInterface в фильтре Частичная реализация в фильтре позволяет приложениям получить доступ к информационным методам объекта Reader.

 

Фильтр WM ASF Reader был впервые предоставлен в DirectShow 8.0. Версия фильтра, которая поставляется с DirectShow 8.1 и 9.0, поддерживает версию 7.x пакета SDK для формата Windows Media. Последняя версия фильтра, а также другие компоненты QASF, поставляется с пакетом SDK для windows Media Format 9 и более поздних версий, а также заменяет фильтр в DirectX 9.0. Если установить пакет SDK для формата Windows Media после установки DirectX 8.x или 9.x SDK вы перезапишете версию DirectX qasf.dll с версией серии 9. Это не должно представлять никаких проблем, кроме того, возможно, в одном сценарии, где это приведет к различным действиям в методе DirectShow IGraphBuilder::RenderFile. Версия средства чтения WM ASF из пакета SDK для Windows Media Format 9 Series — это фильтр источника по умолчанию для расширений файлов .asf, .wmv и .wma. Это означает, что средство чтения WM ASF автоматически создается и добавляется в граф фильтра диспетчером графов фильтров в таких методах, как IGraphBuilder::RenderFile или IGraphBuilder::AddSourceFilter при указании файла этого типа. В DirectX 9.0 и более ранних версиях и Windows XP с пакетом обновления 1 и более ранних версий метод RenderFile использует старый фильтр источника Windows Media. Это поведение поддерживается для обеспечения обратной совместимости с приложениями, которые использовали проигрыватель Windows Media 6.4. Дополнительные сведения о устаревшем фильтре источников Windows Media см. в документации по пакету SDK DirectShow.

Чтобы воспроизвести ASF-файл с содержимым на основе Windows Media с помощью средства чтения WM ASF, необходимо создать экземпляр диспетчера графов фильтров, вызвать IGraphBuilder::RenderFile, чтобы создать граф, а затем вызвать IMediaControl::Run для воспроизведения файла. В следующем примере кода показана полная программа, которая воспроизводит ASF-файл с помощью DirectShow. Чтобы запустить этот пример, необходимо установить пакет SDK DirectX, а среда сборки должна быть настроена в соответствии с инструкциями в разделе документации по пакету SDK DirectShow "Настройка среды сборки". Кроме того, необходимо указать файл на компьютере в вызове 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 перед началом воспроизведения.