请教哈各位大佬,想做一个下载器放在软路由下载视频,目前视频已经正常下载,但是下载完成是 1500 多个 ts 文件,想要优雅的把它合成 mp4 ,有没有高效,快捷的方式,目前自己尝试的做法是使用 Python 调库,问了 chatgpt ,给出代码``from moviepy.editor import * import os
ts_files = [f for f in os.listdir('.') if f.endswith('.ts')] ts_files.sort() # 如果需要按特定顺序排序
batch_size = 50
temp_videos = []
for i in range(0, len(ts_files), batch_size): batch_files = ts_files[i:i + batch_size] clips = [VideoFileClip(f) for f in batch_files] video = concatenate_videoclips(clips) temp_file = f"temp_{i}.mp4" video.write_videofile(temp_file) temp_videos.append(temp_file)
final_clips = [VideoFileClip(f) for f in temp_videos] final_video = concatenate_videoclips(final_clips) final_video.write_videofile("final.mp4")
for f in temp_videos: os.remove(f)
这是调整后代码,之前给出的代码。第一版给出的代码如下
from moviepy.editor import VideoFileClip, concatenate_videoclips import os import gc
ts_files = [ 'video1.ts', 'video2.ts', 'video3.ts', # Add more file paths ]
temp_dir = "temp_mp4_files" os.makedirs(temp_dir, exist_ok=True)
mp4_files = [] for ts_file in ts_files: clip = VideoFileClip(ts_file) mp4_file_path = os.path.join(temp_dir, os.path.basename(ts_file).replace(".ts", ".mp4")) clip.write_videofile(mp4_file_path, codec="libx264", fps=24) clip.close() mp4_files.append(mp4_file_path) # Force a garbage collection to free up memory gc.collect()
clips = [VideoFileClip(mp4_file) for mp4_file in mp4_files]
final_video = concatenate_videoclips(clips, method="compose")
final_video.write_videofile("output.mp4", codec="libx264", fps=24)
for clip in clips: clip.close() for mp4_file in mp4_files: os.remove(mp4_file) os.rmdir(temp_dir) gc.collect()
这个代码好像因为打开的文件太多了报错了。
去搜了哈 ffmpeg 的教程,搜到的是,先创建一个 文件夹,把所有 ts 的路径按顺序写入一个 文件 ,然后 再执行命令`ffmpeg.exe -f concat -safe 0 -i file.txt -c copy out.mp4`就 OK 了(这个方法目前还没有尝试)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.