Чтение файлов 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 перед началом воспроизведения.