# -- coding: utf-8 -- # @Time : 2023/2/08 14:58 # @Author : Calvin # @Email : 934055521@qq.com # @File : videoCrop.py # @use : # @Software: VS Code from tqdm import tqdm import numpy as np import cv2 import os def longVideo_to_shortVideo(): for video in tqdm(os.listdir(video_folder_path), ncols=80, ascii=True, desc="Reading video"): video_name = video.split('.')[0] + "_" cap = cv2.VideoCapture(os.path.join(video_folder_path, video)) #获取视频(用绝对路径) cap.isOpened() #判断视频是否能顺利打开读取,True为能打开,False为不能打开 #获取视频信息 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) #获得视频帧宽和帧高 if cap.isOpened(): # 当成功打开视频时cap.isOpened()返回True, 否则返回False rate = cap.get(5) # cap.get()括号中的参数为5代表获取帧速率 FrameNumber = int(cap.get(7)) # 获取视频文件的总帧数 duration = FrameNumber/rate # 视频总帧数除以帧速率等于视频时间,除以60之后的单位就是分钟 fps = int(25) # 每一段小视频帧数(我这个视频1秒钟的视频17帧),也用于后面的写入视频的帧速率 success, frame = cap.read() # cap.read() 返回一个布尔值给sucess(True/False)。如果帧读取的是正确的,就是True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。返回视频帧给frame i = 0 j = 0 while (True): success, frame = cap.read() # cap.read()表示按帧读取视频,success,frame获得cap.read()的两个返回值 # 其中success是布尔值,取帧是正确的则返回TRUE,如果文件读到结尾它的返回值就是False # frame就是每一帧图像,是一个三维矩阵 if success: i += 1 if (i % (15 * fps) == 1): # 每15秒保存一段小视频,每一秒的视频有17帧,这里一共保存了5秒(如果你想保存其他时长的视频,你只需要更改5这个数字) # cap.read()按帧读取视频,每读取一帧,i就+1, # 当读取到的帧数能整除每段小视频的帧数了,那就把视频保存下来 j += 1 videoWriter = cv2.VideoWriter(os.path.join(video_save_path, video_name + str(j) + '.mp4'), cv2.VideoWriter_fourcc('D', 'I', 'V', 'X'), fps, (int(width), int(height))) # 分别是:保存文件名、编码器、帧率、视频宽高 # 视频全部保存在了本代码所在的文件夹中,若你保存的小视频长度都为1秒,因为保存的是帧速率大小的帧图像,也就是每秒17帧的速率,就刚好保存了每秒17帧的小视频 videoWriter.write(frame) # 写入帧图像 else: videoWriter.write(frame) else: print('end') break cap.release() #释放摄像头 if __name__ == '__main__': video_folder_path = "./" video_save_path = video_folder_path.replace("Raw_LongVideo", "Res_ShortVideo") if not os.path.isdir(video_save_path): os.makedirs(video_save_path) longVideo_to_shortVideo() # 长视频裁剪为15秒一段的短视频