Почему кодирование видео с использованием кодека MJPEG занимает больше времени, чем MPEG-4?

5383
umair

Я тестирую производительность кодирования (MPEG-4 и MJPEG) умной камеры. Я написал приложение в OpenCV / FFMPEG для выполнения кодирования, где приложение захватывает изображения с камеры и кодирует их в желаемый формат кодирования. В тестах я узнал, что кодирование MJPEG занимает намного больше времени, чем кодирование MPEG-4. Я ожидал, что это будет наоборот. Кодирование одного кадра в MPEG-4 занимает около 31 мс, а кодирование в MJPEG - около 80 мс. Действительно ли MJPEG занимает так много времени по сравнению с MPEG-4?

2
Я бы ожидал, что все будет наоборот. Может быть, кодер MJPEG не так оптимизирован, как кодер MPEG-4 (мы говорим «libavcodec»?) slhck 13 лет назад 0
да. Это libavcodec. Я использую OpenCV для кодирования, которое, в свою очередь, использует FFMPEG / libavcodec. umair 13 лет назад 0

1 ответ на вопрос

2
Breakthrough

Два алгоритма сжатия совершенно различны по своему функционированию, и MPEG4 также может использовать ускорение GPU.

MPEG4 - это настоящий видеокодек, тогда как MJPEG просто сжимает каждый кадр в отдельное изображение JPEG. Разница в том, что MPEG4 использует различные методы (компенсация вектора движения, кадры I / B и т. Д.) Для улучшения как качества, так и степени сжатия.

Почему один работает быстрее, чем другой, действительно зависит от того, как был реализован кодер, и от того, как работает ваше конкретное оборудование при кодировании. Некоторые кодировщики могут использовать специальные инструкции процессора (SSE / SSE2, MMX и т. Д.) Или использовать ускорение графического процессора (я знаю, что вы, вероятно, нет, но я только упоминаю об этом). Сжатие JPEG в значительной степени зависит от скорости процессора и на самом деле не использует никаких улучшений набора команд (для совместимости / стабильности и того факта, что это не очень помогает - см. Запись в журнале изменений за 16 ноября 2006 г.).

Наконец, если у вас нет однокадрового видео, MPEG4 никогда не кодирует «один кадр» за раз. Он всегда выполняет просмотр кадра вперед / назад, чтобы определить лучшие способы сжатия текущего кадра (MJPEG делает только один кадр за раз). Как таковой, он в значительной степени зависит от данных до / после кадра, а не только от текущего. Это происходит и в однопроходном кодировании (поэтому, в конце концов, оно использует векторы движения).

В настоящее время камера освещает полностью статичную сцену. Возможно ли, что статическая сцена увеличивает производительность MPEG-4 (поскольку она работает с векторами движения), и в этом случае не требуется много накладных расходов для кодирования MPEG-4? Может ли это быть причиной того, что он работает намного лучше, чем MJPEG в этом случае? Как я уже говорил ранее, каждый раз, когда я снимаю кадр с камеры, я записываю его в файл, используя OpenCV / FFMPEG (в формате MPEG-4 и MJPEG соответственно). umair 13 лет назад 0
В этом случае ** да **, потому что прогнозирующее кодирование статической сцены очень эффективно. Это где MPEG-4 побеждает MJPEG. slhck 13 лет назад 0
@slhck эффективен только в отношении степени сжатия, не кодирует быстрее. Тем не менее, если это статическая сцена, вы можете уменьшить количество кадров I / B и уменьшить вычисления макроблоков, чтобы увеличить скорость кодирования без значительного влияния на качество. Breakthrough 13 лет назад 0
@ Breakthrough При правильном алгоритме поиска MB, да. Полагаю, что в этом случае реализация кодера MJPEG довольно слабая. slhck 13 лет назад 0

Похожие вопросы