随意分享一下,最近几个月写的东西未来的急分享,当然我在 博客园账号 分享了些许东西,这里就不提博客园账号了,今天分享一个OpenCv的小知识,就是剪切视频,最初目的是帮助朋友剪切视频,网上大多数软件要么恶意连接下载,要么用几次就不让用了。今天分享一下吧。
一:视频的剪切
# @description:任意剪切视频方法的实现。
"""
关于网上好多人写的视频的剪切,为什么好多人复制代码,却发现剪切出来的视频是 0kb或者6kb可能原因之一:那是因为代码的作者忘了写一点,就是原视频
的图片的高度和宽度一定要和写入的保持一致[个人理解,不喜勿喷]也就是:
f_height = f_shape[0] # 原视频图片的高度
f_width = f_shape[1] # 代码中这点比较重要。
video_writer = cv2.VideoWriter(save_path, four_cc, fps, (int(f_width), int(f_height)))
"""
import os
import cv2
import math
def read_video():
"""
获取到输入的视频路径,并建立保存的路径。
:return:
"""
video_path = input(r'请输入视频的路径[eg:D:\Video\66.mp4]:')
all_info = video_path.split('\\')
file_name = all_info[-1].split('.')[0]
save_path = '\\'.join(all_info[:-1]) + '\\data' + '\\' + file_name + '.avi'
try:
if not os.path.exists(save_path):
os.mkdir('\\'.join(all_info[:-1]) + '\\data')
except FileExistsError as e:
print(u'保存路径已经创建......')
return video_path, save_path
def clip_video():
"""
对视频任意时间段进行剪切
:return:
"""
video_path, save_path = read_video()
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print('video is not opened')
else:
success, frame = cap.read()
f_shape = frame.shape
f_height = f_shape[0] # 原视频图片的高度
f_width = f_shape[1]
fps = cap.get(5) # 帧速率
frame_number = cap.get(7) # 视频文件的帧数
duration = frame_number / fps # 视频总帧数/帧速率 是时间/秒【总共有多少秒的视频时间】
print('请注意视频的总时间长度为 %s 秒' % str(duration))
start = input('请输入开始时间/秒为单位 例如输入:0[代表从第 0 秒开始剪切]:')
while True:
if int(start) > int(math.ceil(duration)):
start = input('输入结束时间大于总视频时间请重新输入......时间:')
else:
break
start_time = fps * float(start)
end = input('请输入结束时间/秒为单位 例如输入:10[代表到第 10 秒结束剪切]')
while True:
if int(end) > int(math.ceil(duration)):
end = input('输入结束时间大于总视频时间请重新输入......时间:')
else:
break
end_time = fps * float(end)
# AVI格式编码输出 XVID
four_cc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter(save_path, four_cc, fps, (int(f_width), int(f_height)))
num = 0
while True:
success, frame = cap.read()
if int(start_time) <= int(num) <= int(end_time):
if success:
video_writer.write(frame)
else:
break
num += 1
if num > frame_number:
break
cap.release()
if __name__ == '__main__':
clip_video()
你可以打包成exe分享给你的朋友,当然如果你用了作者的别忘了点赞哟。
二:图片合成视频的代码一并分享在这
# @description:把照片合成视频。
import os
import cv2
import uuid
def read_picture():
path = input('请输入视频的路径[eg:D:\Image\BaiDuImgDownLoad\liuhai]: ')
file_list = os.listdir(path)
fps = input('请输入视频的帧速率,秒为单位,一秒播放多少张照片:') # 视频每秒2帧
height = input('请输入视频图片尺寸的高度,视频的高清程序')
weight = input('请输入视频图片尺寸的宽度,视频的高清程序')
size = (int(height), int(weight)) # 需要转为视频的图片的尺寸
return [path, fps, size, file_list]
def write_video():
path, fps, size, file_list = read_picture()
# AVI格式编码输出 XVID
four_cc = cv2.VideoWriter_fourcc(*'XVID')
save_path = path + '\\' + '%s.avi' % str(uuid.uuid1())
video_writer = cv2.VideoWriter(save_path, four_cc, float(fps), size)
# 视频保存在当前目录下
for item in file_list:
if item.endswith('.jpg') or item.endswith('.png'):
# 找到路径中所有后缀名为.png的文件,可以更换为.jpg或其它
item = path + '\\' + item
img = cv2.imread(item)
re_pics = cv2.resize(img, size, interpolation=cv2.INTER_CUBIC) # 定尺寸
if re_pics:
video_writer.write(re_pics)
video_writer.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
write_video()
# 如果想加背景音乐可以在此代码的基础上添加,如果你不会可以联系作者哟。
当然如果想把视频每一帧给保存成图片也很简单,网上的教程也很简单,如果后续作者写了关于这部分的代码会分享上去的哈。