Ответ 1
Проблема с кодеком
Я преобразовал этот файл mp4
в файл avi
с ffmpeg
. Тогда приведенный выше opencv-код может хорошо воспроизводить этот файл avi
.
Поэтому я уверен, что это проблема кодека.
(Затем я преобразовал этот файл mp4
в другой файл mp4
с помощью ffmpeg
, думая, что ffmpeg
поможет превратить этот оригинальный нечитаемый .mp4
кодек в читаемый кодек .mp4
, но в результате .mp4
файл оказался сломанным. Этот факт может или не может касаться этой проблемы, просто упомянув, если кому-то нужна эта информация.)
Ответ на него - перестроить FFmpeg, а затем перестроить Opencv
Несмотря на то, что это проблема кодека, я пробовал много других способов, но до сих пор не смог ее решить. Наконец, я попытался восстановить ffmpeg и opencv, тогда проблема была решена!
Ниже приводится моя подробная процедура восстановления.
(1) Build ffmpeg
- Скачать ffmpeg-2.7.1.tar.bz2
Веб-сайт FFmpeg: https://www.ffmpeg.org/download.html
ffmpeg-2.7.1.tar.bz2 ссылка: http://ffmpeg.org/releases/ffmpeg-2.7.1.tar.bz2
-
tar -xvf ffmpeg-2.7.1.tar.bz2
-
cd ffmpeg-2.7.1
-
./configure --enable-pic --extra-ldexeflags=-pie
Из http://www.ffmpeg.org/platform.html#Advanced-linking-configuration
Если вы скомпилировали библиотеки FFmpeg статически и хотите использовать их для создания собственной общей библиотеки, вам может потребоваться принудительная поддержка PIC (с помощью
--enable-pic
во время настройки FFmpeg).Если вашей целевой платформе нужны независимые от позиции бинарные файлы, вы должны передать правильный флаг привязки (например,
-pie
) на--extra-ldexeflags
.Если вы столкнулись с ошибкой:
yasm/nasm not found or too old. Use --disable-yasm for a crippled build.
Просто
sudo apt-get install yasm
Дальнейшие варианты построения: https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
например. Добавление опции
--enable-libmp3lame
включаетpng
encoder. (До./configure
вам нужноsudo apt-get install libmp3lame-dev
с версией ≥ 3.98.3) -
make -j5
(в папке ffmpeg) -
sudo make install
(2) Build Opencv
-
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
-
unzip opencv-2.4.9.zip
-
cd opencv-2.4.9
-
mkdir build
-
cd build
-
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_QT=OFF -D WITH_V4L=ON -D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic ..
Вы можете изменить эти параметры в зависимости от ваших потребностей. Ключом является только последний
-D CMAKE_SHARED_LINKER_FLAGS=-Wl,-Bsymbolic
. Если вы опустите этот, тоmake
выскочит из ошибок.Это также из http://www.ffmpeg.org/platform.html#Advanced-linking-configuration (та же ссылка на шаге 4 выше)
Если вы скомпилировали библиотеки FFmpeg статически и хотите использовать их для создания собственной общей библиотеки, вам может потребоваться... и добавить в проект следующий проект
LDFLAGS
:-Wl,-Bsymbolic
-
make -j5
-
sudo make install
-
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
-
sudo ldconfig
Теперь opencv-код должен хорошо воспроизводить файл mp4
!
Методы, которые я пробовал, но не работали
- Попробуйте добавить
WITH_UNICAP=ON
WITH_V4L=ON
, когдаcmake
opencv. Но не работал вообще. - Попробуйте изменить кодек внутри кода opencv python. Но тщетно.
cap = cv2.VideoCapture("MOV_0006.mp4")
print cap.get(cv2.cv.CV_CAP_PROP_FOURCC)
Я тестировал это в двух средах. В первом окружении opencv работает, а в другом opencv не воспроизводит видео. Но оба напечатали один и тот же кодек
828601953.0
.Я попытался изменить свой кодек на
cap.set(cv2.cv.CV_CAP_PROP_FOURCC, cv2.cv.CV_FOURCC(*'H264'))
, но не работал вообще. - Попробуйте заменить библиотеки под
opencv-2.4.8/3rdparty/lib/
на библиотеки в моей работоспособной среде. Но даже не удалось построить.I grep
AVC: nal size
и найти библиотеки, содержащие это сообщение об ошибке,opencv-2.4.8/3rdparty/lib/libavcodec.a
и т.д. Поэтому я попытался их заменить. Но оказывается, что это плохая идея. -
sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip
Попытайтесь установить какую-то вещь и кое-какую эту вещь. Но это было совершенно бесполезно.
Проблемы, связанные с этим
Я искал в Интернете, и есть много подобных проблем, но у NONE из них было решение!
Ниже приведены проблемы, которые я думаю так же, как и мои.
-
OpenCV/ffmpeg не воспроизводит мое видео mp4. - от opencv-users.nabble.com
-
VideoCapture не работает в OpenCV 2.4.2 - от answers.opencv.org
В этом упоминании о восстановлении
ffmpeg
! Но аргументов для меня было недостаточно. -
Проблема чтения Mp4 - я установил OpenCV 2.4.1 и python 2.7 и сделал короткую программу, которая успешно считывает файл avi. Однако он не может прочитать файл mp4. - от answers.opencv.org
-
Невозможно открыть видеофайлы ".mp4" с помощью OpenCV 2.4.3, Python 2.7 в машине _Windows 7 - из Переполнение стека
-
OpenCV 2.4 VideoCapture не работает в Windows - from Переполнение стека