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


Источник мультимедиа 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-адрес, он должен вызвать МВФSourceResolver::CreateObjectFromURL для синхронной операции или МВФSourceResolver::Begin... EndCreateObjectFromURL для асинхронной операции. Процесс создания источника мультимедиа из потока байтов аналогичен. Приложение должно вызвать МВФSourceResolver ::CreateObjectFromByteStream для синхронной операции или МВФSourceResolver::Begin... EndCreateObjectFromBytestream для асинхронной операции. Эти вызовы должны указывать MF_RESOLUTION_MEDIASOURCE в параметре dwFlags . Дополнительные сведения об использовании этого флага см. в разделе "Использование средства разрешения источника".

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

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

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

Параметры конфигурации для источника мультимедиа ASF

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

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

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

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

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

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

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

Интерфейс Description
IMFMediaSource Требуется для всех источников мультимедиа.
МВФMediaEventGenerator Требуется для всех источников мультимедиа. Позволяет приложениям получать события из источника мультимедиа через сеанс мультимедиа.
МВФGetService Запрашивает источник мультимедиа для указанного интерфейса службы.
IPropertyStore Задает и получает свойства в источнике мультимедиа. Каждое свойство содержит описательное имя и значение.
МВФMetadata Описывает метаданные файла ASF.
МВФMetadataProvider Извлекает коллекцию метаданных либо для всей презентации, либо для одного потока в презентации.
МВФRateSupport Запрашивает диапазон поддерживаемых скоростей воспроизведения, включая обратное воспроизведение.
МВФRateControl Возвращает или задает частоту воспроизведения.
МВФTrustedInput Возвращает ITA для каждого потока ASF, содержащегося в источнике.
МВФPMPClient Позволяет источнику мультимедиа получать указатель на интерфейс IMFPMPHost , который используется для создания объектов в процессе PMP.
МВФTimecodeTranslate Преобразует коды времени между обществом кино и телевизионных инженеров (SMPTE) и 100-наносекунд единиц времени.

 

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

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

Идентификатор службы Description
MF_RATE_CONTROL_SERVICE С помощью этого идентификатора приложение может получить указатель на интерфейсы МВФRateSupport или 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 С помощью этого идентификатора приложение может получить указатель на интерфейс МВФTimecodeTranslate источника мультимедиа. Эту реализацию можно использовать для преобразования кода времени, например преобразования кода времени SMPTE в 100-нано-секундные единицы и обратно.

 

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

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

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

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

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

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

Поддержка команд скрипта

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

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

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

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

Text\0This — это подпись\0

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

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