拉长视频时长的两种方法
系统导入错误“ImportError:无法导入名称‘Moviepy.editor’“的解决办法
方法一:
from moviepy.editor import VideoFileClip
import osdef slow_down_video(input_path, output_path, target_duration):"""通过放慢视频速度将视频调整到指定时长参数:input_path: 输入视频路径output_path: 输出视频路径target_duration: 目标时长(秒)"""# 读取视频with VideoFileClip(input_path) as video:original_duration = video.durationprint(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_durationprint(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 osdef 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.durationif 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)