Python3 视频剪辑工具:自动递增命名剪辑后的视频文件,避免覆盖
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 命令行工具进行视频剪辑。
功能亮点:
- 支持多种常见的视频格式。
- 自动递增命名剪辑后的视频文件,避免覆盖已有文件。
- 可以指定剪辑视频的开始时间和结束时间。
- 支持从目录中选择多个视频进行剪辑。
- 按照最后修改时间对视频列表进行排序,方便用户选择。
使用方法:
- 安装
ffmpeg命令行工具,可以通过系统包管理器安装,例如apt或yum。 - 将代码保存为
clip_video.py文件。 - 运行
python clip_video.py文件,程序会提示输入视频路径、开始时间和结束时间。
注意:
- 如果要剪辑多个视频,需要将所有视频放置在同一个目录下。
- 程序会自动判断输入路径是文件还是目录,并进行相应的处理。
- 程序使用
subprocess.Popen执行ffmpeg命令,需要确保ffmpeg命令行工具已安装并配置好环境变量。
代码解释:
supported_formats变量定义了支持的视频格式列表。get_video_list函数用于获取指定路径下的视频列表,并判断路径是否是文件或目录。sort_video_list函数用于按照最后修改时间对视频列表进行排序。clip_video函数用于剪辑视频,该函数接受视频路径、开始时间、结束时间和剪辑计数作为参数。clip_video函数使用ffmpeg命令行工具进行剪辑,并将剪辑后的视频文件保存到与原始视频文件相同的目录下,并以clip_开头,加上递增的剪辑计数,再加下划线,最后加上原始视频文件名的方式进行命名。while os.path.exists(output_path)循环用于判断输出文件名是否存在,如果存在则将剪辑计数加 1,并重新生成输出文件名,直到生成一个不存在的输出文件名。subprocess.Popen函数用于执行ffmpeg命令,并将输出信息重定向到空设备os.devnull,避免命令执行过程中的输出信息干扰用户。__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。
总结:
该代码提供了一种方便快捷的视频剪辑工具,可以帮助用户快速剪辑视频片段,并避免剪辑后的视频文件覆盖已有文件。同时,该代码也具有良好的可读性和可维护性,便于用户进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/nzFM 著作权归作者所有。请勿转载和采集!