通过ffmpeg,将指定目录下的所有文件夹内的mp4视频合并。
要求一定是相同编码格式的,不能h264和h265混着来!如果是重新编码再合并的话,我目前没有找到这种一口气合并的方法,只两个两个合并。
↓此代码合并的是【工作目录/子目录】内的.mp4!
#todo 不编码,直接【合并】【子目录】内的mp4!!!
import os
import subprocess
def merge_videos_in_subdirs(base_dir):
# 遍历基目录下的所有子目录
for root, dirs, files in os.walk(base_dir):
for d in dirs:
subdir = os.path.join(root, d)
output_file = os.path.join(subdir, "temp_list.txt")
video_files = [f for f in os.listdir(subdir) if f.endswith('.mp4')]
video_files.sort()
# 创建临时文件列表
with open(output_file, 'w') as f:
for video_file in video_files:
f.write("file '{}'\n".format(os.path.join(subdir, video_file)))
# 合并视频
merged_video_path = os.path.join(base_dir, "{}.mp4".format(d))
cmd = "ffmpeg -f concat -safe 0 -i {} -c copy {}".format(output_file, merged_video_path)
process = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 检查是否成功合并,没有错误信息则删除原视频文件和临时文件
if process.returncode == 0:
for video_file in video_files:
os.remove(os.path.join(subdir, video_file))
os.remove(output_file)
# 示例用法
base_directory = r"Your/working/directory"
merge_videos_in_subdirs(base_directory)
↓此代码合并的是【工作目录】内的.mp4
#todo 不编码,直接【合并】【工作目录】下的mp4!!!
import os
def merge_videos(input_dir, output_file):
input_files = os.listdir(input_dir)
input_files = [f for f in input_files if f.endswith('.mp4')]
input_files.sort()
with open(output_file, 'w') as outfile:
for f in input_files:
file_path = os.path.join(input_dir, f)
outfile.write("file '{}'\n".format(file_path))
os.system("ffmpeg -f concat -safe 0 -i {} -c copy {}".format(output_file, os.path.join(input_dir, "merged.mp4")))
# 示例用法
input_directory = r"Your/working/directory"
output_file = os.path.join(input_directory, 'concatenated.txt')
merge_videos(input_directory, output_file)