it-swarm.com.de

X264 von OpenCV 3 mit FFmpeg unter Linux schreiben

Ich habe Probleme beim Schreiben von h264-Videos mit OpenCV 3 über FFmpeg ("'X', '2', '6', '4'" FOURCC). Ich habe alle verwandten Beiträge auf SO gesehen, aber nichts hilft. Code:

cv::VideoWriter writer(output_path.string(),    CV_FOURCC('X','2','6','4'), 60, frame_size);

Ausgabe:

OpenCV: FFMPEG: Tag 0x34363258/'X264' wird mit der Codec-ID .__ nicht unterstützt. 28 und Format 'mp4/MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG: Rückfall auf Verwenden Sie das Tag 0x00000021/'! ???'

Das resultierende Video ist extrem klein (byteweise) und nicht lesbar. Wenn Sie die four_cc auf "-1" als "unknown tag" von FFmpeg setzen, bekomme ich keine Aufforderung, den Codec auszuwählen, wie von anderen vorgeschlagen.

Das OpenCV 3-Dokument besagt: 

FFMPEG-Backend mit MP4-Container verwendet andere Werte nativ als fourcc code: siehe ObjectType , daher erhalten Sie möglicherweise eine Warnmeldung von OpenCV etwa 4cc-Code-Konvertierung.

Auf dieser Seite ist h264/x264 nicht aufgeführt, und ich bin nicht sicher, wie diese Anweisung zu interpretieren ist, da frühere SO posts alle Listen X.2.6.4 als den entsprechenden Code erscheinen . Die Verwendung von H.2.6.4 liefert tatsächlich eine identische Ausgabe.

Anregungen/Workarounds?

P.S. Das ffmpeg ist das aktuellste Update von Ubuntu-Betreuern. Es listet auf, dass es mit --enable-libx264 konfiguriert wurde.

EDIT: Ich habe versucht, den mkv-Container anstelle von mp4 zu verwenden. Die Warnung, dass ein Tag nicht unterstützt wird, ist verschwunden, das resultierende Video ist jedoch immer noch nicht lesbar.

12
Greg Kramida

Das Problem hatte nichts mit der angezeigten Warnung zu tun. Ich habe versucht, Einkanalbilder zu schreiben, während der VideoWriter ein 3-Kanal-Farbbild erwartete (der Standardwert von isColor, das 5. Argument des Konstruktors von VideoWriter, ist "true"). Die Lösung setzte isColor auf false.

4
Greg Kramida

Ich denke, Ihr Fund hier ist der Schlüssel:

Das FFMPEG-Backend mit MP4-Container verwendet andere Werte nativ als Fourcc-Code: siehe ObjectType. Möglicherweise erhalten Sie von OpenCV eine Warnmeldung zur Fourcc-Code-Konvertierung.

Die für ffmpeg implementierten mp4-Tag-Werte bestätigen dies und befinden sich im ff_mp4_obj_type[] in isom.c . Der Code in OpenCV cap_ffmpeg_impl.hpp muss wahrscheinlich aktualisiert werden, um dies zu unterstützen. Ich stocherte für ein oder zwei Stunden herum, erkannte, dass es nicht unbedeutend war, und stieß zu.

Eine Problemumgehung besteht in der Ausgabe in eine .avi-Datei. Es gibt zahlreiche Beispiele für Personen, die Probleme mit OpenCV und mp4 haben und .mov oder .avi verwenden sollen. ( Hier ist eins .)

@ Greg Kramida: Einstellung isColor = false hat mir nicht geholfen: Die Nachricht blieb und meine Ausgabedatei wurde nur noch ~ 48 Byte groß. Laut Dokumentation handelt es sich um eine Windows-Flagge - was auch immer es für mich unter Linux ist, es ist nicht gut.

Haben Sie bestätigt, dass Sie mit ffmpeg von sich aus x264 generieren können?

Nachdem ich bestätigt habe, dass libx264 den Wert 0x21 hat, wenn ich das in der Befehlszeile aufrufe:

ffmpeg -i x264-input.mp4 -vcodec libx264 -f mp4 x264-output.mp4

Ich entschied mich für 0x21 direkt in VideoWriter.open() . Das erzeugt eine gültige und interpretierbare Videodatei.

Zu Referenzzwecken ist meine Software ffmpeg 3.0:

ffmpeg -version
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc=`gcc -fPIC` --enable-libfdk-aac --enable-libx265 --enable-nonfree --enable-libmp3lame
libavutil      55. 17.103 / 55. 17.103
libavcodec     57. 24.102 / 57. 24.102
libavformat    57. 25.100 / 57. 25.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 31.100 /  6. 31.100
libswscale      4.  0.100 /  4.  0.100
libswresample   2.  0.101 /  2.  0.101
libpostproc    54.  0.100 / 54.  0.100

Und OpenCV 3.1.0 konfiguriert mit:

cmake \
    -D WITH_IPP=ON \
    -D INSTALL_CREATE_DISTRIB=ON \
    -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX=/usr/local ..

x264 ist das libx264-142:AMD64-Release für Debian Jessie.

6
Jameson

Das Problem bei OpenCV, welche Nachricht lautet:

OpenCV: FFMPEG: Tag 0x34363248/'H264' wird mit der Codec-ID 28 und dem Format 'mp4/MP4 (MPEG-4 Part 14)' .__ nicht unterstützt. OpenCV: FFMPEG: Fallback zum Verwenden des Tags 0x00000021/'! ???'

Es wird durch Definitionen von CV_FOURCC ('H', '2', '6', '4') erzeugt. Dieser Wert entspricht nicht dem auf isom.c definierten Wert 

{AV_CODEC_ID_H264, 0x21}

Wenn dann fourcc als 0x21 cv :: VideoWriter definiert wird, funktioniert das reibungslos. 

cv::VideoWriter VF;
VF.open(filename,0x21,fps,frameSize,true);

wie Jameson oben kommentiert, 

"Ich habe mich entschlossen, 0x21 direkt in VideoWriter.open () zu verwenden. Dadurch wird eine gültige und interpretierbare Videodatei erzeugt."