import os
import subprocess

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

# 支持的视频格式
supported_formats = ['.mp4', '.mkv', '.wmv', '.avi', '.rmvb', '.rm', '.flv', '.mov',
                     '.ts', '.m2ts', '.mpeg', '.asf', '.asx', '.vob' , '.m2t', '.3gp']

# 获取视频列表
def get_video_list(path):
    video_list = []
    if os.path.isfile(path) and os.path.splitext(path)[1] in supported_formats:
        video_list.append(path)
    elif os.path.isdir(path):
        for file_name in os.listdir(path):
            if os.path.splitext(file_name)[1] in supported_formats:
                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.000', end_time=None, clip_count=0):
    video_name = os.path.basename(video_path)
    output_path = os.path.join(os.path.dirname(video_path), 'clip_' + str(clip_count) + '_' + video_name)
    while os.path.exists(output_path):
        clip_count += 1
        output_path = os.path.join(os.path.dirname(video_path), 'clip_' + str(clip_count) + '_' + video_name)
    if not start_time:
        start_time = '00:00:00.000'
    if end_time is None:
        cmd = 'ffmpeg -ss '{}' -i '{}' -c copy '{}''.format(start_time, video_path, output_path)
    else:
        cmd = 'ffmpeg -ss '{}' -to '{}' -i '{}' -c copy '{}''.format(start_time, end_time, video_path, output_path)
    with open(os.devnull, 'w') as devnull:
        subprocess.Popen(cmd, shell=True, stdout=devnull, stderr=subprocess.PIPE)


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

    # 判断输入路径是否为文件
    if os.path.isfile(input_path) and os.path.splitext(input_path)[1] in supported_formats:
        # 输入开始和结束时间
        start_time = input('请输入开始时间(格式为hh:mm:ss.sss):')
        end_time = input('请输入结束时间(格式为hh:mm:ss.sss):')
        if not end_time:
            end_time = None

        # 剪辑视频
        clip_video(input_path, start_time, end_time)

    # 判断输入路径是否为目录
    elif os.path.isdir(input_path):
        # 获取视频列表并排序
        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.sss):')
            end_time = input('请输入结束时间(格式为hh:mm:ss.sss):')
            if not end_time:
                end_time = None

            # 剪辑视频
            selected_video_path = video_list[selected_video_index-1]
            if not start_time:
                clip_video(selected_video_path, None, end_time, clip_count=0)
            else:
                clip_video(selected_video_path, start_time, end_time, clip_count=0)

    else:
        print('输入的路径不是一个视频文件或者包含视频文件的目录!')

该代码使用了 ffmpeg 命令行工具进行视频剪辑。

功能亮点:

  • 支持多种常见的视频格式。
  • 自动递增命名剪辑后的视频文件,避免覆盖已有文件。
  • 可以指定剪辑视频的开始时间和结束时间。
  • 支持从目录中选择多个视频进行剪辑。
  • 按照最后修改时间对视频列表进行排序,方便用户选择。

使用方法:

  1. 安装 ffmpeg 命令行工具,可以通过系统包管理器安装,例如 aptyum
  2. 将代码保存为 clip_video.py 文件。
  3. 运行 python clip_video.py 文件,程序会提示输入视频路径、开始时间和结束时间。

注意:

  • 如果要剪辑多个视频,需要将所有视频放置在同一个目录下。
  • 程序会自动判断输入路径是文件还是目录,并进行相应的处理。
  • 程序使用 subprocess.Popen 执行 ffmpeg 命令,需要确保 ffmpeg 命令行工具已安装并配置好环境变量。

代码解释:

  1. supported_formats 变量定义了支持的视频格式列表。
  2. get_video_list 函数用于获取指定路径下的视频列表,并判断路径是否是文件或目录。
  3. sort_video_list 函数用于按照最后修改时间对视频列表进行排序。
  4. clip_video 函数用于剪辑视频,该函数接受视频路径、开始时间、结束时间和剪辑计数作为参数。
  5. clip_video 函数使用 ffmpeg 命令行工具进行剪辑,并将剪辑后的视频文件保存到与原始视频文件相同的目录下,并以 clip_ 开头,加上递增的剪辑计数,再加下划线,最后加上原始视频文件名的方式进行命名。
  6. while os.path.exists(output_path) 循环用于判断输出文件名是否存在,如果存在则将剪辑计数加 1,并重新生成输出文件名,直到生成一个不存在的输出文件名。
  7. subprocess.Popen 函数用于执行 ffmpeg 命令,并将输出信息重定向到空设备 os.devnull,避免命令执行过程中的输出信息干扰用户。
  8. __main__ 模块用于程序入口,该模块负责获取用户输入的视频路径、开始时间和结束时间,并调用 clip_video 函数进行视频剪辑。

示例:

假设有一个名为 video.mp4 的视频文件,该文件位于 /home/user/videos 目录下,要剪辑从第 1 分钟到第 3 分钟的视频片段,可以使用以下命令:

python clip_video.py

程序会提示输入视频路径、开始时间和结束时间,输入如下内容:

请输入视频路径:/home/user/videos/video.mp4
请输入开始时间(格式为hh:mm:ss.sss):00:01:00.000
请输入结束时间(格式为hh:mm:ss.sss):00:03:00.000

程序会将 video.mp4 文件从第 1 分钟到第 3 分钟的视频片段剪辑出来,并保存到 /home/user/videos 目录下,命名为 clip_0_video.mp4

总结:

该代码提供了一种方便快捷的视频剪辑工具,可以帮助用户快速剪辑视频片段,并避免剪辑后的视频文件覆盖已有文件。同时,该代码也具有良好的可读性和可维护性,便于用户进行修改和扩展。

Python3 视频剪辑工具:自动递增命名剪辑后的视频文件,避免覆盖

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

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