Источник мультимедиа ASF

Media Foundation предоставляет источник мультимедиа ASF, который приложение может использовать для представления ASF-файла на уровне конвейера архитектуры.

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

Источник мультимедиа ASF реализует интерфейс IMFMediaSource , который является универсальным интерфейсом для источников мультимедиа в Media Foundation. Как и любой другой источник мультимедиа, источник мультимедиа ASF предоставляет дескриптор презентации, который в основном описывает объект заголовка ASF. Кроме того, источник мультимедиа ASF предоставляет дескрипторы потоков, представляющие каждый поток в содержимом мультимедиа. Дополнительные сведения см. в разделе "Структура файлов ASF".

Создание источника мультимедиа ASF

Чтобы создать источник мультимедиа ASF, приложение должно использовать сопоставитель исходного кода. Чтобы создать источник мультимедиа ASF, приложение должно предоставить источник, для которого сопоставитель источника создает источник мультимедиа ASF. Исходные сведения должны быть предоставлены путем указания URL-адреса исходного файла или потока байтов, содержащего носитель. Если приложение решит создать источник мультимедиа ASF, указав URL-адрес, он должен вызвать МЕТОД IMFSourceResolver::CreateObjectFromURL для синхронной операции или IMFSourceResolver::Begin... EndCreateObjectFromURL для асинхронной операции. Процесс создания источника мультимедиа из потока байтов аналогичен. Приложение должно вызвать IMFSourceResolver::CreateObjectFromByteStream для синхронной операции или IMFSourceResolver::Begin... EndCreateObjectFromBytestream для асинхронной операции. Эти вызовы должны указывать MF_RESOLUTION_MEDIASOURCE в параметре dwFlags . Дополнительные сведения об использовании этого флага см. в разделе "Использование сопоставителя источника".

Если приложение указывает URL-адрес для локального файла, строка URL-адреса может содержать путь к файлу мультимедиа или иметь префикс "file: "scheme. Расширение имени файла должно иметь формат ".asf", ".wm", L.wma" или ".wmv". Для ASF-файла в сети сопоставитель источника создает сетевой источник, который использует источник мультимедиа ASF.

В процессе создания объекта сопоставитель источника ищет список обработчиков схем и обработчиков потока байтов в системном реестре и загружает ближайший соответствующий обработчик, который может анализировать содержимое мультимедиа, а также создавать исходный объект мультимедиа под ним. Независимо от метода, используемого для создания источника мультимедиа (URL-адреса и потока байтов), сопоставитель источника создает поток байтов и считывает содержимое исходного носителя в поток байтов. Дополнительные сведения см. в разделе Обработчики схем и обработчики Byte-Stream.

Пример кода о том, как создать источник мультимедиа, см. в разделе "Использование сопоставителя исходного кода".

Настройка Параметры для источника мультимедиа ASF

Исходный сопоставитель запрашивает возможности базового потока байтов и определяет, что операции разрешены в только что созданном источнике мультимедиа. Одной из таких возможностей является поиск. Если операция поиска разрешена, приложение может указать режим поиска, который источник мультимедиа использует при поиске определенной точки в презентации.

Приложение может задать режим поиска для используемого источника мультимедиа во время создания объекта. После создания источника мультимедиа ASF с указанным режимом поиска его нельзя изменить в источнике мультимедиа или динамически изменить во время презентации. Параметры поиска указываются как свойства в вызове приложения к соответствующим методам сопоставителя источников, которые используются для создания источника мультимедиа. Эти наборы свойств задаются в хранилище свойств и передаются в параметр pProps . Если эти свойства не передаются, исходные функции мультимедиа с параметрами по умолчанию. Дополнительные сведения о настройке этих свойств см. в разделе "Настройка источника мультимедиа".

