先说原理:
通过视频编码器将每一帧写入输出视频文件,从而实现了将视频每帧保存下来的功能。
# Yu_Jifeng
# 开发时间:2023/4/13 14:16
import cv2
import os
input_folder = r'E:\video' # 输入视频文件夹路径
output_folder = r'E:\toolbox_test\test_video_output' # 输出视频文件夹路径
os.makedirs(output_folder, exist_ok=True) # 创建输出文件夹,如果不存在
# 获取文件夹下所有视频文件的路径
video_files = [f for f in os.listdir(input_folder) if f.endswith('.mp4') or f.endswith('.avi')]
for video_file in video_files:
video_path = os.path.join(input_folder, video_file) # 构建输入视频文件的完整路径
cap = cv2.VideoCapture(video_path) # 打开视频文件
# 获取视频帧率、宽度和高度
fps = int(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))
# 构建输出视频文件名
output_file = os.path.splitext(video_file)[0] + '.avi'
output_path = os.path.join(output_folder, output_file) # 构建输出视频文件的完整路径
# 创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 定义视频编码器
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
while True:
ret, frame = cap.read() # 读取视频帧
if not ret:
break # 如果无法读取帧,则退出循环
out.write(frame) # 将帧写入输出视频
cv2.imshow('Frame', frame) # 显示当前帧
if cv2.waitKey(1) & 0xFF == ord('q'):
break # 如果按下'q'键,则退出循环
cap.release() # 释放视频文件
out.release() # 释放输出视频文件
cv2.destroyAllWindows() # 关闭所有窗口
将你那些损坏的视频路径input_folder里面;新的存储视频路径放在output_folder上。
如果不想显示把imshow注掉就好了;热键q退出这个视频的读取。
具体的原理如下:
-
首先,通过
cv2.VideoCapture
函数打开输入视频文件,获取视频的帧率、宽度和高度等信息。 -
然后,通过
cv2.VideoWriter
函数创建一个视频写入对象,设置输出视频的编码器、帧率和分辨率等参数。 -
进入循环,通过
cap.read()
函数读取输入视频文件的每一帧,并将其写入输出视频文件。 -
循环内还包含对按键的检测,下'q'键会退出循环,停止录制。
-
最后,在循环结束后,通过
cap.release()
和out.release()
函数释放输入和输出视频文件的资源,关闭所有窗口。
代码会将输入视频文件的每一帧保存到输出视频文件中,从而实现了将视频每帧保存下来的目的。你可以根据需要自定义其他功能,例如在每一帧上进行图像处理操作。