python | moviepy音视频剪辑VideoFileClip使用

背景

在现代多媒体处理领域,视频剪辑已经成为日常工作的一部分。无论是制作专业的视频内容,还是简单的家庭影片剪辑,使用合适的工具能够大大提高效率和效果。MoviePy是一个强大的Python库,专为视频编辑设计,其中的VideoClip基类提供了灵活且简洁的接口,让用户可以轻松实现各种视频剪辑功能。


解析

moviepy音视频剪辑模块的视频剪辑基类write_videofile方法用于将视频剪辑输出到文件,调用语法如下:

write_videofile(self, filename, fps=None, codec=None,
                        bitrate=None, audio=True, audio_fps=44100,
                        preset="medium",
                        audio_nbytes=4, audio_codec=None,
                        audio_bitrate=None, audio_bufsize=2000,
                        temp_audiofile=None,
                        rewrite_audio=True, remove_temp=True,
                        write_logfile=False, verbose=True,
                        threads=None, ffmpeg_params=None,
                        logger='bar')

参数说明如下:

  • filename:视频文件名,只要是ffmpeg支持的视频文件如 .ogv, .mp4, .mpeg, .avi, .mov等都可以
  • fps:帧率,每秒编码的帧数
    • codec:用于图像编码的编解码器,可以是ffmpeg支持的任何编解码器。如果文件名的扩展名为“.mp4”、“.ogv”、“.webm”,则会相应地设置编解码器,但如果不喜欢默认值,则仍可以进行设置。对于其他扩展名,必须相应地设置输出文件名。一些常用的编解码器如下:
    • ‘libx264’:视频压缩效果好的一款编解码器,MP4的缺省编解码器,视频质量通过bitrate参数调节
    • ‘mpeg4’:一种可选的MP4编解码器,可以替代’libx264’,可以获得更好的视频质量
    • ‘rawvideo’:完美的视频质量,但文件会巨大,对应视频文件为’.avi’
    • ‘png’:完美的视频质量,对应视频文件为’.avi’,但文件大小比’rawvideo’小
    • ‘libvorbis’:是一种完全开放、免费的编解码器,有不错的视频格式,但是要不广,对应视频文件为’.ogv’
    • ‘libvpx’:一种很适合在HTML5中使用的网络视频轻量级编开源解码器,对应视频文件为’.webm’
  • bitrate:输出视频的比特率,也即码率BPS(Bits Per Second),指每秒传送的数据位数
  • audio:可以为True、False或文件名,如果True且剪辑附加了音频,则音频将作为视频的音频保存,如果为False则不保存音频,如果为音频文件名则将此音频文件将作为视频的音频
  • audio_fps:声音的采样频率
  • preset:设置FFMPEG用于优化压缩的时间。字符串类型,可选值有:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、 placebo。请注意,这不会影响视频的质量,只影响视频文件的大小。所以如果赶时间而文件大小不是很重要可以设置为ultrafast
  • audio_nbytes:音频的采用的位数,对应基于字节为单位就是声道数;
  • audio_codec:音频解码器,例如’.mp3’的’libmp3lame’、‘ogg’的’libvorbis’、 ‘m4a’的’libfdk_aac’、 ‘pcm_s16le’ 16位声音和’pcm_s32le’的32位声音。默认值为“libmp3lame”,除非视频扩展名为“ogv”或“webm”,在这2种情况下,默认值为“libvorbis”。
  • audio_bitrate:音频比特率,字符串形式,如“50k”、“500k”、“3000k”,用于将确定输出文件中音频的大小/质量。请注意,这主要是一个指示性目标,输出文件的比特率不一定会按此设置。
  • audio_bufsize:音频缓冲区大小
  • temp_audiofile:如果输出由音频,则该参数用于指定要生成并合并到电影中的临时音频文件的名称,如果没有指定则用缺省模式的临时文件名
  • rewrite_audio:这个参数目前没有作用,估计是为了兼容以前的版本
  • remove_temp:是否删除临时文件
  • write_logfile:如果为True,将为音频和视频输出记录日志文件。日志文件将以“.log”结尾,包含输出文件的名称
  • verbose:已经废弃使用,留下来是为了兼容性,以前用于打开/关闭消息。现在使用logger=None。
  • threads:用于ffmpeg的线程数,可以加快多核计算机上视频输出的速度
  • ffmpeg_params:需额外传递的其他ffmpeg参数,用列表传递,形如:[’-option1’,‘value1’,’-option2’,‘value2’]
  • logger:字符串类型,"bar"表示进度条、None 表示不设置、或任何程序日志记录器的名字

代码解读

from moviepy.editor import VideoFileClip

def video_convert(input_file, output_path, file_name, width, height, video_format):
        """
        视频转分辨率转视频编码
        :param input_file: 源文件
        :param output_path: 输出目录
        :param file_name: 文件名
        :param width: 需要转成的视频的宽度
        :param height: 需要转成的视频的高度
        :param video_format: 需要转换成的视频格式
        :return: 返回新文件名称,可以根据实际使用修改
        """
        new_file_name = f"{file_name}.{video_format}"
        result_path = os.path.join(output_path, new_file_name)

        try:
            # 读取视频文件
            with VideoFileClip(input_file) as video:
                # 获取源视频宽度和高度
                frame_width, frame_height = video.size

                # 设置视频参数,若传入-1则保持原尺寸
                target_width = width if width != -1 else frame_width
                target_height = height if height != -1 else frame_height

                # 调整视频尺寸
                new_video = video.resize(newsize=(target_width, target_height))

                # 写入文件
                new_video.write_videofile(result_path, fps=60, audio_codec="aac")

            logger.info(f"转码完成,新文件路径: {result_path}")
        except Exception as e:
            logger.error(f"Error during video conversion: {e}")
            return "error"

        return new_file_name
video_convert("test.mp4", "", "_test", 512, 512, "mp4")

主要是视频转分辨率,然后写入到新视频中。

原始视频画面
在这里插入图片描述

剪辑后效果
在这里插入图片描述

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值