Если поиск разрешен, источник мультимедиа ASF поддерживает следующие режимы поиска:

  • Точный поиск: в этом режиме источник мультимедиа ASF использует объект индекса ASF файла ASF. Если файл не имеет объекта index, то точный поиск отключен, а один из других режимов используется в зависимости от свойств, заданных приложением в источнике мультимедиа.
  • Приблизительный поиск. Этот режим запрашивается приложением путем передачи MFPKEY_ASFMediaSource_ApproxSeek в хранилище свойств соответствующим методам сопоставителя источника. Однако приблизительное поиск используется только в том случае, если поток байтов не поддерживает поиск на основе времени. В этом режиме источник мультимедиа определяет время начала, относительно близкое к времени поиска. Если файл ASF содержит объект индекса ASF, он используется для вычисления времени начала. Приблизительный поиск менее точный, но быстрее, чем точный поиск, так как время, затраченное на отрисовку первого образца в предопределенное время начала, выполняется быстрее.
  • Итеративный поиск: чтобы задать этот режим, приложение должно задать свойство MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex . Итеративный поиск — это алгоритм для поиска позиции в ASF-файле, который не содержит объекта индекса ASF. В этом режиме источник мультимедиа определяет приблизительную оценку точки поиска, считывая смещение потока байтов. Он использует ряд приближений, основанный на средней скорости бита, для постепенного приближения к целевому времени поиска. (Алгоритм аналогичен двоичному поиску.) Итеративный поиск может занять больше времени, чем поиск с помощью объекта Index, поэтому он отключен по умолчанию. Если задать это свойство, используйте следующие свойства, чтобы задать параметры поиска: MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Эти свойства задают максимальное количество итераций и допустимости соответственно. Алгоритм останавливается при достижении максимального числа итераций или при обнаружении пакета, расстояние от времени поиска которого находится в пределах указанной допустимости.

В кратком окне приложение может выбрать приблизительный или итеративный поиск, если ASF-файл не содержит объект индекса ASF.

Объектная модель источника мультимедиа ASF

Источник мультимедиа ASF реализует интерфейс IMFMediaSource и предоставляет следующие интерфейсы. Приложение может получить ссылку на эти интерфейсы, вызвав IMFMediaSource::QueryInterface в источнике мультимедиа ASF.

Интерфейс Описание
IMFMediaSource Требуется для всех источников мультимедиа.
IMFMediaEventGenerator Требуется для всех источников мультимедиа. Позволяет приложениям получать события из источника мультимедиа через сеанс мультимедиа.
IMFGetService Запрашивает источник мультимедиа для указанного интерфейса службы.
IPropertyStore Задает и получает свойства в источнике мультимедиа. Каждое свойство содержит описательное имя и значение.
IMFMetadata Описывает метаданные файла ASF.
IMFMetadataProvider Извлекает коллекцию метаданных для всей презентации или для одного потока в презентации.
IMFRateSupport Запрашивает диапазон поддерживаемых скоростей воспроизведения, включая обратное воспроизведение.
IMFRateControl Возвращает или задает частоту воспроизведения.
IMFTrustedInput Возвращает ITA для каждого потока ASF, содержащегося в источнике.
IMFPMPClient Позволяет источнику мультимедиа получать указатель на интерфейс IMFPMPHost , который используется для создания объектов в процессе PMP.
IMFTimecodeTranslate Преобразуется между кодами времени общества кино- и телевизионных инженеров (SMPTE) и 100-наносекундными единицами времени.

 

Исходные службы мультимедиа ASF

Источник мультимедиа ASF предоставляет различные службы, для которых ограничен файл ASF. Чтобы получить указатель на определенную службу, приложение должно использовать один из следующих идентификаторов службы в вызове MFGetService. Дополнительные сведения см. в разделе "Интерфейсы службы".

Идентификатор службы Описание
MF_RATE_CONTROL_SERVICE С помощью этого идентификатора приложение может получить указатель на интерфейсы IMFRateSupport или IMFRateControl . Используя объект поддержки скорости, реализованный источником мультимедиа, приложение может проверить, поддерживается ли определенная частота базовым файлом мультимедиа ASF, также получает самую быструю и низкую скорость. С помощью объекта управления скоростью приложение может получить и задать частоту воспроизведения. Если приложение указывает определенную частоту воспроизведения, источник мультимедиа ASF сначала проверяет, находится ли запрошенная скорость в пределах пределов скорости (определяется самыми быстрыми и медленными скоростями), а затем задает частоту. Это не проверяет наличие переменных условий, так как скорость может измениться в любой момент в зависимости от пропускной способности сети. Дополнительные сведения см. в описании управления скоростью.
MF_METADATA_PROVIDER_SERVICE С помощью этого идентификатора приложение может получить указатель на интерфейс IMFMetadataProvider источника мультимедиа ASF. Этот интерфейс предоставляет доступ к сведениям о ASF-файле, в частности объектами заголовков ASF и потоками, содержащимися в содержимом мультимедиа. Сведения о заголовке предоставляются с помощью атрибутов дескриптора презентации, а сведения о потоке предоставляются с помощью атрибутов дескриптора потока. Дополнительные сведения об этих атрибутах см. в разделе "Атрибуты Media Foundation" для объектов заголовков ASF. Помимо сведений, предоставляемых с помощью атрибутов, также существуют описательные метаданные, которые задаются как свойства.
MF_PROPERTY_HANDLER_SERVICE С помощью этого идентификатора приложение может получить указатель на интерфейс IPropertyStore источника мультимедиа ASF. Хранилище свойств содержит все метаданные, связанные с ASF-файлом. Этот идентификатор является новым в Windows 7 и заменяет MF_METADATA_PROVIDER_SERVICE для получения свойств метаданных.
MFNETSOURCE_STATISTICS_SERVICE Дополнительные сведения см. в разделе "Получение статистики сети" в журнале клиентов.
MF_TIMECODE_SERVICE С помощью этого идентификатора приложение может получить указатель на интерфейс IMFTimecodeTranslate источника мультимедиа. Эту реализацию можно использовать для преобразования кода времени, например преобразования кода времени SMPTE в 100-наносекундных единиц и обратно.

 

