Создание и настройка Потоки ASF
Каждый ФАЙЛ ASF содержит один или несколько потоков. Объект профиля ASF представляет коллекцию потоков ASF. Для кодирования ASF необходимо создать и настроить потоки, которые требуется кодировать.
Приложение может выполнять следующие задачи с объектом профиля ASF:
- Добавление или удаление потока.
- Получите параметры конфигурации потока.
- Настройте расширения полезных данных.
- Добавление, удаление или изменение объекта взаимного исключения ASF.
Эта тема описана в следующих разделах.
- Создание нового потока
- Назначение номеров потоков
- Установка нечетких значений контейнеров
- Расширения полезных данных
- Добавление потока в профиль
- Связанные статьи
Создание нового потока
Объект профиля ASF должен содержать параметры конфигурации по крайней мере для одного потока ASF. Каждый поток представлен объектом конфигурации потока, который предоставляет интерфейс IMFASFStreamConfig. Сведения в объекте конфигурации потока соответствуют объекту "Свойства потока" и объектам расширенных потоков в заголовке ФАЙЛА ASF. (См. раздел Структура файлов ASF.)
Чтобы добавить поток в профиль ASF, выполните следующие действия.
- Создайте пустой объект конфигурации потока.
- Настройте поток в соответствии с требованиями приложения.
- Добавьте поток в профиль.
Чтобы создать поток для профиля, вызовите МВФASFProfile::CreateStream для создания объекта конфигурации пустого потока и получения указателя в параметре ppIStream . CreateStream должен знать тип создаваемого потока. Наиболее распространенными типами потоков, используемых в ФАЙЛАх ASF, являются звуковые и видеопотоки. В Media Foundation типы потоков обозначаются объектом типа мультимедиа, предоставляющим интерфейс МВФMediaType . Основной тип типа мультимедиа определяет категорию цифрового потока мультимедиа, например аудио или видео. Подтип определяет формат основного типа. Исходный тип носителя, заданный CreateStream , можно изменить с помощью объекта конфигурации steam. Чтобы получить тип носителя для потока, вызовите МВФASFStreamConfig::GetMediaType или чтобы получить основной тип вызова IMFASFStreamConfig::GetStreamType. Исходный тип носителя для потока можно заменить новым настроенным типом носителя, вызвав МВФASFStreamConfig::SetMediaType.
Если приложение создает профиль из допустимого дескриптора презентации путем вызова MFCreateASFProfileFromPresentationDescriptor. Функция автоматически задает объекты конфигурации потока для каждого потока и задает их в профиле. Типы мультимедиа потоков задаются на основе дескрипторов потока, связанных с дескриптором презентации.
Назначение номеров потоков
Потоки всех типов необходимо назначить номер потока. Номера потоков не должны быть последовательными, но должны находиться в диапазоне от 1 до 127. Чтобы назначить номера потоков, вызовите МВФASFStreamConfig::SetStreamNumber. Чтобы получить вызов номера потока, МВФASFStreamConfig::GetStreamNumber.
Примечание.
Номер потока отличается от индекса потока, который используется при получении потоков в профиле с помощью IMFASFProfile::GetStream. Индекс потока является номером, назначенным потоку объектом профиля. Диапазон индексов потоков в диапазоне от 0 до одного меньше количества потоков, полученных МВФASFProfile::GetStreamCount. Вы также можете получить поток из профиля по номеру потока, вызвав МВФASFProfile::GetStreamByNumber.
Установка нечетких значений контейнеров
Каждый объект конфигурации потока, представляющий поток, должен иметь связанные параметры утечки контейнера, скорость передачи и значения буферного окна.
Эти значения доступны приложению через атрибут MF_ASFSTREAMCONFIG_LEAKYBUCKET1 и атрибут MF_ASFSTREAMCONFIG_LEAKYBUCKET2. Для кодирования файлов фактические значения зависят от типа кодирования и определяются кодировщиком. Если у вас уже есть настроенный кодировщик и тип вывода задан в кодировщике, приложение должно запросить кодировщик для параметров утечки контейнера и задать значения в этих атрибутах.
Если вы используете компоненты слоя конвейера и настраиваете потоки для приемника мультимедиа ASF, скорее всего, у вас нет настроенного кодировщика. В этом случае необходимо запросить переговоры по типу носителя кодировщика и задать обновленное значение в свойстве MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET хранилища свойств приемника мультимедиа ASF. Хранилище свойств кодирования извлекается через объект ContentInfo, связанный с профилем. Обновленные значения отражаются автоматически в значениях атрибутов контейнера утечки потока. Общие сведения о утечках контейнеров и способах получения значения утечки контейнера из кодировщика см. в модели буфера утечки.
Расширения полезных данных
Данные мультимедиа для потоков добавляются в объект данных ASF в качестве примеров мультимедиа с помощью мультиплексера ASF. Эти примеры мультимедиа могут содержать полезные данные расширения: данные кода времени SMPTE, пропорции некверного пикселя, длительность выборки и, если пример содержит его, кадр видео ключа. Список поддерживаемых типов расширений полезных данных см. в разделе GUID расширения полезных данных ASF.
Поток должен быть настроен для принятия расширения полезных данных, чтобы во время создания примера мультиплексер может добавлять дополнительные данные в каждый пример для этого потока.
Чтобы получить общее количество расширений полезных данных, заданных в потоке, вызовите МВФASFStreamConfig::GetPayloadExtensionCount, а затем перечислите список путем вызова МВФASFStreamConfig::GetPayloadExtension. Чтобы добавить расширение полезных данных для потока, вызовите МВФASFStreamConfig::AddPayloadExtension. Это добавит дополнительные данные в отдельные примеры мультимедиа, созданные для потока.
Чтобы удалить существующие расширения полезных данных, связанные с потоком, вызовите МВФASFStreamConfig::RemoveAllPayloadExtensions.
Добавление потока в профиль
После настройки потока вызовите IMFASFProfile::SetStream , чтобы добавить поток в профиль.
Чтобы удалить существующий поток в профиле, вызовите МВФASFProfile::RemoveStream.
Настроенный профиль необходимо задать в объекте ContentInfo путем вызова МВФASFContentInfo::SetProfile. При внесении изменений в существующий поток необходимо снова добавить его в профиль и задать профиль в объекте ContentInfo.
См. также