Python3 代码修复:解决 FFmpeg 'Invalid duration specification for ss: -to' 错误

在使用 Python3 和 FFmpeg 剪辑视频时,可能会遇到 'Invalid duration specification for ss: -to' 错误。这通常是由于在使用 -to 参数指定结束时间时,没有正确判断输入是否为空导致的。本文将提供修复代码并进行详细说明。

错误原因

-to 参数用于指定视频剪辑的结束时间。如果在输入结束时间 end_time 之前没有判断是否为空,则在 end_time 为空的情况下,FFmpeg 会尝试使用空字符串作为结束时间,导致错误。

修复代码

import os
import subprocess

# 定义输入输出文件路径
input_path = ''
output_path = ''

# 获取视频列表
def get_video_list(path):
    video_list = []
    if os.path.isfile(path) and path.endswith('.mp4'):
        video_list.append(path)
    elif os.path.isdir(path):
        for file_name in os.listdir(path):
            if file_name.endswith('.mp4'):
                video_list.append(os.path.join(path, file_name))
    return video_list

# 按照最后修改时间排序
def sort_video_list(video_list):
    video_list.sort(key=lambda x: os.path.getmtime(x), reverse=True)
    return video_list

# 剪辑视频
def clip_video(video_path, start_time='00:00:00', end_time=None):
    video_name = os.path.basename(video_path)
    output_path = os.path.join(os.path.dirname(video_path), 'clip_' + video_name)
    if end_time is None:
        cmd = 'ffmpeg -i '{}' -ss {} -c copy '{}''.format(video_path, start_time, output_path)
    else:
        cmd = 'ffmpeg -i '{}' -ss {} -to {} -c copy '{}''.format(video_path, start_time, end_time, output_path)
    subprocess.call(cmd, shell=True)

# 主程序
if __name__ == '__main__':
    # 输入视频路径
    input_path = input('请输入视频路径:')

    # 获取视频列表并排序
    video_list = get_video_list(input_path)
    if not video_list:
        print('输入的路径不是一个视频文件或者包含视频文件的目录!')
    else:
        video_list = sort_video_list(video_list)

        # 显示视频列表
        for i, video_name in enumerate(video_list):
            print('{}: {}'.format(i+1, os.path.basename(video_name)))

        # 选择要剪辑的视频
        selected_video_index = int(input('请选择要剪辑的视频序号:'))

        # 输入开始和结束时间
        start_time = input('请输入剪辑的开始时间(格式为hh:mm:ss):')
        end_time = input('请输入剪辑的结束时间(格式为hh:mm:ss,可为空):')
        if not end_time:
            end_time = None

        # 剪辑视频
        selected_video_path = video_list[selected_video_index-1]
        clip_video(selected_video_path, start_time, end_time)

代码说明

  1. clip_video 函数中,我们添加了对 end_time 的判断:

    if end_time is None:
        cmd = 'ffmpeg -i '{}' -ss {} -c copy '{}''.format(video_path, start_time, output_path)
    else:
        cmd = 'ffmpeg -i '{}' -ss {} -to {} -c copy '{}''.format(video_path, start_time, end_time, output_path)
    

    如果 end_time 为空,则不使用 -to 参数,直接使用 -ss 参数剪辑视频。

  2. 我们将 ffmpeg 命令中的双引号替换成了单引号,以避免在路径中出现特殊字符时导致命令解析错误。

总结

通过判断 end_time 是否为空并根据情况选择使用 -to 参数,我们成功修复了 'Invalid duration specification for ss: -to' 错误,并确保了 Python3 代码能够正确地剪辑视频。

希望本教程能够帮助您解决类似的问题!如果您还有其他问题,请随时提问。

Python3 代码修复:解决 FFmpeg 'Invalid duration specification for ss: -to' 错误

原文地址: https://www.cveoy.top/t/topic/nzD2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录