拉长视频时长的两种方法

系统导入错误"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)
相关推荐
DevOpenClub2 分钟前
全国三甲医院主体信息 API 接口
java·大数据·数据库
一勺菠萝丶12 分钟前
管理后台使用手册在线预览与首次登录引导弹窗实现
java·前端·数据库
无忧智库15 分钟前
某大型银行“十五五”金融大模型风控与智能投顾平台建设方案深度解读(WORD)
数据库·金融
爱码小白17 分钟前
数据库多表命名的通用规范
数据库·python·mysql
huohuopro32 分钟前
Hbase伪分布式远程访问配置
数据库·分布式·hbase
XDHCOM44 分钟前
ORA-12169: TNS连接标识符过长,Oracle报错故障修复与远程处理
数据库·oracle
Black蜡笔小新1 小时前
花屏/蓝屏/黑屏/画面抖动/冻结/模糊检测,聊聊EasyCVR的视频质量诊断插件,解决运维人的实际烦恼
运维·音视频
爬山算法1 小时前
MongoDB(86)如何使用MongoDB存储大文件?
数据库·mongodb
xcLeigh1 小时前
KES数据库表空间目录自动创建特性详解与存储运维最佳实践
大数据·运维·服务器·数据库·表空间·存储
小陈工1 小时前
2026年4月8日技术资讯洞察:边缘AI推理框架竞争白热化,Python后端开发者的机遇与挑战
开发语言·数据库·人工智能·python·微服务·回归