有两种方式获取视频总时长:
video_time = float(ffmpeg.probe(video)['format']['duration'])
cap = cv2.VideoCapture(video)
video_time = float(cap.get(7) / cap.get(5))
例如:起始部分5s内容舍去,结尾部分10s内容舍去
ffmpeg -i video.mp4 -vcodec copy -acodec copy -ss start_time -to end_time out.mp4
ffmpeg -ss start_time -t duration_time -i video.mp4 -c:v libx264 -c:a aac -strict experimental -b:a 98k out.mp4 -y
// 通过传入秒数返回标准时间格式
def get_time(self, second):
m, s = divmod(int(second), 60)
h, m = divmod(m, 60)
return datetime.datetime.strptime(str("%d:%02d:%02d" % (h, m, s)), '%H:%M:%S')
// 开始处理视频
def deal_video(self, video_path, start_time, end_time)
// 获取视频总时长
video_time = float(ffmpeg.probe(video_path)['format']['duration'])
video_detail_time = self.get_time(video_time)
// 判断传入的时间是否有问题(开始结束时长不能大于总时长)
if int(start_time) + int(end_time) > int(video_time):
# 循环处理每个视频
self.fail_list.append(video)
continue
else:
// 获取截断起始时间(只保留时分秒)
cut_start_time = str(self.get_time(start_time)).split(" ")[1]
cut_end_time = str(video_detail_time - datetime.timedelta(seconds=int(end_time))).split(" ")[1]
// 获取视频名称
videos = video.split("\\")
video_out_path = save_video_path + "\\" + videos[len(videos) - 1]
self.cut_video(video, video_out_path, cut_start_time, cut_end_time)
// 开始使用ffmpeg进行视频截断操作
def cut_video(self, video_path, out_video_path, start_time, end_time):
try:
text = 'ffmpeg -ss \"%s\" -t \"%s\" -i \"%s\" -c:v libx264 -c:a aac -strict experimental -b:a 98k \"%s\" -y' % (
start_time, end_time, video_path, out_video_path)
res = os.system(text)
if res != 0:
self.fail_list.append(video_path)
logger.error('ffmpeg截断单个视频失败! 视频路径:' + str(video_path))
return False
logger.info('ffmpeg截断单个视频成功! 视频路径:' + str(video_path))
return True
except Exception as e:
logger.error('ffmpeg截断单个视频出现异常! 视频路径:' + str(video_path) + ";异常原因:" + str(e))
self.fail_list.append(video_path)
return False