利用moviepy对韩国女团视频进行自动剪辑
首先从网上下载女团的饭拍视频,建议是饭拍的竖屏视频,横屏的太远,女团的身体看得不明显,横屏的也不需要进行处理,因为我们的屏幕是横屏的,放横屏的视频自然是没有障碍。当然,看完这篇文章你也可以自己创建你喜欢的布局样式。
我这里是从下载的视频,当然你可能需要一个百度网盘的超级会员,或者自己破解客户端。
为了对视频进行编辑,你可能会想到PR,但是PR的问题在于难以处理批量的任务,以及难以把视频准确地拼接到一起,你需要仔细地调整大小和位置,这是极为不方便的操作,做几个视频你就厌烦了。
python的moviepy库提供了很方便的操作,可以把几个视频拼到一起,你需要首先安装moviepy
pip3 install moviepy
我这里使用的是python3,python2的童鞋自己研究一下。首次安装会自动安装ffmpeg。
然后
from moviepy.editor import *
最核心的地方就一段代码。这个函数把RouteList列表里面的视频路径取出来,然后把它们resize成屏幕的1/12大小,再排好它们在屏幕上的位置就行了。由于我的显示器是1366x768的分辨率,你使用的时候可以改成自己的分辨率。最后输出到OutputRoute指定的位置。
如果你不清楚代码的具体含义,这里说一下方便你更好地DIY。VideoFileClip函数要求输入一个视频的路径,同时可以设置不需要音频,即audio=False。subclip是从两个参数(以秒为单位)指定的时间点截取视频,这里统一截取了10秒钟(这个问题其实很严重,后面再说)。resize需要提供一个(width,height)的大小,set_position需要提供一个[x,y]形式的坐标(指的是左上角的坐标)。CompositeVideoClip函数就相当于PR中的“序列”的概念,要求提供一个video的列表,这里是videos,size字段制定了输出的大小,相当于序列设置里面的大小。write_videofile把序列写到文件中。
def x12_1(RouteList,OutputRoute): #视频 videos = [] #位置 pos = [] for i in range(6): pos.append([i*1366/6,0]) for i in range(6): pos.append([i*1366/6,768/2]) #长度 length = 10 #大小 size = (1366/6,768/2) #设置 for i in range(12): video = VideoFileClip(RouteList[i],audio=False).subclip(0, length).resize(size) .set_position(pos[i]) videos.append(video) #输出 result = CompositeVideoClip(videos, size=(1366, 768)) result.write_videofile(OutputRoute)
那么下面要解释一下为什么要用subclip截取10秒了。
其实是为了解决一个问题:拼接的长度不一致。
比如说12个视频长度都不一样,最后拼接的时候会有问题,播放到后面你会发现出现越来越多的黑屏,因为时间较短的视频播放 完了,这就非常尴尬了。
为了不引入复杂的算法,我这里采用的是把视频打碎的方法,分成无数个10秒钟的短视频,然后12个一组进行拼接。
下面是把视频打碎的函数。具体不解释了,基本同上面的一样,而且更简单。拼接的时候注意最好把文件乱序排列,然后重命名,这样尽量避免来自同一个视频的片段同时出现,你也不想看1个人的12个视频组合在一起吧。
def CutIntoPieces(route,OutputRoute): video = VideoFileClip(route,audio=False) length = video.duration PieceLen = 10 i = 0 while 1: if (i + 1) * PieceLen < length: piece = video.subclip(i * PieceLen,(i + 1) * PieceLen) i = i + 1 result = CompositeVideoClip([piece]) result.write_videofile(OutputRoute[0:len(OutputRoute) - 4] + _ + str(i) + .mp4) else: break
调用的时候,类似这样就行了,dst.mp4只是个标志,最后的每个碎片都是dst_1.mp4,dst_2.mp4这种类型
CutIntoPieces(src.mp4,dst.mp4)
这里有个问题没有解决,就是多次调用这个函数之后会出现OSError,句柄无效的错误,目前还不清楚怎么回事,所以建议用bat脚本多次运行程序来避免这个问题。
最后视频可以放到火萤()里随机播放,岂不是美滋滋?