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.
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.
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.
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."