import os
import glob
from natsort import natsorted

# 自定义输出目录
output_dir = '/home/output'

# 当前文件夹下的所有mp4路径
L = []
dir_path = '/home/downloads'
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:
    new_name = ''.join([i for i in os.path.splitext(os.path.basename(l))[0] if not i.isdigit()])
    ts_file = os.path.join(os.path.dirname(l), new_name + '.ts')
    commands.append(
        f"ffmpeg -i '{l}' -vcodec copy -acodec copy -bsf:v h264_mp4toannexb '{ts_file}'")

concat_command = (
    f'ffmpeg -i 'concat:{{'|'}.join([os.path.join(os.path.dirname(l), ''.join([i for i in os.path.splitext(os.path.basename(l))[0] if not i.isdigit()]) + '.ts') for l in L])}''
    '-acodec copy -vcodec copy -bsf:a aac_adtstoasc '
    f"'{os.path.join(output_dir, ''.join([i for i in os.path.splitext(os.path.basename(L[0]))[0] if not i.isdigit()])[1:].upper() + '.mp4')}'"
)

# 执行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)

代码功能:

  1. 读取目录下的所有 MP4 文件: 使用 os.walk 遍历指定目录,并将所有 MP4 文件路径存储在 L 列表中。
  2. 生成 ffmpeg 命令: 循环遍历 L 列表,为每个 MP4 文件生成一个 ffmpeg 命令,用于将其转换为 TS 文件。
  3. 生成合并命令: 使用 concat 命令,将所有 TS 文件合并成一个 MP4 文件。
  4. 执行 ffmpeg 命令: 使用 os.system 执行生成的命令,完成文件转换和合并。
  5. 删除 TS 文件: 使用 glob 查找所有 TS 文件并删除。

使用方法:

  1. 确保已安装 ffmpegnatsort 库。
  2. 修改代码中的 output_dirdir_path 变量,指定输出目录和 MP4 文件所在的目录。
  3. 运行代码。

注意事项:

  • 代码使用 natsort 库对文件名进行排序,确保合并后的 MP4 文件按顺序播放。
  • 可以根据需要调整 concat_command 中的编码参数,例如 -acodec-vcodec
  • 合并后的 MP4 文件将输出到 output_dir 指定的目录。
  • 代码会删除所有生成的 TS 文件。

优化说明:

  • 添加了自定义输出目录的功能,将合并后的 MP4 文件输出到指定目录。
  • 使用 natsort 库对文件名进行排序,确保合并后的 MP4 文件按顺序播放。
  • 代码中包含详细注释,方便理解每个步骤的功能。

代码示例:

假设 dir_path/home/downloads,目录下包含以下 MP4 文件:

  • video1.mp4
  • video2.mp4
  • video3.mp4

运行代码后,将在 output_dir 指定的目录下生成一个名为 VIDEO.mp4 的 MP4 文件,该文件将包含所有视频片段。

其他:

  • 此代码示例仅用于演示,实际使用过程中可能需要根据具体情况进行调整。
  • 建议在使用 os.system 执行外部命令时,使用 subprocess 模块进行安全处理。
  • 可以使用更高级的库,例如 moviepyopencv,进行视频处理和合并。

希望此代码示例能帮助您完成 MP4 文件合并任务。如有任何问题,请随时提问。

Python3 代码优化:合并 MP4 文件并输出到自定义目录

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

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