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


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

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

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

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

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

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

 

Фильтр чтения WM ASF был впервые доступен в 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 . Версия пакета SDK для windows Media Format 9 для средства чтения WM ASF является фильтром по умолчанию для расширений имен файлов ASF, WMV и WMA. Это означает, что средство чтения WM ASF автоматически создается и добавляется в граф фильтра диспетчером графов фильтров в таких методах, как IGraphBuilder::RenderFile или IGraphBuilder::AddSourceFilter , когда указан файл этого типа. В DirectX 9.0 и более ранних версиях, а также Windows XP с пакетом обновления 1 (SP1) и более ранних версиях метод RenderFile использует старый фильтр источника Windows Media. Это поведение было сохранено для обеспечения обратной совместимости с приложениями, которые использовали Медиаплеер Windows 6.4. Дополнительные сведения о устаревшем фильтре источника Windows Media см. в документации по пакету SDK DirectShow.

Чтобы воспроизвести ASF-файл с содержимым на основе Windows Media с помощью средства чтения WM ASF, необходимо создать экземпляр диспетчера graph filter, вызвать 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. Этот фильтр создается, подключается, запускается и в конечном итоге освобождается диспетчером фильтров Graph. Однако во многих сценариях может потребоваться настроить средство чтения WM ASF перед началом воспроизведения.