解决问题
我想将一个mp4格式的视频按视频播放顺序截30张图片,也就是按视频时长平均截30张图,并保存在指定文件夹内。接下来就以视频female-1-casual.mp4为例,输入路径和输出路径都是我自己设置的,如果需要使用代码,记得按自己的路径改。
代码实现
from moviepy.editor import VideoFileClip
import os
import cv2
from PIL import Image
# 视频文件路径
video_path = 'F:\\admin\\Downloads\\Nerf\\dataset\\people_snapshot_public\\female-1-casual\\female-1-casual.mp4'
# 输出文件夹路径
output_folder = 'F:\\admin\\Downloads\\Nerf\\dataset\\MyDataset\\llfftest\\images\\1'
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 读取视频文件
clip = VideoFileClip(video_path)
# 获取视频时长(秒)
duration = clip.duration
# 计算每隔多少秒截取一帧
frame_interval = duration / 30
# 定义帧的数量
frame_number = 1
# 编号和保存截图
for frame in clip.iter_frames(fps=frame_interval):
# 将帧转换为RGB模式
#frame = Image.fromarray(frame)
#rgb_frame = frame.convert('RGB')
# 检查帧是否是RGB格式
if frame.shape[-1] == 3:
# 如果是RGB格式,可以在这里进行进一步的处理或保存
pass
else:
# 如果不是RGB格式,可以将它转换为RGB格式
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 保存截图
if frame_number>30:
break
image_path = os.path.join(output_folder, f'{frame_number}.png')
#将numpy.ndarray对象转换为PIL图像:
image = Image.fromarray(frame)
#最后,将图像保存到指定路径
image.save(image_path)
#frame_number迭代
frame_number += 1
print("截图已保存到:", output_folder)
实现效果
输入视频:
生成效果: