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


Сжатие Image-Data

[Функция, связанная с этой страницей, Диспетчер сжатия видео, является устаревшей функцией. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код не использовал эту функцию.]

Приложение может использовать ряд ICCompress функций и макросов для сжатия данных. Функции и макросы помогают выполнять следующие задачи:

  • Определите формат сжатия, используемый для указанного входного формата.
  • Подготовьте компрессор.
  • Сжатие данных.
  • Завершение сжатия.

Приложение может повысить контроль над процессом сжатия с помощью ICCompress функций и макросов. Эта группа функций и макросов обрабатывает отдельные кадры, а не последовательность в целом. Например, приложение может определить кадры для сжатия в виде ключевых кадров с помощью функции ICCompress.

Компрессор получает данные в одном формате, сжимает данные и возвращает сжатые версии данных с помощью указанного формата. Типичный формат входных данных указывает DIB с помощью структурыBITMAPINFO. Типичный формат выходных данных указывает сжатые DIB, а также использует структуру BITMAPINFO.

Заметка

Чтобы свести к минимуму снижение изображения и звука во время воспроизведения, избегайте сжатия AVI-файла более одного раза. Объедините несжатые фрагменты видео в системе редактирования, а затем сжимайте окончательный продукт.

 

Выбор формата сжатия и сжатия

Если требуется сжатие данных и приложению требуется определенный формат вывода, отправьте сообщение ICM_COMPRESS_QUERY (или используйте макрос ICCompressQuery), чтобы определить, поддерживает ли он форматы входных и выходных данных.

Если формат выходных данных не важен для вашего приложения, вам нужен только агрегат, который может обрабатывать входной формат. Чтобы определить, может ли компрессор обрабатывать входной формат, можно отправить ICM_COMPRESS_QUERY, указав NULL для параметра lParam. Это сообщение не возвращает выходной формат приложению. Приложение может определить размер буфера, необходимый для данных, указав формат сжатия, отправив сообщение ICM_COMPRESS_GET_FORMAT (или использовать макрос ICCompressGetFormatSize). Кроме того, можно получить данные формата, отправив ICM_COMPRESS_GET_FORMAT (или макрос ICCompressGetForm at).

Если вы хотите определить самый большой буфер, который может потребоваться для сжатия, отправьте сообщение ICM_COMPRESS_GET_SIZE (или используйте макрос ICCompressGetSize). Можно использовать количество байтов, возвращаемых функцией ICSendMessage, чтобы выделить буфер для последующего сжатия изображений.

Инициализация компрессора

После того как ваше приложение выбирает агрегат, который может обрабатывать необходимые форматы входных и выходных данных, вы можете инициализировать его с помощью сообщения ICM_COMPRESS_BEGIN (или использовать макрос ICCompressBegin). Для этого сообщения требуется дескриптор и форматы входных и выходных данных.

Сжатие данных

Для сжатия кадра можно использовать функцию ICCompress. Приложение должно многократно использовать эту функцию, пока все кадры в последовательности не сжимаются. Приложение также должно отслеживать и увеличивать количество каждого кадра, сжатого с помощью ICCompress. Для проверки того, отправляются ли кадры из порядка во время быстрого темпорального сжатия (сохраняя различия между последовательными кадрами). Если приложение повторно сжимает кадр, он должен использовать тот же номер кадра, что и при первом сжатие кадра. Если приложение сжимает изображение по-прежнему кадра, оно может указать число кадров нулю.

Приложение может использовать флаг ICCOMPRESS_KEYFRAME, чтобы сделать кадр сжатым ICCompress ключевым кадром.

Когда VCM возвращает управление приложению после сжатия кадра, VCM сохраняет сжатые данные в структурах, на которые ссылается lpbiOutput и lpData. Если приложению необходимо переместить сжатые данные, он может найти его размер в элементе biSizeImage структуры BITMAPINFO, указанной в lpbiOutput.

Заметка

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

 

Завершение сжатия

После сжатия данных приложение может использовать макрос ICCompressEnd, чтобы уведомить о завершении работы. Если вы хотите перезапустить сжатие после использования этой функции, приложение должно повторно инициализировать его, отправив сообщение ICM_COMPRESS_BEGIN (или используйте макрос ICCompressBegin).