Создание ASF-файлов с помощью сторонних кодеков

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

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

  1. Кодирование содержимого с помощью нужного кодека.
  2. Найдите или создайте значение GUID для идентификации содержимого, закодированного с помощью кодека, используемого на шаге 1.
  3. Создайте новый профиль или измените существующий профиль для использования с закодированным содержимым.
    • Создайте поток для закодированного содержимого с соответствующим основным типом. Дополнительные сведения об основных типах мультимедиа см. в разделе Типы мультимедиа. Используйте GUID, указанный на шаге 2, в качестве подтипа носителя.
    • Задайте для потока значение скорости передачи и буфера, которое не приведет к переполнению буфера. Эти значения должны быть в состоянии получить из кодека во время кодирования. Компоненты среды выполнения пакета SDK проверка значения окна скорости и буфера и при необходимости удалять примеры, чтобы данные соответствовали этим значениям. Если значения заданы неправильно, поток файла не будет выполняться должным образом, что приведет к плохому воспроизведению.
    • Для видеопотоков необходимо задать для элемента biCompression структуры BITMAPINFOHEADER , содержащейся в структуре WMVIDEOINFOHEADER , соответствующее значение FOURCC для содержимого. Это значение должно быть равно первым четырем байтам GUID подтипа. Например, если biCompression имеет значение MAKEFOURCC('T','E','S','T')=0x54455354, то GUID подтипа будет начинаться следующим образом: 54455354-XXXX-XXXX-XXXXXXXXXXXX.
  4. Создайте объект записи и загрузите профиль, созданный на предыдущем шаге. Дополнительные сведения о записи файлов см. в разделе Запись ФАЙЛОВ ASF.
  5. Циклически перебирайте входные данные файла и назначьте входные свойства для каждого из них, как обычно. Дополнительные сведения о входных данных см. в разделе Работа с входными данными. Для потока, закодированного с помощью стороннего кодека, задайте для указателя интерфейса IWMInputMediaProps значение NULL , прежде чем вызывать IWMWriter::BeginWriting.
  6. Используйте новый профиль, созданный на предыдущем шаге, для записи файла. Передайте сжатые примеры с помощью IWMWriterAdvanced::WriteStreamSample вместо IWMWriter::WriteSample. Для видео необходимо указать, какие примеры являются ключевыми кадрами, передав WM_SF_CLEANPOINT в качестве параметра dwFlags .

Для обработки и распаковки потока, закодированного с помощью стороннего кодека, необходимо прочитать примеры сжатых потоков. Приложение для чтения также должно обрабатывать распаковку примера для потока.

Помещение потоков MPEG-2 в ASF

Примечание

Этот раздел относится к приложениям, которые используют пакет SDK для формата Windows Media, чтобы поместить MPEG-2 (или другие форматы сжатия, использующие кадры B) в контейнер файлов ASF.

 

Объект записи требует, чтобы все входные примеры имели метки времени, и предполагается, что каждый входной пример имеет время представления позже, чем предыдущий. Хотя практически все несжатые видео и даже некоторые сжатые видеопотоки соответствуют этим условиям, потоки MPEG-2 не соответствуют этим условиям. В MPEG-2 не все примеры имеют метку времени, а при наличии кадров B порядок декодирования образца отличается от порядка отрисовки. Когда объект записи обнаруживает неупорядоченные образцы, он переупорядочивает их в "правильный" порядок. Таким образом, чтобы хранить потоки MPEG-2 в собственном коде (не декодированные) в контейнере ASF, необходимо выполнить следующие действия:

При записи файла:

  1. Добавьте расширение единиц данных фиксированного размера (DUE) в каждый входной пример, который будет содержать структуру, содержащую фактические значения времени начала и времени остановки mpeg для примера. Используйте значение -1 для этих значений, если в образце нет метки времени.
  2. Присвойте объекту записи "фиктивные" входные метки времени, которые постоянно увеличиваются, чтобы он запишет примеры в файл в том же порядке, в который они были получены. Фиктивные метки времени должны приблизительно соответствовать фактическому времени презентации, усредненному по времени. Фиктивные метки времени будут формировать временная шкала поиска, поэтому если они расходятся относительно меток реального времени, операции поиска в файле приведут к непредвиденным результатам. Однако ограниченное количество дрожания между временем выборки не повлияет на операции поиска.

При чтении файла:

  • Для каждого примера, считанного из файла, изучите due. Если оно содержит время начала, которое больше или равно нулю, скопируйте это значение в метку времени для выходного примера перед его доставкой в декодер. Задайте для всех остальных меток времени в выходных примерах значение NULL. В DirectShow это делается путем вызова метода IMediaSample::SetTime(NULL,NULL).

Буферизация содержимого

Интерфейс IWMWriter

Интерфейс IWMWriterAdvanced

Доставка сжатых примеров с помощью асинхронного средства чтения

Получение примеров потока с помощью синхронного средства чтения

WMVIDEOINFOHEADER

Работа с профилями

Запись ФАЙЛОВ ASF