Не удается открыть видео с помощью opencv

Opencv отлично работает при выполнении других действий. Он может открывать изображения и показывать изображения. Но он не может открыть видео.

Код, который я использую для открытия видео, приведен ниже

import cv2

cap = cv2.VideoCapture("MOV_0006.mp4")

while True:
    ret, frame = cap.read()

    cv2.imshow('video', frame)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Но при выполнении он выдает сообщения об ошибках, как показано ниже

[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] AVC: nal size 554779904
[h264 @ 0x1053ba0] no frame!

Мои vlc и mplayer могут воспроизводить это видео, но opencv не может.

Я установил пакет x264 и libx264-142 кодека. (используя sudo apt-get install)

Моя версия ubuntu - 14.04 trusty.

Я не уверен, что это проблема кодека или нет?

Я восстановил opencv либо с помощью WITH_UNICAP=ON, либо с помощью WITH_UNICAP=OFF, но это вообще не затрагивает проблему. Сообщения об ошибках никогда не меняются.

Ответы

Ответ 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 Переполнение стека

Ответ 2

для ubuntu 14.04, это как я его исправил.

установить зависимости, необходимые для OpenCV

sudo apt-get удалить ffmpeg x264 libx264-dev

Обновление sudo apt-get

sudo apt-get install libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10- плагины-уродливые gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg

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 libpencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

sudo add-apt-repository ppa: mc3man/gstffmpeg-keep

Обновление sudo apt-get

sudo apt-get install gstreamer0.10-ffmpeg

sudo apt-get install gstreamer0.10-plugins-bad

Обновление sudo apt-get

Установить ffmpeg внутри anaconda3

conda install -c menpo ffmpeg = 2.7.0

Dowload Opencv 3.1.0

wget https://github.com/Itseez/opencv/archive/3.1.0.zip unzip 3.1.0.zip

mkdir build

cd build

cmake -DBUILD_TIFF = ON -DBUILD_opencv_java = OFF -DWITH_CUDA = OFF -DWITH_FFMPEG = OFF -DENABLE_AVX = ON -DWITH_OPENGL = ON -DWITH_OPENCL = ON -DWITH_IPP = ON -DWITH_TBB = ON -DWITH_EIGEN = ON -DWITH_V4L = ON -DBUILD_TESTS = OFF -DBUILD_PERF_TESTS = OFF -DCMAKE_BUILD_TYPE = RELEASE -DCMAKE_INSTALL_PREFIX = $(python3 -c "import sys; print (sys.prefix)" ) -DPYTHON3_EXECUTABLE = $(который python3.5) -DPYTHON3_INCLUDE_DIR = $(python3 -c "из distutils.sysconfig import get_python_inc; print (get_python_inc())" ) -DPYTHON3_PACKAGES_PATH = $(python3 -c "из distutils.sysconfig import get_python_lib; print (get_python_lib())" )..

сделать

sudo make install