Не удается прочитать файлы mp4 в opencv 3


Я не могу заставить opencv 3.0.0 (предварительно скомпилированную версию с веб-сайта opencv) даже компилироваться при попытке открыть файлы с помощью VideoCapture.

Я сократил свой код до следующего:

#include "stdafx.h"
#include <opencv/cxcore.h>
#include <opencv2/core/mat.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>

#include <string>
#include <cmath>
#include <time.h>

using namespace cv;
using namespace std;
int main() {
   VideoCapture inputCap("C:/Users/user.name/Desktop/Video0022.mp4");
}

И компиляция его дает: opencv_ffmpeg300_64.dll : fata error LNK1107: invalid or corrupt file: cannot read at 0x408, в файле opencv_ffmpeg300_64.dll, строка 1, col 1.

Это использование Visual Studio Express 2012, на машине Win 7, компиляция в x64, в C++. Я пробовал компилировать код в режиме выпуска и в режиме отладки, и это дает ту же ошибку. Библиотека DLL в компоновщике дополнительные зависимости, и у меня есть библиотека, в которой он находится в каталогах дополнительных библиотек.

Это не сработало, и, оглядевшись, я увидел, что в версиях Java и Python добавление каталога в переменную path иногда срабатывало. Так и сделал, перезагрузился, попробовал еще раз, та же ошибка.

Затем я просто начал добавлять dll везде, где это может быть полезно - через папку My Documents / Visual Studio 12 / Projects/ProjectName, в нескольких местах в папка opencv, и все та же ошибка.

Я также попытался отключить включение инкрементного связывания, и это тоже не сработало.

Я уверен, что это не проблема с кодеком, так как это работало в opencv 2.4.7/visual studio 10 (я переименовал папку opencv 2, чтобы не связываться с установкой opencv 3.0.0).

Само видео в порядке, я могу открыть его в VLC и Windows media player без проблем, и со старыми opencv вещами.

Если я удалю dll из дополнительных зависимостей компоновщика я могу фактически скомпилировать .cpp, но тогда он никогда не открывает файл (inputCap.isOpened() всегда возвращает false). Тем не менее, я могу открыть веб-камеры без проблем.

--

Edit: я изменил библиотеку времени выполнения выпуска на /MT вместо /MD, удалил opencv_ffmpeg300_64.dll на обоих отладочных и релизных версиях компоновщика дополнительные зависимости и теперь и релиз, и отладка компилируются и прекрасно работают для этого видеофайла.

1 2

1 ответ:

(не понял, что эттиквит должен ответить вопросом, если я решу свою собственную проблему, упс)

Удалось исправить это, изменив библиотеку времени выполнения выпуска на /MT вместо /MD, удалив opencv_ffmpeg300_64.dll на обоих отладочных и релизных версиях компоновщика дополнительные зависимости и теперь и релиз, и отладка компилируются и прекрасно работают для этого видеофайла.