moviepy音视频剪辑:使用rotate函数实现视频变换处理以及参数expand取值为True时的花屏问题解决方案

☞ ░ 前往老猿Python博文目录

一、rotate函数功能介绍

moviepy的rotate函数用于将剪辑逆时针旋转指定的角度或弧度。

调用语法:rotate(clip, angle, unit="deg", resample="bicubic", expand=True)
参数说明:
  • angle:一个代表角度或弧度的数值或者是一个返回二者数值的与时间线相关的函数(带一个参数t)

  • unit:用于确认angle值对应弧度还是角度,如果是角度为“deg”,否则为“rad”,弧度和角度的换算关系为:1°=(360/2πr),其中r为半径

  • resample:图像重采样的算法,缺省为‘bicubic’,可以取值范围包括"nearest", “bilinear”, or “bicubic”
    :图像处理从形式上来说主要包括两个方面:1 单像素或者邻域像素的处理,比如影像的相加或者滤波运算等;2 图像几何空间变换,如图像的重采样,配准等。常用的重采样算法主要包括以下三种:1 最近邻nearest;2 双线性bilinear;3 三次卷积bicubic。

  • expand:如果为True,会自动扩展每帧剪辑的大小以容纳旋转后的所有图像内容,确保所有图像信息不丢失,否则每帧大小保持和原剪辑一致,新剪辑也与原剪辑一样大小,超出剪辑大小部分的内容将被裁减

二、expand为True时的花屏处理

如果expand为True,由于不同旋转角度超出原剪辑的范围不同,会导致不同时刻返回的帧大小不一致,这样可能导致播放时花屏,为了解决该问题,建议将剪辑resize到高和宽都与原剪辑的对角线长度相同,这样就不会花屏。或者就设置expand=False。

三、 案例:

下面的案例随时间线变换旋转不同的角度,且将剪辑的的高和宽度调整为原剪辑对角线的大小,剪辑的画面内容不会丢失,旋转角度由angleF函数确认

def angleF(t):
    ret = (10*int(t))%360

    return ret*-1
if __name__=='__main__':
    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4",audio=False).crop(0, 300, 540, 840)

    newclip = clip.rotate(angleF,expand=True).fx(vfx.resize,(764,764))
    print(clip.size,newclip.size)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_rotate.mp4", threads=8)

三个不同播放时刻的截图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

关于收费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

☞ ░ 前往老猿Python博文目录

posted on 2020-06-28 22:07  老猿Python  阅读(848)  评论(0编辑  收藏  举报