【问题标题】:Combine mp4 files by order based on number from filenames in Python根据 Python 中文件名中的数字按顺序组合 mp4 文件
【发布时间】:2023-04-06 14:21:02
【问题描述】:

我尝试在 Python 中使用 ffmpeg 将目录 test 中的大量 mp4 文件合并为一个 output.mp4

path = '/Users/x/Documents/test'

import os

for filename in os.listdir(path):
    if filename.endswith(".mp4"):
        print(filename)

输出:

4. 04-unix,minix,Linux.mp4
6. 05-Linux.mp4
7. 06-ls.mp4
5. 04-unix.mp4
9. 08-command.mp4
1. 01-intro.mp4
3. 03-os.mp4
8. 07-minux.mp4
2. 02-os.mp4
10. 09-help.mp4

我从这里的参考资料中尝试了以下解决方案:ffmpy concatenate multiple files with a file list

import os
import subprocess
import time


base_dir = "/path/to/the/files"
video_files = "video_list.txt"
output_file = "output.avi"

# where to seek the files
file_list = open(video_files, "w")

# remove prior output
try:
    os.remove(output_file)
except OSError:
    pass

# scan for the video files
start = time.time()
for root, dirs, files in os.walk(base_dir):
    for video in files:
        if video.endswith(".avi"):
            file_list.write("file './%s'\n" % video)
file_list.close()

# merge the video files
cmd = ["ffmpeg",
       "-f",
       "concat",
       "-safe",
       "0",
       "-loglevel",
       "quiet",
       "-i",
       "%s" % video_files,
       "-c",
       "copy",
       "%s" % output_file
       ]

p = subprocess.Popen(cmd, stdin=subprocess.PIPE)

fout = p.stdin
fout.close()
p.wait()

print(p.returncode)
if p.returncode != 0:
    raise subprocess.CalledProcessError(p.returncode, cmd)

end = time.time()
print("Merging the files took", end - start, "seconds.")

我已经合并它们并得到一个output.mp4,但是文件没有按顺序合并,第一个数字按点分割(1, 2, 3, ...):我可以通过filename.split(".")[0]得到:

1. 01-intro.mp4
2. 02-os.mp4
3. 03-os.mp4
4. 04-unix,minix,Linux.mp4
5. 04-unix.mp4
6. 05-Linux.mp4
7. 06-ls.mp4
8. 07-minux.mp4
9. 08-command.mp4
10. 09-help.mp4

如何在 Python 中正确简洁地合并它们?谢谢。

【问题讨论】:

  • OK 合并文件的顺序是什么?是随机的吗?哦,您的进程如何处理编号为“04”的两个文件?
  • 我希望按照文件名第一个句点前的数字(本例为1到10)按顺序合并文件,并且它们是唯一的。
  • 是的,你已经回答了我问题的第二部分,更重要的部分是关于你现在得到的订单的第一部分。
  • 是我遗漏了什么,还是您真的在问如何对列表进行排序?
  • 在里面看不到排序...

标签:
python
ffmpeg
operating-system
subprocess