C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter und MP4-Datei-Format
Ich bin auf einem BeagleBone ARM X-15-Debian-Rechner mit Linux-Kernel 4.9.35-ti-r44. In meinem C++ ( Qt 5 ) Anwendung, möchte ich meine cv::Mat-frames, um ein MP4-video-format. Ich habe libx264 installiert und kompiliert werden, von Grund auf ffmpeg und OpenCv. Ich kann erfolgreich aufzeichnen und betrachten von video mit MJPEG-mit der AVI-video-container-Typ, aber nicht MP4. Immer wenn ich versuche zu schreiben, ein MP4-video, ich bekomme Laufzeitfehler von der form:
OpenCV: FFMPEG: tag 0x44495658/'XVID' is not supported with codec id 13 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x00000020/' ???'
Habe ich versucht verschiedene Google Antworten, aber keine gearbeitet haben.
Relevante code:
cv::Size frameSize = frame.size();
qDebug() << "Initializing Video Recording to save Video file here: " << destinationFileName;
std::string filename = destinationFileName.toStdString();
//int fcc = CV_FOURCC('M','J','P','G');
//int fcc = CV_FOURCC('X','2','6','4');
int fcc = CV_FOURCC('X','V','I','D');
int fps = 1;
videoRecorder = new cv::VideoWriter(filename,fcc,fps,frameSize);
...
videoRecorder->write(frame);
Habe ich heruntergeladen und installiert die neuesten OpenCV 3.4 aber das problem besteht weiterhin.
Wie kann ich das schreiben in eine MP4-Datei mit OpenCV video-Schriftsteller?
Wenn ich versuche das "X','2','6','4' format bekomme ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x34363258/'X264' is not supported with codec id 28 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
[h264_v4l2m2m @ 0x81042020] Could not find a valid device
[h264_v4l2m2m @ 0x81042020] can't configure encoder
Could not open codec 'h264_v4l2m2m': Unspecified error
Starting
Wenn ich versuche, den 'X','V','I','D' format erhalte ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x44495658/'XVID' is not supported with codec id 13 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
Starting
Wenn ich versuche, 'M','P','E','G' format erhalte ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x4745504d/'MPEG' is not supported with codec id 2 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
Starting
Wenn ich versuche die 'H','2','6','4' format bekomme ich die Fehlermeldung:
OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 28 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
[h264_v4l2m2m @ 0x7fdde340] Could not find a valid device
[h264_v4l2m2m @ 0x7fdde340] can't configure encoder
Could not open codec 'h264_v4l2m2m': Unspecified error
Starting
Wenn ich versuche, 'M','P','4','V' - format erhalte ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 13 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
Starting
Wenn ich versuche, 'A','V','C','1' - format erhalte ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x31435641/'AVC1' is not supported with codec id 28 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
[h264_v4l2m2m @ 0x810f5f50] Could not find a valid device
[h264_v4l2m2m @ 0x810f5f50] can't configure encoder
Could not open codec 'h264_v4l2m2m': Unspecified error
Starting
Wenn ich versuche, den 'D','I','V','X' - format erhalte ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 13 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'
Starting
Wenn ich versuche, den 0x21 format erhalte ich die Fehlermeldung:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x00000021/'!???' is not found (format 'mp4 /MP4 (MPEG-4 Part 14)')'
Starting
Hier ist meine komplette Klasse, die zeigt, versucht, alle Formate:
#include "downloader.h"
Downloader::Downloader(QString url, QString destinationFile) : downloadUrl(url) , destinationFileName(destinationFile)
{
didInitializeVideoWriter = false;
qDebug() << "Initialized Downloader...";
}
Downloader::~Downloader() {
videoRecorder->release();
delete videoRecorder;
}
void Downloader::doDownload()
{
networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
networkManager->get(QNetworkRequest(QUrl(downloadUrl)));
}
void Downloader::writeFrame(cv::Mat frame) {
QMutexLocker locker(&videoFrameMutex);
videoRecorder->write(frame);
}
void Downloader::replyFinished(QNetworkReply *reply)
{
if(reply->error())
{
qDebug() << "ERROR!";
qDebug() << reply->errorString();
}
else
{
//qDebug() << reply->header(QNetworkRequest::ContentTypeHeader).toString();
//qDebug() << reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString();
//qDebug() << reply->header(QNetworkRequest::ContentLengthHeader).toULongLong();
qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug() << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
QString tempFileName = destinationFileName;
QString jpegTempFilename = QString("%1").arg(tempFileName.replace("mp4","jpeg"));
qDebug() << "Overwriting: " << jpegTempFilename;
QFile *file = new QFile(jpegTempFilename);
if(file->open(QFile::WriteOnly))
{
file->write(reply->readAll());
file->flush();
file->close();
}
delete file;
cv::Mat frame = imread(jpegTempFilename.toStdString(), CV_LOAD_IMAGE_COLOR); //CV_LOAD_IMAGE_COLOR (>0) loads the image in the BGR format
cv::cvtColor(frame,frame,CV_BGR2RGB);
//Now lazy load the recorder
if ( !didInitializeVideoWriter ) {
cv::Size frameSize = frame.size();
qDebug() << "Initializing Video Recording to save Video file here: " << destinationFileName;
std::string filename = destinationFileName.toStdString();
//int fcc = CV_FOURCC('M','J','P','G');
int fcc = CV_FOURCC('X','2','6','4');
//int fcc = CV_FOURCC('X','V','I','D');
//int fcc = CV_FOURCC('M','P','E','G');
//int fcc = CV_FOURCC('H','2','6','4');
//int fcc = CV_FOURCC('M','P','4','V');
//int fcc = CV_FOURCC('A','V','C','1');
//int fcc = CV_FOURCC('D','I','V','X');
//int fcc = 0x21;
//int fcc = 0x00000021;
int fps = 1;
videoRecorder = new cv::VideoWriter(filename,fcc,fps,frameSize);
qDebug() << "Starting";
frameCounter = 1;
performanceTimer.start();
didInitializeVideoWriter = true;
}
cv::putText(frame,"[REC]",cv::Point(50,50),5,1,cv::Scalar(0,0,225));
QFuture<void> backgroundRun = QtConcurrent::run(this, &Downloader::writeFrame, frame);
//backgroundRun.waitForFinished();
}
reply->deleteLater();
qDebug() << "RequestTimer: " << performanceTimer.elapsed() << frameCounter;
//Requests Again
networkManager->get(QNetworkRequest(QUrl(downloadUrl)));
frameCounter++;
performanceTimer.restart();
}
Update - ich habe versucht, 'a','v','c','1' und leider funktioniert auch nicht:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
[h264_v4l2m2m @ 0x810f6aa0] Could not find a valid device
[h264_v4l2m2m @ 0x810f6aa0] can't configure encoder
Could not open codec 'h264_v4l2m2m': Unspecified error
(qt-downloader:6234): GStreamer-CRITICAL **: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' failed
OpenCV Error: Unspecified error (GStreamer: cannot link elements
) in CvVideoWriter_GStreamer::open, file /media/usb/opencv/modules/videoio/src/cap_gstreamer.cpp, line 1635
VIDEOIO(cvCreateVideoWriter_GStreamer (filename, fourcc, fps, frameSize, is_color)): raised OpenCV exception:
/media/usb/opencv/modules/videoio/src/cap_gstreamer.cpp:1635: error: (-2) GStreamer: cannot link elements
in function CvVideoWriter_GStreamer::open
Wenn ich versuche den X264 FOURCC, die mp4-Datei ist 48 bytes und nie wächst:
Initializing Video Recording to save Video file here: "/tmp/Garage.mp4"
OpenCV: FFMPEG: tag 0x34363258/'X264' is not supported with codec id 27 and format 'mp4 /MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
Statische Größe:
debian@BeagleBoard-X15:/tmp$ ls -lrt Garage.*
-rw-r--r-- 1 debian debian 48 Dec 24 21:13 Garage.mp4
-rw-r--r-- 1 debian debian 100424 Dec 24 21:14 Garage.jpeg
debian@BeagleBoard-X15:/tmp$ hexdump Garage.mp4
0000000 0000 2000 7466 7079 7369 6d6f 0000 0002
0000010 7369 6d6f 7369 326f 7661 3163 706d 3134
0000020 0000 0800 7266 6565 0000 0000 646d 7461
0000030
Hier ist mein ffmpeg bauen conf:
debian@BeagleBoard-X15:/tmp$ ffmpeg -buildconf
ffmpeg version N-89524-g74f408cc8e Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 6.3.0 (Debian 6.3.0-18) 20170516
configuration: --enable-gpl --enable-libx264 --enable-pthreads --enable-static --extra-cflags=-I./x264/include --extra-ldflags=-L./x264/lib --extra-libs=-ldl
libavutil 56. 6.100 / 56. 6.100
libavcodec 58. 8.100 / 58. 8.100
libavformat 58. 3.100 / 58. 3.100
libavdevice 58. 0.100 / 58. 0.100
libavfilter 7. 7.100 / 7. 7.100
libswscale 5. 0.101 / 5. 0.101
libswresample 3. 0.101 / 3. 0.101
libpostproc 55. 0.100 / 55. 0.100
configuration:
--enable-gpl
--enable-libx264
--enable-pthreads
--enable-static
--extra-cflags=-I./x264/include
--extra-ldflags=-L./x264/lib
--extra-libs=-ldl
Danke für den Kommentar - ich habe dafür gesorgt, libxvid installiert ist. Mein make-pro-Datei enthält sowohl libx264 und libxvidecore ( LIBS += -lx264 LIBS += -lxvidcore ) . Aber ich sehe immer noch das problem.
Verbinden Sie diese Bibliotheken, wenn Gebäude ffmpeg oder einfach ein link Sie zu Ihrem Projekt?
installiert wurde Sie von apt-get nach der Installation von ffmpeg mit apt-get auch - also vielleicht mein ffmpeg nicht unterstützen! Ich werde versuchen, um es zu kompilieren.
Ich FFMPEG neu kompiliert 3.4.1 und OpenCV 3.4 und leider keines der Formate, zeigte sich in meinen überarbeiteten post.
InformationsquelleAutor PhilBot | 2017-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte ähnliche Problem mit Ihnen, aber läuft auch auf MacOS funktionsfähig. Ich löste es durch eine re-Installation der X264-Bibliothek auf die neueste version, und dann re-installieren Sie FFMPEG mit
./configure --enable-libx264 --enable-gpl --enable-avresample --enable-shared
so verknüpfen Sie die neuen X264, FFMPEG richtig. Dann re-install OpenCV (ich bin mit der version 3.4.4) an verknüpfen Sie die neue FFMPEG. Beim Bau des OpenCV, stellen Sie sicher, dassWITH FFMPEG
istON
ansonsten built-in-OpenCV-encoder verwendet werden, die Ihnen mehr begrenzte Möglichkeiten.InformationsquelleAutor Kevin
Haben Sie versucht, die ust in plain C++11, wie :
Wenn es ist, haben Sie das gleiche problem, das wir haben 🙂 QT gibt es ein problem mit der videowriter Opencv, nehme ich an. Willkommen im club.
Auf der anderen Seite hast du eine Lösung finden ?
Versuchen Sie zu zeigen, eine Richtung. Thx.
InformationsquelleAutor Rahibe Meryem