OpenCV VideoWriter写入视频帧失败 输出文件仅258字节无法播放
问题诊断
代码里三个问题直接导致写不出有效视频:
- 帧格式不对:
mss.grab()截出来的图是带Alpha透明通道的BGRA四通道格式,你写的两次颜色转换纯做无用功:先RGB转BGR再BGR转RGB,全程没把多余的Alpha通道去掉,而且初始转换用的颜色码和源图格式根本不匹配。cv2.VideoWriter默认只收三通道BGR格式的帧,格式不对的时候write()方法不会报错,只会静默返回False,啥都不写,你打印的capture值应该从运行开始全是False。 - 没释放写入器:循环退出后没调用
captured_video.release(),VideoWriter不会把内存里缓存的帧刷到磁盘上,最后文件就剩个200多字节的MP4空壳头,根本没法播放。 - 编码兼容问题:不少OpenCV版本里
mp4v配MP4容器容易出问题,换成avc1编码兼容性好很多。
修正后可运行代码
import datetime import numpy as np import cv2 import mss time_stamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') # 换兼容性更好的avc1编码,若仍有问题可换回mp4v fourcc = cv2.VideoWriter_fourcc(*"avc1") # 分辨率参数注意和截图区域的宽高严格对应,顺序是(宽度, 高度) captured_video = cv2.VideoWriter(f"{time_stamp}.mp4", fourcc, 20.0, (1080, 720)) with mss.mss() as sct: monitor = {"top": 0, "left": 0, "width": 1080, "height": 720} while True: img = np.array(sct.grab(monitor)) # 直接把BGRA 4通道截图转成VideoWriter需要的3通道BGR格式,删掉无效的重复转换 img_final = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) cv2.imshow('LevelRecorder', img_final) captured_video.write(img_final) if cv2.waitKey(10) == ord("q"): break # 循环结束后必须释放资源,把缓存帧写入磁盘 captured_video.release() cv2.destroyAllWindows()
额外说明
如果运行后还是无法写入,可以先打印captured_video.isOpened()检查视频写入器是否初始化成功,如果返回False说明当前环境不支持你选的编码,换个fourcc编码即可,比如在Windows上也可以试*"XVID"搭配avi后缀。
内容的提问来源于stack exchange,提问作者RadicalSpace
相关产品推荐
相关产品推荐

