【问题标题】:Why can't I open avi video in openCV?为什么我无法在 openCV 中打开 avi 视频?
【发布时间】:2012-01-14 22:37:18
【问题描述】:

我刚刚用openCV2.3.1写了一个简单的视频阅读示例,但是我似乎无论如何都无法打开avi视频:(

VideoCapture capture("guitarplaying.avi");
if(!capture.isOpened()){
    std::cout<<"cannot read video!\n";
    return -1;
}
Mat frame;
namedWindow("frame");

double rate = capture.get(CV_CAP_PROP_FPS);
int delay = 1000/rate;

while(true)
{
    if(!capture.read(frame)){
        break;
    }
    imshow("frame",frame);

    if(waitKey(delay)>=0)
        break;
}

capture.release();

我在std::cout&lt;&lt;"cannot read video!\n"打了个断点,发现每次都停在这里。那么为什么avi视频打不开呢?谢谢!

【问题讨论】:

  • AVI 是一种文件格式,而不是视频格式。因此,您应该检查视频是否以支持的视频格式编码,因为 AVI 文件可能以不同的方式编码。

标签: c++ opencv image-processing video-capture


【解决方案1】:

OpenCV 的 ffmpeg.dll 缺失不会在 OpenCV 2.3.1 中生成任何警告/错误,并且代码会静默失败。确保路径中有正确的 opencv_ffmpeg*.dll。

【讨论】:

  • 这也困扰了我几个小时,直到我看到了这个答案
  • 我有这个确切的问题;无论我使用什么编码器,在我复制那个 DLL 之前它都无法加载。
  • 非常感谢!当可执行文件正在寻找 ffmpeg dll 时,我试图修复视频编解码器和用于在我的机器上渲染视频的代码。
  • 在 Windows 上,您需要像这样添加正确的文件夹:opencv\build\..\bin 从您将 opencv 提取到路径的位置。
  • +allthe1s 为此。 (我发现)Java 绑定也是如此;你的类路径中需要 FFmpeg dll。
【解决方案2】:

1)
确保视频文件实际上与应用程序位于同一文件夹中(我假设您已经尝试过),否则请指定绝对路径。

2)
如果您使用的是 Windows,则可能需要编解码器包来读取视频文件(例如,K-Lite Codec Pack)。

正如 Macmade 所建议的,AVI 只是一个容器,可以容纳不同的音频、视频甚至隐藏式字幕编解码器。此外,here 是 Zeranoe 为 Windows 构建的 FFmpeg。如果您执行以下操作,您可以获得有关文件编解码器内容的更多信息:

ffmpeg -i guitarplaying.avi

您应该会看到如下所示的输出:

ffmpeg version 0.8.7.git, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec  6 2011 09:20:43 with gcc 4.6.1
  configuration: --pkg-config=pkg-config --enable-gpl --enable-version3 --enable
-nonfree --enable-runtime-cpudetect --enable-memalign-hack --enable-postproc --a
rch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32- --prefix=/home/wluc
as/ffmpeg-cross/build/deploy --enable-libx264 --enable-libvpx --enable-zlib --en
able-bzlib --enable-libxvid --enable-libfaac --enable-libmp3lame --enable-libvor
bis --enable-libtheora --enable-libopenjpeg --enable-libfreetype
  libavutil    51. 30. 0 / 51. 30. 0
  libavcodec   53. 40. 0 / 53. 40. 0
  libavformat  53. 24. 0 / 53. 24. 0
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 51. 0 /  2. 51. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '..\..\Videos\Sintel\sintel_trailer-720p
.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    title           : Sintel Trailer
    artist          : Durian Open Movie Team
    encoder         : Lavf52.62.0
    copyright       : (c) copyright Blender Foundation | durian.blender.org
    description     : Trailer for the Sintel open movie project
  Duration: 00:00:52.20, start: 0.000000, bitrate: 1165 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720,
 1033 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 126
 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    :

所以,如您所见,这个 .mp4 容器有一个 H.264 视频编解码器和一个 AAC 音频编解码器。

