Warum dauert das Kodieren eines Videos mit dem MJPEG-Codec länger als MPEG-4?

5433
umair

Ich teste die Kodierungsleistung (MPEG-4 und MJPEG) einer intelligenten Kamera. Ich habe in OpenCV / FFMPEG eine Anwendung zum Durchführen der Kodierung geschrieben, bei der die Anwendung Bilder von der Kamera erfasst und sie in ein gewünschtes Kodierungsformat kodiert. In den Benchmarks habe ich erfahren, dass die MJPEG-Kodierung viel länger dauert als die MPEG-4-Kodierung. Ich hatte erwartet, dass es anders herum sein würde. Die Kodierung eines einzelnen Frames in MPEG-4 dauert etwa 31 ms, wohingegen die Kodierung in MJPEG etwa 80 ms dauert. Dauert MJPEG im Vergleich zu MPEG-4 wirklich so lange?

2
Ich hätte erwartet, dass es auch umgekehrt ist. Möglicherweise ist der MJPEG-Encoder nicht so optimiert wie der MPEG-4-Encoder (sprechen wir von "libavcodec"?) slhck vor 12 Jahren 0
Ja. Es ist libavcodec. Ich benutze OpenCV für die Codierung, die wiederum FFMPEG / libavcodec verwendet. umair vor 12 Jahren 0

1 Antwort auf die Frage

2
Breakthrough

Die beiden Kompressionsalgorithmen unterscheiden sich völlig in ihrer Funktionsweise, und MPEG4 kann auch die GPU-Beschleunigung verwenden.

MPEG4 ist ein echter Videocodec, während MJPEG jedes Bild einfach in ein separates JPEG-Bild komprimiert. Der Unterschied besteht darin, dass MPEG4 eine Vielzahl von Techniken (Bewegungsvektorkompensation, I / B-Frames usw.) verwendet, um sowohl die Qualität als auch das Kompressionsverhältnis zu verbessern.

Warum man schneller arbeitet als der andere, hängt wirklich davon ab, wie der Encoder implementiert wurde und wie sich die jeweilige Hardware beim Encoding verhält. Einige Encoder können spezielle CPU-Anweisungen (SSE / SSE2, MMX usw.) oder GPU-Beschleunigung verwenden (ich weiß, dass Sie dies wahrscheinlich nicht tun, aber ich erwähne es nur). Die JPEG-Komprimierung ist weitgehend von der CPU-Geschwindigkeit abhängig und verwendet eigentlich keine Verbesserungen des Befehlssatzes (aus Gründen der Kompatibilität / Stabilität und der Tatsache, dass sie nicht wirklich hilft - siehe den Änderungsprotokolleintrag für den 16. November 2006).

Wenn Sie nicht über ein Einzelbildvideo verfügen, codiert MPEG4 niemals wirklich ein "Einzelbild" gleichzeitig. Es wird immer ein Frame-Blick nach vorne / hinten durchgeführt, um bessere Möglichkeiten zum Komprimieren des aktuellen Frames zu ermitteln (MJPEG führt nur jeweils einen einzelnen Frame aus). Daher hängt es weitgehend von den Daten vor / nach dem Frame ab, nicht nur von den aktuellen. Dies tritt auch bei der Single-Pass-Codierung auf (deshalb werden überhaupt die Bewegungsvektoren verwendet).

Zur Zeit deckt die Kamera eine völlig statische Szene ab. Ist es möglich, dass die statische Szene die Leistung von MPEG-4 erhöht (da sie mit Bewegungsvektoren arbeitet) und die MPEG-4-Codierung in diesem Fall nicht viel Aufwand verursacht? Könnte es der Grund sein, warum es in diesem Fall viel besser ist als MJPEG? Wie ich bereits sagte, schreibe ich jedes Mal, wenn ich ein Bild von der Kamera aufnehme, eine Datei mit OpenCV / FFMPEG (im Format MPEG-4 und MJPEG) auf. umair vor 12 Jahren 0
In diesem Fall ** ja **, da die vorhersagende Kodierung einer statischen Szene sehr effizient ist. Hier schlägt MPEG-4 MJPEG. slhck vor 12 Jahren 0
@slhck ist nur in Bezug auf die Komprimierungsrate effizient, codiert nicht schneller. Wenn es sich jedoch um eine statische Szene handelt, können Sie die Anzahl der I / B-Frames und die Makroblockberechnungen reduzieren, um die Codierungsgeschwindigkeit zu erhöhen, ohne die Qualität zu stark zu beeinträchtigen. Breakthrough vor 12 Jahren 0
@Breakthrough Gegeben der richtige MB-Suchalgorithmus, yup. Ich denke jedoch, dass in diesem Fall die Implementierung des MJPEG-Encoders eher schwach ist. slhck vor 12 Jahren 0