使用OpenCV合并两个.AVI视频失败,求解决方案
解决OpenCV合并AVI视频失败的问题
问题描述
尝试用OpenCV将两个AVI视频按顺序合并,输出文件仅14KB且无法在VLC播放。两个输入视频由Fiji的TrackMate生成,大小分别为6.6MB和6.2MB,时长均为10秒。使用的代码如下:
import cv2 path = '/Volumes/GQA HD/GQA Experiments/2023_01_27/' file1 = 'TrackMate capture of 1.avi' file2 = 'TrackMate capture of 2.avi' file_combined = 'TrackMate Combined captures of IMG_0240.avi' # Paths of videos videos = [path+file1, path+file2] # Create new video fourcc = cv2.VideoWriter_fourcc('M','J','P','G') frameSize=(720,1280) fps=30 video = cv2.VideoWriter(path+file_combined, fourcc, fps, frameSize) # Write all frames sequentially to new video for v in videos: curr_v = cv2.VideoCapture(v) while curr_v.isOpened(): r, frame = curr_v.read() # Get return value and curr frame of curr video if not r: break video.write(frame) # Write the frame video.release() # Save the video
解决方案
匹配原视频的关键参数
手动指定的frameSize和fps可能与输入视频实际参数不匹配,导致VideoWriter无法正常写入帧。应该从输入视频中读取这些参数:# 从第一个视频获取基准参数 cap = cv2.VideoCapture(videos[0]) fps = cap.get(cv2.CAP_PROP_FPS) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) cap.release() # 用原视频参数初始化VideoWriter fourcc = cv2.VideoWriter_fourcc(*'MJPG') video = cv2.VideoWriter(path+file_combined, fourcc, fps, (frame_width, frame_height))添加视频读取有效性检查
确保每个输入视频都能成功打开,避免因读取失败导致空帧写入:for v in videos: curr_v = cv2.VideoCapture(v) if not curr_v.isOpened(): print(f"无法加载视频文件: {v}") continue while curr_v.isOpened(): ret, frame = curr_v.read() if not ret: break # 确保帧尺寸与输出一致,不一致则调整 if frame.shape[:2] != (frame_height, frame_width): frame = cv2.resize(frame, (frame_width, frame_height)) video.write(frame) curr_v.release() # 及时释放当前视频资源验证FourCC编码兼容性
MJPG编码虽通用,但部分环境可能存在兼容性问题。如果仍失败,可尝试替换为cv2.VideoWriter_fourcc(*'XVID'),或者留空参数让OpenCV自动适配(部分版本支持)。确保资源彻底释放
每个输入视频处理完成后必须调用curr_v.release(),避免资源泄漏导致视频写入不完整。
内容的提问来源于stack exchange,提问作者Steven Basmith
相关产品推荐
相关产品推荐

