我用 chatgpt:
寫一段代碼,使用 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[i]
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")```
1
cutepig 2023-03-22 20:20:06 +08:00 via Android
會寫代碼不會 debug ?
|
3
arischow 2023-03-22 21:10:23 +08:00
繼續問 ChatGPT
|
4
raymanr 2023-03-22 21:12:38 +08:00
这代码每一行也太长了,懒得细看,删除文件是 os.remove
而且粗略看了下, 合并的文件名应该是 {output_file_name}hhh.mp4 吧,按理不该被删除才对 你把最后的循环删掉后再运行, 看看合并后的文件还再不在,如果合并后的文件不在,或许是 ffmpeg 的命令导致的合成后的文件被删除或者其他原因 |
5
zjvbqla OP @raymanr 哦 試了下,最終沒有合成。最後提示
Stream specifier ':0' in filtergraph description [0:0][1:0][2:0][3:0][4:0][5:0][6:0][7:0][8:0][9:0][10:0][11:0][12:0][13:0][14:0][15:0][16:0][17:0][18:0][19:0][20:0][21:0][22:0][23:0][24:0][25:0][26:0][27:0][28:0][29:0][30:0][31:0][32:0][33:0][34:0][35:0][36:0][37:0][38:0][39:0][40:0][41:0][42:0][43:0][44:0][45:0][46:0][47:0][48:0][49:0][50:0][51:0][52:0][53:0][54:0][55:0][56:0][57:0][58:0][59:0][60:0][61:0][62:0][63:0][64:0][65:0][66:0][67:0][68:0][69:0][70:0][71:0][72:0][73:0][74:0][75:0][76:0][77:0][78:0][79:0][80:0][81:0][82:0][83:0][84:0][85:0][86:0][87:0][88:0][89:0][90:0][91:0][92:0][93:0][94:0][95:0][96:0][97:0][98:0][99:0][100:0][101:0][102:0][103:0][104:0][105:0][106:0][107:0][108:0][109:0][110:0][111:0][112:0][113:0][114:0][115:0][116:0][117:0][118:0][119:0][120:0][121:0][122:0][123:0][124:0] concat=n=125:v=0:a=1 [a] matches no streams. 沒有匹配的流,我研究下爲啥。 怪不得。 |
6
piku 2023-03-22 21:29:05 +08:00 via Android
今天也是叫 chatgpt 改代码 bug 。你跟它说上述代码存在什么什么问题。它会给你新的建议
|
7
Jakarta 2023-03-22 21:42:43 +08:00 via Android
这 concat_cmd 看得真头疼
|