【讨论】:

  • 扩展第 1 点:人们经常犯的错误是将图像文件(avi、jpg 等)与其源代码放在同一个文件夹中,而不是与编译程序放在同一个文件夹中。
  • 这描述了问题,但不是解决方案。 @nimcap 的回答解释了如何简洁准确地修复它。
  • 我复制了opencv_ffmpeg310.dll、opencv_ffmpeg310x64.dll问题解决了。非常感谢。
【解决方案3】:

可能是你加载了错误的lib文件。和我一样,我也遇到了同样的问题。但是我可以在VC6.0中打开AVI文件,使用opencv 1.0版本。最后,我发现我使用了错误的lib。

在调试模式下,但我使用opencv_core220.libopencv_highgui220.lib 。我将它们替换为opencv_core220d.libopencv_highgui220d.lib 。现在我可以阅读了。

【讨论】:

    【解决方案4】:

    在 OpenCV 2.4.4 中:只有 opencv_ffmpeg244.dll (release dll) 而没有 opencv_ffmpeg244d.dll (debug dll)

    所以尝试发布编译模式!

    【讨论】:

    • 我也遇到了同样的 DLL 缺失问题。 “发布”版本在调试和发布模式下都适用于我。
    【解决方案5】:

    我也遇到了同样的问题。使用 VideoCapture 的示例代码,我的 Visual Studio 程序无法打开任何视频文件。然后,nimcap 的建议对我有用。 “缺少 OpenCV 的 ffmpeg.dll 不会在 OpenCV 2.3.1 中生成任何警告/错误,并且代码会静默失败。确保路径中有正确的 opencv_ffmpeg*.dll。”

    解决方案:将opencv_ffmpeg.dll复制到我的visual studio项目/Debug文件夹,我几乎可以用VideoCapture打开任何视频文件。

    【讨论】:

      【解决方案6】:

      Windows x64 下,您无需重命名任何内容。只需将以下 ...\opencv\build\x64\vc12\bin 放入您的 PATH

      【讨论】:

        【解决方案7】:

        我只是补充一下,因为我花费的时间比我想承认的要多。无法打开文件导致了大量奇怪的异常。

        如果您发现绝对路径有效,而相对路径无效,则需要检查的另一件事是确保工作目录设置正确。

        在 Visual Studio 中,这是项目属性(配置属性) -> 调试 -> 工作目录。当我真正想要“$(OutDir)”时,我发现我的默认设置为“$(ProjectDir)”。

        【讨论】:

          【解决方案8】:

          对于那些没有找到解决方案的人: 在 openCV4 和“调试”模式下,请按照以下步骤操作:

          转到 opencv\build\x64\vc15\bin

          将“opencv_videoio_ffmpeg440_64.dll”复制到项目的调试文件夹中。

          【讨论】:

            【解决方案9】:

            您只需从 xvid.org 为您的机器下载 Xvid 即可:http://www.xvid.org/Downloads.15.0.html

            【讨论】:

              【解决方案10】:

              只需从这里更改您的代码:

              VideoCapture capture("guitarplaying.avi");
              

              对此:

              CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi");
              

              【讨论】:

                【解决方案11】:

                打开D:\OpenCV\build\x64\vc14\bin并根据您的Windows (x86 or x64)复制与您相关的opencv_ffmpeg320.dllopencv_ffmpeg320_64.dll

                opencv_ffmpeg320.dll -> 代表32-bit Windows (x86)

                opencv_ffmpeg320_64.dll -> 代表64-bit Windows (x64)

                将复制的.dll 粘贴到C:\Python27\ 或可从Windows PATH 环境变量访问的任何位置。

                或者,您可以创建一个文件夹D:\OpenCV\vendor\ 并将.dll 文件添加到该文件夹​​,然后将D:\OpenCV\vendor\ 添加到您的windows environment variables

                【讨论】:

                  【解决方案12】:

                  如果你使用的是 Ubuntu 16+,你可以试试这个:

                  pip install opencv-python

                  【讨论】:

                    猜你喜欢
                    • 2013-05-06
                    • 2015-12-29
                    • 2013-11-05
                    • 2017-10-19
                    • 2013-02-05
                    • 2015-09-11
                    • 2014-11-11
                    • 2017-05-03
                    • 1970-01-01
                    相关资源
                    最近更新 更多