需求

简单视频分割

原因

开始使用了好几款国产的剪辑软件,不管收费的还是免费的,都存在这些问题,一效率太低,二画质会变低,三文件会变大。这些软件一般都是切割后的文件码率都会改变,然后切割完成等待生成副本的时间非常长。

后来发现了ffmpeg,在输入几行指令,视频可以切割生成速度非常快,并且保持原文件的码率。但使用起来也很难受,因为指令需要需要手动输入原文件的路径和生成后的路径。最近学了两天的python,突然觉得可以结合来用。python中也有一个ffmpeg模块,这个应该很强大,可能用这个会更好,但我的需求就是分割,所以就没有去了解它。

使用

安装ffmpeg,配置环境变量Path 如:D:\下载\软件\ffmpeg-4.4-essentials_build\bin

将代码复制到一个新建py文件中,双击py文件,根据终端提示既可以完成视频切割,视频切割完的时间简直秒杀,用起来简直不要太爽。

代码业务逻辑

获取当前路径的所有文件结合序号展示出来,用序号选择文件,将文件的路径放在ffmpeg的指令上,通过python将指令在终端中打开。

代码如下:

import os
dir = os.getcwd()

    # 获取当前的目录
def get_files():
    files = []
    for root, dirs, files in os.walk(dir):
        files = files
    return files


def show_files():
    # 通过序号展示文件
    files = get_files()
    print('files')
    for index in range(len(files)):
        print(index+1, files[index])


def cutting(file_id, time_str):
    files = get_files()
    # 保存选择的文件路径
    file_selected = files[int(file_id)-1]
    file_path = dir + '\\' + file_selected

    # 将当前目录下所有.mp4的文件拆分为没有后缀的文件保存到一个列表中
    cur_list = []
    list1 = []
    file1 = file_selected.split('.mp4')[0]
    for item in files:
        if '.mp4' in item:
            item = item.split('.mp4')
            list1.append(item[0])

    # 将源文件和副本都保存到一个列表中
    for item in list1:
        if file1 in item:
            cur_list.append(item)

    # 通过list1的长度给后续的副本加序号
    cutting = file_path.split('.mp4')
    copy_path = cutting[0] + '_' + str(len(cur_list)) + '.mp4'
    cur_list.append(copy_path)

    time_list = time_str.split(' ')
    start_list = []
    for i in range(len(time_list) - 1):
        start_list.append(time_list[i])
    start_time = ":".join(start_list)
    duration = time_list[len(time_list) - 1]
    print(start_time, duration)

    ff = f'ffmpeg -ss {start_time} -i {file_path} -t {duration} -c copy {copy_path}'
    os.system(ff)

show_files()

file_id = input('选择一个视频文件:')
# 切割一段 00 00 00 10  开始时间00 00 00    时长10
# 切割多段 00 00 00 10,00 00 00 20,00 00 00 30
time_str = input("输入时间,切割一段 00 00 00 10 切割多段 00 00 00 10,00 00 00 20:")
if ',' in time_str:
    time_list = time_str.split(',')
    for time_str in time_list:
        cutting(file_id,time_str)
else:
 cutting(file_id,time_str)