You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV 4.8虚拟机读取AVI视频失败,报hdrl/movi异常求助

解决OpenCV读取AVI时"Unexpected list type. Expected: hdrl. Got: movi."错误

问题背景

在Ubuntu虚拟机中使用OpenCV 4.8读取一段1分钟的AVI视频时触发错误,相同代码在Google Colab可正常运行。

关键读取代码:

cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
    print(f"Error opening video file: {video_path}")
    return

虚拟机运行时错误:

Unexpected list type. Expected: hdrl. Got: movi.

通过ffprobe查看视频信息,确认视频为rawvideo(I420)编码,容器为AVI,且视频本身无损坏:

(venv) ubuntu@bellizzi:~/data/ecg-fitness_raw-v1.0$ ffprobe /home/ubuntu/data/ecg-fitness_raw-v1.0/10/01/c920-1.avi
ffprobe version 3.4.11-0ubuntu0.1 Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, avi, from '/home/ubuntu/data/ecg-fitness_raw-v1.0/10/01/c920-1.avi':
  Metadata:
    encoder         : Lavf57.56.100
  Duration: 00:01:00.00, start: 0.000000, bitrate: 746501 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1920x1080, 746910 kb/s, 30 fps, 30 tbr, 30 tbn, 30 tbc

问题原因

这个错误是因为OpenCV默认的AVI解析器对容器结构要求严格:标准AVI容器需要先包含hdrl(头部信息块),再包含movi(视频数据块),但你的AVI文件结构可能是movi块在前,或者头部信息存在异常。

ffmpeg的解析器容错性远强于OpenCV自带的AVI处理模块,所以ffprobe能正常识别;而Google Colab中的OpenCV依赖更新版本的ffmpeg库,因此也能处理这种非标准结构的AVI文件。

解决方案

1. 重新封装视频(最快解决)

用ffmpeg重新整理AVI容器结构,无需重新编码,仅调整块的顺序:

ffmpeg -i /home/ubuntu/data/ecg-fitness_raw-v1.0/10/01/c920-1.avi -c:v copy -c:a copy /home/ubuntu/data/ecg-fitness_raw-v1.0/10/01/c920-1-fixed.avi

之后用新生成的视频文件测试代码即可。

2. 强制OpenCV使用FFmpeg后端读取

修改初始化VideoCapture的代码,指定使用ffmpeg后端(需确保OpenCV编译时已启用ffmpeg支持):

cap = cv2.VideoCapture(video_path, cv2.CAP_FFMPEG)
if not cap.isOpened():
    print(f"Error opening video file: {video_path}")
    return

ffmpeg后端的解析逻辑和ffprobe一致,能兼容非标准结构的AVI文件。

3. 更新虚拟机中的FFmpeg并重新编译OpenCV

如果上述方法无效,可以尝试更新虚拟机中的ffmpeg到新版本(比如5.x以上),然后重新编译OpenCV,让其链接新的ffmpeg库,提升解析兼容性。

内容的提问来源于stack exchange,提问作者leonardo20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:44:53