Python OpenCV动态向视频添加文字:生成的MP4输出文件为空(0KB)的问题
解决OpenCV写入视频为空文件的问题
我刚看完你的代码,能正常显示带文字的视频但输出文件是0KB的问题,主要出在这几个关键细节上,咱们一步步来修复:
问题点分析
- 忘记释放VideoWriter对象:你只释放了视频捕获的
cap,但负责写入视频的out实例没有调用out.release(),这会导致缓冲区里的视频数据一直没写入磁盘,最终生成空文件。 - VideoWriter尺寸与原视频不匹配:你固定写死了
(640,480)的分辨率,但原视频的实际尺寸可能不是这个数值。OpenCV要求写入的每帧尺寸必须和初始化VideoWriter时的尺寸完全一致,否则会直接写入失败。 - 颜色参数超出合法范围:
cv.putText里的颜色是(B,G,R)格式,每个通道取值只能是0-255,你写的(0,640,480)超出了上限,虽然不影响文件写入,但会导致文字显示异常。 - 未检查帧读取状态:循环里没判断
ret的真假,当视频读取完毕或出错时,ret为False,此时frame是None,调用cv.putText会直接触发异常进入except块,这时候也没机会释放out。
修正后的代码
import cv2 as cv # 修复路径:原路径末尾的反斜杠会转义单引号,这里调整写法 video_path = r'C:\Users\semnome\Desktop\automatizacoes\m\a.mp4' cap = cv.VideoCapture(video_path) # 动态获取原视频的关键参数:帧率、宽高 fps = cap.get(cv.CAP_PROP_FPS) frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)) fourcc = cv.VideoWriter_fourcc(*'mp4v') # 用原视频的参数初始化VideoWriter,保证尺寸匹配 out = cv.VideoWriter('output.mp4', fourcc, fps, (frame_width, frame_height)) try: while cap.isOpened(): ret, frame = cap.read() # 检查帧是否读取成功 if not ret: print("视频已读取完毕或出现读取错误") break font = cv.FONT_HERSHEY_SIMPLEX # 修正颜色为合法范围的黄色(B=0, G=255, R=255) cv.putText(frame, 'TEXT ON VIDEO', (50, 50), font, 1, (0, 255, 255), 2, cv.LINE_4) out.write(frame) cv.imshow('video', frame) # 按q键退出循环 if cv.waitKey(1) & 0xFF == ord('q'): break finally: # 无论循环正常结束还是出错,都确保释放所有资源 cap.release() out.release() # 关键:必须释放VideoWriter才能完成文件写入 cv.destroyAllWindows()
关键修正说明
- 路径修正:解决了原路径中反斜杠转义单引号的问题,确保能正确找到原视频文件。
- 动态参数获取:通过
cap.get()获取原视频的真实帧率和分辨率,避免了尺寸不匹配导致的写入失败。 - 帧读取检查:添加
if not ret的判断,避免处理无效的空帧。 - 资源安全释放:用
finally块保证不管程序是否出错,都会释放所有捕获和写入对象,确保视频数据写入磁盘。 - 合法颜色值:调整文字颜色到0-255的合法范围,保证文字正常显示。
内容的提问来源于stack exchange,提问作者diegooli
相关产品推荐
相关产品推荐

