
代码
from moviepy.editor import * #from moviepy.editor import VideoFileClip, concatenate_videoclips import os src_path = r"H:\video\死神-全集 1080P 日语中字\主线\主线初现篇 2\117.mp4" start_str = "01:30" end_str = "21:40" def format_raw(src, to, begin, end): clip2 = VideoFileClip(src).subclip(begin, end) clip2.write_videofile(to) print("{}->{}".format(os.path.basename(src), os.path.basename(to))) def format(src,begin_str, end_str): bname_raw = os.path.basename(src_path) src_dir = os.path.dirname(src_path) bname,ext = os.path.splitext(bname_raw) to= os.path.join(src_dir, "{}_split{}".format(bname, ext)) begin = str_seconds(begin_str) end = str_seconds(end_str) print("{}, {}".format(begin_str, end_str)) print("begin:{}, second:{}".format(begin, end)) format_raw(src, to, begin, end) def str_seconds(para): arr = para.split(":") arr = [int(v) for v in arr] mul = [60, 1] return sum([k*v for (k, v) in zip(mul, arr)]) format(src_path, "01:30", "21:54") 目的就是为了视频开始前的开头曲,现在问题裁剪好像很慢啊,5-6 分钟还没有裁剪出来,粗略估计要 15-16 分钟.
用 ffmpeg 裁剪也很慢,
这个速度正常吗?感觉到了自己电脑的弱小
1 R4rvZ6agNVWr56V0 2024-06-10 15:17:02 +08:00 要看你电脑 cpu ,线程数越高越有优势 |
2 yangxin0 2024-06-10 15:18:40 +08:00 要看你调用硬件 codec 没,默认大概率是 CPU 调用,速度差异非常巨大。 |
3 simple2025 OP @GeekGao CPU 占用高,电脑 CPU100,我是四核 |
4 ysc3839 2024-06-10 16:07:33 +08:00 via Android 只是截取片段,不修改画面的话,建议看看 LosslessCut 的速度如何。 |
5 ysc3839 2024-06-10 16:11:46 +08:00 via Android 另外只是裁剪片头的话,为什么要写代码实现?要自动批量裁剪每一集的片头? |
6 simple2025 OP @ysc3839 是的,自动批量裁剪动画片的片头 |
7 expy 2024-06-10 16:14:18 +08:00 估计重新编码了,可以试试 ffmpeg 不重编码直接复制流。不过因为 I/P/B 帧类型的问题,不重编码切的时间点没那么精确。 ffmpeg -i input.mp4 -ss 00:01:30 -to 00:21:40 -c copy output.mp4 |
8 simple2025 OP @expy 快了很多,至少是 10 分钟到 2S 的提升,太厉害了,大佬 |
10 flcwk 2024-06-10 17:57:42 +08:00 import os src_path = r"H:\video\死神-全集 1080P 日语中字\主线\主线初现篇 2\117.mp4" def format(src, begin_str, end_str): bname_raw = os.path.basename(src) src_dir = os.path.dirname(src) bname, ext = os.path.splitext(bname_raw) to = os.path.join(src_dir, "{}_split{}".format(bname, ext)) begin = str_seconds(begin_str) end = str_seconds(end_str) begin_str_ffmpeg = seconds_str(begin) end_str_ffmpeg = seconds_str(end) command = f'ffmpeg -i "{src}" -ss {begin_str_ffmpeg} -to {end_str_ffmpeg} -c copy "{to}"' os.system(command) print("{}->{}".format(os.path.basename(src), os.path.basename(to))) def str_seconds(para): arr = para.split(":") arr = [int(v) for v in arr] mul = [60, 1] return sum([k*v for (k, v) in zip(mul, arr)]) def seconds_str(seconds): minutes = seconds // 60 secOnds= seconds % 60 return f"{minutes:02}:{seconds:02}" # 调用函数进行视频裁剪 format(src_path, "01:30", "21:54") # 使用 ffmpeg 的-c copy 选项,这意味着视频和音频流不会被重新编码,从而大大提高处理速度。 |