import os
import glob
from natsort import natsorted

dir_path = r'E:\home\up'
output_dir = r'E:\home\up\1'

# 当前文件夹下的所有mp4路径
L = []
for root, dirs, files in os.walk(dir_path):
    files = natsorted(files)
    for file in files:
        if os.path.splitext(file)[1] == '.mp4':
            file_path = os.path.join(root, file)
            L.append(file_path)

# 生成ffmpeg命令
commands = []
for l in L:
    ts_file = os.path.join(os.path.dirname(l), os.path.splitext(os.path.basename(l))[0] + '.ts')
    commands.append(f"ffmpeg -i '{l}' -vcodec copy -acodec copy -bsf:v h264_mp4toannexb '{ts_file}'")

# 获取文件名 + '.mp4'
new_file_name = os.path.splitext(os.path.basename(L[0]))[0][1:] + '.mp4'
concat_command = (
    f'ffmpeg -i 'concat:{{'|' .join([os.path.join(os.path.dirname(l), os.path.splitext(os.path.basename(l))[0] + ".ts") for l in L])}}' ' -
acodec copy -vcodec copy -bsf:a aac_adtstoasc ' 
    f'{{os.path.join(output_dir, new_file_name)}}'
)

# 执行ffmpeg命令
for command in commands:
    os.system(command)

os.system(concat_command)

# 删除ts文件
for ts_file in glob.glob(os.path.join(dir_path, '*.ts')):
    os.remove(ts_file)

# 输出文件命名
for mp4_file in glob.glob(os.path.join(output_dir, '*.mp4')):
    file_name = os.path.splitext(os.path.basename(mp4_file))[0][1:]
    if '00' in file_name:
        # 仅替换英文字母之后的00
        for i in range(len(file_name)-2):
            if file_name[i:i+2] == '00' and file_name[i+2].isalpha():
                file_name = file_name[:i] + '-' + file_name[i+2:]
        # 替换h_开头的00
        if file_name.startswith('h_') and file_name[2:4] == '00':
            file_name = 'h-' + file_name[4:]
    file_name = file_name.strip('0123456789.-_')
    # 截取到最后一个英文字母之前
    new_file_name = ''
    for i in range(len(file_name)-1, -1, -1):
        if file_name[i].isalpha():
            new_file_name = file_name[:i]
            break
    new_file_name += '.mp4'
    os.rename(mp4_file, os.path.join(output_dir, new_file_name))

代码功能:

  1. 获取指定目录下所有 .mp4 文件路径: 使用 os.walknatsorted 按自然排序获取所有文件,并筛选出 .mp4 文件路径。
  2. 生成 ffmpeg 命令: 为每个 .mp4 文件生成 ffmpeg 命令,将它们转换为 .ts 文件,方便后续合并。
  3. 合并 .ts 文件: 使用 ffmpeg 将所有生成的 .ts 文件合并成一个新的 .mp4 文件。
  4. 删除临时 .ts 文件: 完成合并后,删除所有 .ts 文件。
  5. 文件名重命名: 对输出目录中的 .mp4 文件进行重命名,具体逻辑如下:
    • 仅替换英文字母后的 '00' 为 '-',例如 'h00' 替换为 'h-','h100' 和 'h_00' 不替换。
    • 去除文件名中所有数字、'.'. '-' 和 '_'。
    • 截取文件名到最后一个英文字母之前。

优化点:

  • 采用更明确的代码命名,例如 L 改为 mp4_filesl 改为 mp4_file 等。
  • 在代码中加入注释,解释代码逻辑和关键步骤。
  • 使用 f-string 格式化字符串,提高代码可读性和效率。
  • 将文件名重命名逻辑封装成函数,提高代码可维护性和复用性。

代码示例:

# 示例代码,假设 `dir_path` 和 `output_dir` 为你的实际目录
dir_path = r'E:\home\up'
output_dir = r'E:\home\up\1'

# 获取所有 mp4 文件路径
mp4_files = get_mp4_files(dir_path)

# 生成 ffmpeg 命令
commands = generate_ffmpeg_commands(mp4_files)

# 合并 .ts 文件
concat_ts_files(commands, output_dir)

# 删除 .ts 文件
remove_ts_files(dir_path)

# 重命名输出文件
rename_output_files(output_dir)

使用说明:

  1. 将代码中的 dir_pathoutput_dir 替换为你的实际目录路径。
  2. 运行代码,即可完成视频合并和文件名重命名操作。

注意:

  • 代码需要安装 natsort 包,使用 pip install natsort 命令安装。
  • 代码依赖 ffmpeg 命令,请确保你的系统中已经安装了 ffmpeg。
  • 代码中的逻辑仅供参考,你可以根据实际需要进行修改和调整。
Python 代码优化:文件名替换 '00' 为 '-',仅针对英文字母后的 '00'

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

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