Я тестирую производительность кодирования (MPEG-4 и MJPEG) умной камеры. Я написал приложение в OpenCV/FFMPEG для выполнения кодирования, где приложение захватывает изображения с камеры и кодирует их в желаемый формат кодирования. В тестах я узнал, что кодирование MJPEG занимает намного больше времени, чем кодирование MPEG-4. Я ожидал, что это будет наоборот. Кодирование одного кадра в MPEG-4 занимает около 31 мс, а кодирование в MJPEG - около 80 мс. Действительно ли MJPEG занимает столько времени по сравнению с MPEG-4?
1 ответ
Два алгоритма сжатия совершенно различны по своему функционированию, и MPEG4 также может использовать ускорение GPU.
MPEG4 - это настоящий видеокодек, тогда как MJPEG просто сжимает каждый кадр в отдельное изображение JPEG. Разница в том, что MPEG4 использует различные методы (компенсация вектора движения, кадры I/B и т.д.) Для улучшения как качества, так и степени сжатия.
Почему один работает быстрее, чем другой, действительно зависит от того, как был реализован кодер, и от того, как работает ваше конкретное оборудование при кодировании. Некоторые кодировщики могут использовать специальные инструкции процессора (SSE/SSE2, MMX и т.д.) Или использовать ускорение графического процессора (я знаю, что вы, вероятно, нет, но я только упоминаю об этом). Сжатие JPEG в значительной степени зависит от скорости процессора и на самом деле не использует никаких улучшений набора команд (для совместимости / стабильности и того факта, что это не очень помогает - см. Запись в журнале изменений за 16 ноября 2006 г.).
Наконец, если у вас нет однокадрового видео, MPEG4 никогда не кодирует "один кадр" за раз. Он всегда выполняет просмотр кадра вперед / назад, чтобы определить лучшие способы сжатия текущего кадра (MJPEG делает только один кадр за раз). Как таковой, он в значительной степени зависит от данных до / после кадра, а не только от текущего. Это происходит и в однопроходном кодировании (поэтому, в конце концов, оно использует векторы движения).