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


Настройка объекта разделитировщика ASF

Объект разделителя ASF — это объект слоя WMContainer, который анализирует объект данных ASF файла Advanced Systems Format (ASF). После создания и инициализации сплиттера для анализа объекта данных ASF файла мультимедиа необходимо настроить разделитель для создания примеров для конкретных потоков. Чтобы выбрать необходимые потоки, позвоните imfASFSplitter::SelectStreams .

При необходимости приложение также может настроить его для создания примеров в обратном порядке или для создания примеров для защищенного содержимого. Чтобы задать эти параметры, вызовите IMFASFSplitter::SetFlags и передайте требуемую побитовую комбинацию поддерживаемых флагов. Перед вызовом этого метода клиент должен успешно завершить вызов IMFASFSplitter::Initialize ; В противном случае setFlags завершается сбоем с кодом ошибки MF_E_NOT_INITIALIZED . Сведения об инициализации сплиттера см. в разделе Создание объекта разделитировщика ASF.

Чтобы проверка, установлен ли этот флаг в настоящее время для разделители, вызовите IMFASFSplitter::GetFlags.

Выбор потоков для синтаксического анализа

Во время процесса инициализации с помощью вызова IMFASFSplitter::Initialize разделитель определяет количество потоков и идентификаторы потоков в ASF-файле. По умолчанию разделитель не выбирает потоки. Приложение должно выбрать потоки, вызвав IMFASFSplitter::SelectStreams. Этот метод принимает массив чисел потока. Чтобы получить номер потока для потока, вызовите IMFASFProfile::GetStream в профиле ASF или вызовите IMFStreamDescriptor::GetStreamIdentifier в дескрипторе потока. (Профиль ASF и дескриптор потока можно получить из объекта ContentInfo.) Если клиент передает номер потока, который не распознается сплитером, происходит сбой с ошибкой MF_E_INVALIDSTREAMNUMBER .

Вызов SelectStreams очищает предыдущие выбранные элементы. Не выбран ни один поток, не указанный в массиве. Чтобы получить список выбранных в данный момент потоков, вызовите IMFASFSplitter::GetSelectedStreams. Этот метод принимает указатель на массив, который метод заполняет номерами потока. Если размер массива меньше количества выбранных потоков, метод завершается ошибкой MF_E_BUFFERTOOSMALL . В этом случае метод возвращает количество выбранных потоков в параметре pwNumStreams . Затем это число можно использовать для выделения массива правильного размера и повторного вызова метода .

Пример кода см. в разделе "Выбор потока для синтаксического анализа" статьи Учебник. Чтение ASF-файла.

Настройка обратного воспроизведения

В процессе инициализации сплиттера он определяет, поддерживает ли содержимое ASF обратное воспроизведение. Если это так, разделитель можно настроить для создания примеров в обратном порядке, установив флаг MFASF_SPLITTER_REVERSE . Если содержимое не поддерживает обратное воспроизведение, функция IMFASFSplitter::SetFlags возвращает MF_E_INVALIDREQUEST, но флаг устанавливается для разделители.

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

Параметр защищенного содержимого

Разделитель можно настроить для работы с содержимым шифрования на уровне пакетов, задав MFASF_SPLITTER_WMDRM с помощью IMFASFSplitter::SetFlags. В этом случае разделитель будет предоставлять образцы для содержимого, защищенного с помощью управления цифровыми правами Windows Media (DRM). Если этот флаг установлен, примеры, созданные разделитером, содержат сведения, необходимые для расшифровки данных мультимедиа и восстановления кадров, например атрибут MFSampleExtension_PacketCrossOffsets . Этот атрибут представляет собой большой двоичный объект, содержащий массив объектов DWORD. Каждый параметр DWORD предоставляет границы полезных данных для кадра относительно начала кадра. Если этот атрибут отсутствует, кадр содержится в одной полезной нагрузке. Как правило, образцы, созданные разделителем, содержат несколько буферов мультимедиа. Приложение может скопировать все буферы в один непрерывный буфер, вызвав IMFSample::ConvertToContiguousBuffer. Результирующий буфер содержит кадр, а значение атрибута — смещения в этом буфере.

Разделитель ASF