V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zjvbqla
V2EX  ›  问与答

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

  •  
  •   zjvbqla · 2023-03-22 20:17:54 +08:00 · 988 次点击
    这是一个创建于 616 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 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")```
    7 条回复    2023-03-22 21:42:43 +08:00
    cutepig
        1
    cutepig  
       2023-03-22 20:20:06 +08:00 via Android
    會寫代碼不會 debug ?
    zjvbqla
        2
    zjvbqla  
    OP
       2023-03-22 20:25:06 +08:00 via iPhone
    @cutepig 會寫代碼的是 chatgpt ,不是我!見笑了!
    arischow
        3
    arischow  
       2023-03-22 21:10:23 +08:00
    繼續問 ChatGPT
    raymanr
        4
    raymanr  
       2023-03-22 21:12:38 +08:00
    这代码每一行也太长了,懒得细看,删除文件是 os.remove

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

    你把最后的循环删掉后再运行, 看看合并后的文件还再不在,如果合并后的文件不在,或许是 ffmpeg 的命令导致的合成后的文件被删除或者其他原因
    zjvbqla
        5
    zjvbqla  
    OP
       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
        6
    piku  
       2023-03-22 21:29:05 +08:00 via Android
    今天也是叫 chatgpt 改代码 bug 。你跟它说上述代码存在什么什么问题。它会给你新的建议
    Jakarta
        7
    Jakarta  
       2023-03-22 21:42:43 +08:00 via Android
    这 concat_cmd 看得真头疼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:44 · PVG 05:44 · LAX 13:44 · JFK 16:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.