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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:12:40