寫一段代碼,使用 ffmpeg 把當前目錄下的長視頻分割成 4-8 隨機秒數的若干段視頻,並且把分割後的視頻隨機排序,但排序要確保原來相鄰的片段不再相鄰,最後按照排序后的順序合成新的視頻,輸入文件名不要固定爲 input.mp4 ,而是要遍歷當前目錄下的任意文件名視頻文件。
代碼是可以運行,並且也在切割,但是切割完成,到最後全部刪光了,連最後的合成視頻也刪掉了。問題出在哪?
import random
import glob
# 获取当前工作目录
current_dir = os.getcwd()
# 视频文件名,使用 glob 模块获取
video_files = glob.glob("*.mp4") + glob.glob("*.avi") + glob.glob("*.mkv")
# 分割后的视频文件名前缀
output_file_name = "output"
# 随机分割时间的范围,单位:秒
min_duration = 4
max_duration = 8
# 对每个视频文件执行分割、随机化和合并操作
for video_file_name in video_files:
# 获取视频文件时长
get_duration_cmd = f"ffprobe -i {video_file_name} -show_entries format=duration -v quiet -of csv='p=0'"
duration = float(os.popen(get_duration_cmd).read().strip())
# 计算分割次数
num_pieces = int(duration // min_duration)
# 分割视频
for i in range(num_pieces):
start_time = random.uniform(0, duration - min_duration)
end_time = min(start_time + random.uniform(min_duration, max_duration), duration)
output_file = f"{output_file_name}_{i}.mp4"
trim_cmd = f"ffmpeg -i {video_file_name} -ss {start_time} -to {end_time} -c copy -avoid_negative_ts 1 {output_file}"
os.system(trim_cmd)
# 随机排序分割后的视频
pieces = os.listdir(current_dir)
random.shuffle(pieces)
# 确保原来相邻的视频不再相邻
for i in range(1, num_pieces):
prev_file = pieces[i-1]
curr_file = pieces
if prev_file.startswith(output_file_name) and curr_file.startswith(output_file_name):
temp_file = f"temp_{curr_file}"
os.rename(curr_file, temp_file)
os.rename(prev_file, curr_file)
os.rename(temp_file, prev_file)
# 合成分割后的视频
concat_cmd = "ffmpeg"
for i in range(num_pieces):
input_file = f"{output_file_name}_{i}.mp4"
concat_cmd += f" -i {input_file}"
concat_cmd += f" -filter_complex \"{''.join([f'[{i}:0]' for i in range(num_pieces)])} concat=n={num_pieces}:v=0:a=1 [a]\" -map [a] {output_file_name}hhh.mp4"
os.system(concat_cmd)
# 删除临时视频文件
for i in range(num_pieces):
os.remove(f"{output_file_name}_{i}.mp4")```
num_pieces, 視頻, 分割, range