web-dev-qa-db-ja.com

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!

私のvlcmplayerはこのビデオを再生できますが、opencvは再生できません。

x264およびlibx264-142コーデックパッケージをインストールしました。 (Sudo apt-get installを使用)

私のubuntuのバージョンは14.04 trustyです。

コーデックの問題かどうかはわかりませんか?

OpencvをWITH_UNICAP=ONまたはWITH_UNICAP=OFFで再構築しましたが、問題にはまったく影響しません。エラーメッセージは変更されません。

14
AnnieFromTaiwan

コーデックの問題です

そのmp4ファイルをaviを持つffmpegファイルに変換しました。その後、上記のopencvコードは、そのaviファイルをうまく再生できます。

したがって、これはコーデックの問題であると確信しています。

(その後、ffmpegを使用して、そのmp4ファイルを別のmp4ファイルに変換しました。おそらくffmpegは、元の読み取り不能な.mp4コーデックを読み取り可能な.mp4コーデックに変換するのに役立ちますが、結果の.mp4ファイルは壊れている可能性があります、誰かがこの情報を必要とする場合に言及してください。)

それに対する答え-FFmpegを再構築してからOpencvを再構築する

これがコーデックの問題であることを知っているにもかかわらず、他の多くの方法を試しましたが、それでも解決できませんでした。ついにffmpegとopencvを再構築してみたところ、問題は解決しました!

次に、詳細な再構築手順を示します。

(1)ffmpegをビルド

  1. ダウンロードffmpeg-2.7.1.tar.bz2

    FFmpeg Webサイト: https://www.ffmpeg.org/download.html

    ffmpeg-2.7.1.tar.bz2リンク: http://ffmpeg.org/releases/ffmpeg-2.7.1.tar.bz2

  2. tar -xvf ffmpeg-2.7.1.tar.bz2
  3. cd ffmpeg-2.7.1
  4. ./configure --enable-pic --extra-ldexeflags=-pie

    から http://www.ffmpeg.org/platform.html#Advanced-linking-configuration

    FFmpegライブラリを静的にコンパイルし、それらを使用して独自の共有ライブラリを構築する場合は、PICサポートを強制する必要があります(FFmpegの構成中に--enable-picを使用)。

    ターゲットプラットフォームで位置に依存しないバイナリが必要な場合は、正しいリンクフラグ(-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/Ubunt

    例えばオプション--enable-libmp3lameを追加すると、pngエンコーダーが有効になります。 (./configureの前に、バージョン3.98.3以上のSudo apt-get install libmp3lame-devが必要です)

  5. make -j5(ffmpegフォルダーの下)
  6. Sudo make install

(2)Opencvのビルド

  1. wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.Zip
  2. unzip opencv-2.4.9.Zip
  3. cd opencv-2.4.9
  4. mkdir build
  5. cd build
  6. 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

  7. make -j5
  8. Sudo make install
  9. Sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
  10. Sudo ldconfig

これで、opencvコードはmp4ファイルをうまく再生するはずです!

試したがうまくいかなかった方法

  1. cmake opencvのときにWITH_UNICAP=ONWITH_V4L=ONを追加してみてください。しかし、まったく機能しませんでした。
  2. python opencvコード内でコーデックを変更してみてください。しかし、無駄です。

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

    print cap.get(cv2.cv.CV_CAP_PROP_FOURCC)

    これを2つの環境でテストしました。最初の環境ではopencvが機能し、もう1つの環境ではopencvがビデオを再生できません。しかし、両方とも同じコーデック828601953.0を出力しました。

    cap.set(cv2.cv.CV_CAP_PROP_FOURCC, cv2.cv.CV_FOURCC(*'H264'))でコーデックを変更しようとしましたが、まったく機能しませんでした。

  3. opencv-2.4.8/3rdparty/lib/の下のライブラリを、実行可能な環境のライブラリに変更してみてください。しかし、うまく構築することさえできませんでした。

    AVC: nal sizeをgrepすると、このエラーメッセージが含まれているライブラリがopencv-2.4.8/3rdparty/lib/libavcodec.aなどであることがわかります。そのため、それらを置き換えようとしました。しかし、これは悪い考えであることがわかりました。

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

    その一部とこの一部をインストールしてみてください。しかし、それはまったく役に立たなかった。

関連する問題

私はウェブを検索しましたが、同様の問題が数多くありますが、解決策はありませんでした!

以下は私のものと同じ問題だと思います。

  • OpenCV/ffmpegはmp4ビデオを再生しません。from opencv-users.nabble.com =

  • VideoCaptureはOpenCV 2.4.2で動作しませんfrom answers.opencv.org

    これはffmpegの再構築に言及しています!しかし、議論は私にとって十分ではありませんでした。

  • Mp4読み取りの問題-OpenCV 2.4.1およびpython 2.7をインストールし、aviファイルを正常に読み取る短いプログラムを作成しました。ただし、mp4ファイルの読み取りに失敗しますfrom answers.opencv .org

  • OpenCV 2.4.3を使用して「.mp4」ビデオファイルを開けない、Python 2.7 in _Windows 7 machinefrom スタックオーバーフロー

  • OpenCV 2.4 VideoCaptureがWindowsで動作しないfrom スタックオーバーフロー

25
AnnieFromTaiwan

ubuntu 14.04では、これが修正方法です。

OpenCVに必要な依存関係をインストールする "

Sudo apt-get remove ffmpeg x264 libx264-dev

須藤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-plugins-ugly 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 libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils解凍

須藤add-apt-repository ppa:mc3man/gstffmpeg-keep

須藤apt-getアップデート

Sudo apt-get install gstreamer0.10-ffmpeg

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

須藤apt-getアップデート

anaconda3内にffmpegをインストールします "

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ビルド

cdビルド

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_ON-VWITH DBUILD_PERF_TESTS = OFF -DCMAKE_BUILD_TYPE = RELEASE -DCMAKE_INSTALL_PREFIX = $(python3 -c "import sys; print(sys.prefix)")-DPYTHON3_EXECUTABLE = $(which python3.5)-DPYTHON3_INCLUDE_DIR = $(python3 -c.sys config from from import get_python_inc; print(get_python_inc()) ")-DPYTHON3_PACKAGES_PATH = $(python3 -c" from distutils.sysconfig import get_python_lib; print(get_python_lib()) ")..

make

Sudo make install

1
Jimmy