抱歉,麻煩大佬看看這段代碼問題在哪裏?

2023-03-22 20:17:54 +08:00
 zjvbqla

我用 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")```
983 次点击
所在节点    问与答
7 条回复
cutepig
2023-03-22 20:20:06 +08:00
會寫代碼不會 debug ?
zjvbqla
2023-03-22 20:25:06 +08:00
@cutepig 會寫代碼的是 chatgpt ,不是我!見笑了!
arischow
2023-03-22 21:10:23 +08:00
繼續問 ChatGPT
raymanr
2023-03-22 21:12:38 +08:00
这代码每一行也太长了,懒得细看,删除文件是 os.remove

而且粗略看了下, 合并的文件名应该是 {output_file_name}hhh.mp4 吧,按理不该被删除才对

你把最后的循环删掉后再运行, 看看合并后的文件还再不在,如果合并后的文件不在,或许是 ffmpeg 的命令导致的合成后的文件被删除或者其他原因
zjvbqla
2023-03-22 21:19:37 +08:00
@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.
沒有匹配的流,我研究下爲啥。
怪不得。
piku
2023-03-22 21:29:05 +08:00
今天也是叫 chatgpt 改代码 bug 。你跟它说上述代码存在什么什么问题。它会给你新的建议
Jakarta
2023-03-22 21:42:43 +08:00
这 concat_cmd 看得真头疼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/926319

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX