如何使用 python 重复片段的一部分 n 次
How to repeat parts of clips n number of time using python
说,我有一个视频,我把它分成 7 个部分,每个部分分别保存,它的长度是 20 秒。
clip1= VideoFileClip("first.mp4")
clip2= VideoFileClip("second.mp4")
clip3= VideoFileClip("third.mp4")
clip5= VideoFileClip("Fourth.mp4")
clip4= VideoFileClip("Fifth.mp4")
clip7= VideoFileClip("sixth.mp4")
clip6= VideoFileClip("seventh.mp4")
final_clip=concatenate_videoclips([clip1,clip2,clip3,clip4,clip5,clip6,clip7])
final_clip.write_videofile("new1.mp4")
现在我想做的是,我想创建一个程序,通过随机重复这些片段来将这段视频延长到指定的时间。
比如我想通过在 python 中随机重复这 7 个片段,将这个 20 秒长的片段制作成 1 小时长。因此生成的视频将长达 1 小时,但将包含这 7 个片段的随机排列和重复。
有人能告诉我怎么做吗?
如果您为每个剪辑分配一个 ID,为简单起见,假设为 0-6,为什么不随机生成一个列表,其中包含您需要达到 1 小时的剪辑:
import random
# 1 hour is 3600 seconds
total_duration = 3600
clip_duration = 20
# 180 clips are needed to get an hour-long video
num_clips_required = int(total_duration / clip_duration)
# perform random sampling with replacement
list_of_clips = random.choices(range(7), k=num_clips_required)
您可以使用 moviepy
构建您的最终剪辑:
from moviepy.editor import VideoFileClip, concatenate_videoclips
# construct some dictionary containing ids as keys, and VideoFileClip objects as values
D = {0:VideoFileClip("path_to_clip_0.mp4"),
1:VideoFileClip("path_to_clip_1.mp4"),
# etc...
}
然后,通过执行以下操作编写最终剪辑:
combined = concatenate_videoclips([D[id] for id in list_of_clips])
combined.write_videofile("combined.mp4")
import numpy as np
import random
import cv2
import os
videolist = os.listdir("path to video dir")
while True:
cap = cv2.VideoCapture("path to video dir/{}.webm".format(random.choice(videolist)))
while cap.isOpened():
ret, frame = cap.read()
cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("window",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
if ret:
cv2.imshow("Image", frame)
else:
print("no video")
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
说,我有一个视频,我把它分成 7 个部分,每个部分分别保存,它的长度是 20 秒。
clip1= VideoFileClip("first.mp4")
clip2= VideoFileClip("second.mp4")
clip3= VideoFileClip("third.mp4")
clip5= VideoFileClip("Fourth.mp4")
clip4= VideoFileClip("Fifth.mp4")
clip7= VideoFileClip("sixth.mp4")
clip6= VideoFileClip("seventh.mp4")
final_clip=concatenate_videoclips([clip1,clip2,clip3,clip4,clip5,clip6,clip7])
final_clip.write_videofile("new1.mp4")
现在我想做的是,我想创建一个程序,通过随机重复这些片段来将这段视频延长到指定的时间。
比如我想通过在 python 中随机重复这 7 个片段,将这个 20 秒长的片段制作成 1 小时长。因此生成的视频将长达 1 小时,但将包含这 7 个片段的随机排列和重复。
有人能告诉我怎么做吗?
如果您为每个剪辑分配一个 ID,为简单起见,假设为 0-6,为什么不随机生成一个列表,其中包含您需要达到 1 小时的剪辑:
import random
# 1 hour is 3600 seconds
total_duration = 3600
clip_duration = 20
# 180 clips are needed to get an hour-long video
num_clips_required = int(total_duration / clip_duration)
# perform random sampling with replacement
list_of_clips = random.choices(range(7), k=num_clips_required)
您可以使用 moviepy
构建您的最终剪辑:
from moviepy.editor import VideoFileClip, concatenate_videoclips
# construct some dictionary containing ids as keys, and VideoFileClip objects as values
D = {0:VideoFileClip("path_to_clip_0.mp4"),
1:VideoFileClip("path_to_clip_1.mp4"),
# etc...
}
然后,通过执行以下操作编写最终剪辑:
combined = concatenate_videoclips([D[id] for id in list_of_clips])
combined.write_videofile("combined.mp4")
import numpy as np
import random
import cv2
import os
videolist = os.listdir("path to video dir")
while True:
cap = cv2.VideoCapture("path to video dir/{}.webm".format(random.choice(videolist)))
while cap.isOpened():
ret, frame = cap.read()
cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("window",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
if ret:
cv2.imshow("Image", frame)
else:
print("no video")
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()