Перевод кода времени

Источник мультимедиа ASF предоставляет службу преобразования кода времени, которая позволяет приложению преобразовывать код времени SMPTE в ближайшее время презентации (в единице 100 наносекунд). И наоборот, приложение также может получить код времени для запрошенного времени презентации. Служба доступна через интерфейс IMFTimecodeTranslate , который реализует источник мультимедиа ASF. Вызовы метода для этого указателя интерфейса являются асинхронными, которые могут выполняться из основного потока приложения, не блокируя пользовательский интерфейс приложения.

Ниже приведены инструкции по преобразованию кода времени.

  1. Получите указатель на интерфейс IMFTimecodeTranslate источника мультимедиа ASF, вызвав MFGetService и указав идентификатор MF_TIMECODE_SERVICE .
  2. Вызовите IMFTimecodeTranslate::BeginConvertTimecodeToHNS или IMFTimecodeTranslate::BeginConvertHNSToTimecode и укажите время преобразования. Для BeginConvertTimecodeToHNS код времени должен быть указан как переменная PROPVARIANT с типом данных VT_I8 . Метод BeginConvertHNSToTimecode требует времени в 100-наносекундных единиц в качестве типа MFTIME .
  3. Выполните асинхронную операцию, вызвав IMFTimecodeTranslate::EndConvertTimecodeToHNS или IMFTimecodeTranslate::EndConvertTimecodeToHNS соответствующим образом.

Во время создания источника мультимедиа сопоставитель источника создает поток байтов для файла, из которого источник мультимедиа считывает содержимое ASF. Для успешного преобразования времени поток байтов, связанный с ASF-файлом, должен иметь возможности поиска; в противном случае приложение получает ошибку MF_E_BYTESTREAM_NOT_SEEKABLE из вызова Begin... . Еще одним требованием преобразования времени является то, что ASF-файл, представленный источником мультимедиа ASF, должен иметь объекты индекса ASF. Время представления и коды времени извлекаются из объектов индекса ASF, которые поддерживают все индексы и соответствующие точки поиска для ASF-файла. Для преобразования кода времени в презентацию ASF-файл должен содержать простой объект индекса; для преобразования кода во время представления ASF-файл должен иметь объект Index. Операции преобразования используют базовый индексатор (компонент WMContainer) для синтаксического анализа и чтения объекта индекса, связанного с ASF-файлом. Если файл не содержит объект индекса, приложение асинхронно получает код ошибки MF_E_NO_INDEX.

Чтобы перевести время, запрашиваемое приложением, источник мультимедиа перечисляет потоки в файле и находит поток, содержащий соответствующий объект индекса ASF. Если такой поток найден, источник мультимедиа анализирует пакеты ASF потока до тех пор, пока не будет достигнут правильный код времени. После того как он найдет правильный пример, он извлекает соответствующее время презентации или код времени из примера и возвращает его вызывающему объекту.

Поддержка команды script

При создании топологии ASF, содержащей поток скрипта, в топологию добавляется узел Потока скриптов. Этот узел отправляет IMFSamples в соответствующее время. IMFSample, предоставленный исходным узлом скрипта, хранит данные в IMFMediaBuffer, связанном с образцом. Вы можете вызвать CopyToBuffer для примера, чтобы получить IMFMediaBuffer, а затем вызвать блокировку буфера, чтобы получить данные.

Полезные данные потока скриптов упаковываются в буфер в виде строки типа, за которой следует ЗНАЧЕНИЕ NULL, а затем командная строка, за которой следует ЗНАЧЕНИЕ NULL. Строки представляют собой Юникод в формате ASF.

Например, полезные данные могут выглядеть следующим образом (где \0 обозначает символ NULL):

URL-адрес\0http://contoso.com\0

Text\0This — это заголовок\0

Компоненты ASF уровня конвейера

Поддержка ASF в Media Foundation