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
相关产品推荐
相关产品推荐

