OpenCV读取MP4文件失败,报get_buffer() failed错误求助
解决OpenCV读取MP4帧时get_buffer()失败的问题
问题分析
你遇到的get_buffer() failed系列错误,根源是旧版本opencv-python的FFmpeg后端存在内存分配或编解码器交互bug,和视频文件本身无关——你能通过FFmpeg正常转格式就证明文件没问题。重启/扩容内存偶尔能解决,是因为内存碎片化被临时消除,刚好避开了bug触发条件。
具体解决方案
1. 升级OpenCV到4.x版本
你的opencv-python 3.4.18.65属于老旧的3.x分支,该分支在FFmpeg后端的内存管理上有已知缺陷。直接升级到4.x稳定版:
pip install --upgrade opencv-python
新版本修复了大量编解码器兼容性和内存分配问题,这是最彻底的解决办法。
2. 更换视频捕获后端
不要强制指定cv2.CAP_FFMPEG,让OpenCV自动选择最优后端,或者尝试Linux原生的V4L2后端:
video_path = 'test.mp4' # 方案A:自动选择后端 cam = cv2.VideoCapture(video_path) # 方案B:尝试V4L2后端(Linux专属) # cam = cv2.VideoCapture(video_path, cv2.CAP_V4L2) if not cam.isOpened(): print("无法打开视频文件") exit() success, image = cam.read() count = 0 while success: print(f'读取第{count+1}帧成功') success, image = cam.read() count += 1 cam.release()
3. 重新封装视频(临时 workaround)
用FFmpeg重新生成兼容更好的视频文件,修复可能的容器元数据异常:
ffmpeg -i test.mp4 -c:v libx264 -preset fast -crf 23 -c:a copy test_fixed.mp4
用处理后的test_fixed.mp4再尝试读取,能避开旧OpenCV的兼容性问题。
4. 清理系统内存碎片
重启能解决说明存在内存碎片化,可在运行脚本前手动清理系统缓存:
sudo sync && sudo sysctl -w vm.drop_caches=3
这个命令会清理页缓存、目录项等临时内存占用,减少碎片化。
内容的提问来源于stack exchange,提问作者Alex Murphy
相关产品推荐
相关产品推荐

