系统导入错误"ImportError:无法导入名称'Moviepy.editor'"的解决办法
方法一:
from moviepy.editor import VideoFileClip
import os
def slow_down_video(input_path, output_path, target_duration):
"""
通过放慢视频速度将视频调整到指定时长
参数:
input_path: 输入视频路径
output_path: 输出视频路径
target_duration: 目标时长(秒)
"""
# 读取视频
with VideoFileClip(input_path) as video:
original_duration = video.duration
print(f"原视频时长: {original_duration:.2f}秒")
print(f"目标时长: {target_duration:.2f}秒")
# 检查目标时长是否小于原时长
if target_duration <= original_duration:
raise ValueError(f"目标时长({target_duration}秒)必须大于原视频时长({original_duration:.2f}秒)")
# 计算速度因子:原时长/目标时长,值小于1表示放慢
speed_factor = original_duration / target_duration
print(f"计算得到的速度因子: {speed_factor:.4f}")
# 确保速度因子有效(大于0小于1)
if speed_factor <= 0 or speed_factor >= 1:
raise ValueError(f"无效的速度因子: {speed_factor:.4f},必须在0-1之间")
# 放慢视频速度
adjusted_video = video.speedx(factor=speed_factor)
print(f"调整后视频的计算时长: {original_duration / speed_factor:.2f}秒")
# 保存调整后的视频
adjusted_video.write_videofile(
output_path,
codec="libx264",
audio_codec="aac",
fps=video.fps
)
print(f"视频处理完成,保存至: {output_path}")
print(f"实际输出视频时长应约为: {target_duration:.2f}秒")
if __name__ == "__main__":
# 示例用法
input_video = r"D:\Desktop\test_folder\jianying_materials_2\videos\3.mp4"
output_video = r"D:\Desktop\test_folder\jianying_materials_2\videos\3_slow.mp4"
target_time = 10 # 目标时长(秒),确保大于原视频时长
if not os.path.exists(input_video):
print(f"错误: 找不到输入文件 {input_video}")
else:
try:
slow_down_video(input_video, output_video, target_time)
except Exception as e:
print(f"处理失败: {str(e)}")
方法二:
from moviepy.editor import VideoFileClip
import subprocess
import os
def slow_down_video_with_ffmpeg(input_path, output_path, target_duration):
"""
使用FFmpeg通过放慢视频速度将视频调整到指定时长
参数:
input_path: 输入视频路径
output_path: 输出视频路径
target_duration: 目标时长(秒)
"""
with VideoFileClip(input_path) as video:
original_duration = video.duration
if target_duration <= original_duration:
raise ValueError("目标时长必须大于原视频时长")
speed_factor = original_duration / target_duration
# FFmpeg命令,通过设置setpts参数来改变视频的pts(显示时间戳)实现放慢速度
ffmpeg_command = [
'ffmpeg',
'-i', input_path,
'-vf', f'setpts={1 / speed_factor}*PTS',
'-af', f'atempo={speed_factor}',
'-y',
output_path
]
try:
subprocess.run(ffmpeg_command, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
print(f"视频已通过FFmpeg调整为 {target_duration} 秒,保存至: {output_path}")
except subprocess.CalledProcessError as e:
print(f"FFmpeg处理视频失败: {e}")
input_path = r'D:\Desktop\test_folder\jianying_materials_2\videos\3.mp4'
output_path = r'D:\Desktop\test_folder\jianying_materials_2\videos\3_slow.mp4'
slow_down_video_with_ffmpeg(input_path, output_path, 10)