当前位置: 首页 > 科技观察

假装-抖音超人气九宫格视频如何生成,Python告诉你答案

时间:2023-03-13 20:42:45 科技观察

1.如果你经常刷抖音还有微信朋友圈,我一定是发现了最近很火的九宫格短视频!从朋友圈的九宫格图片到九宫格视频,相比于传统的图片和视频,前者似乎更具有个性和感染力。除了传统的剪辑软件,还有没有其他更快捷方便的方式呢?比如:一键生成,批量生成?废话不多说,本文将用Python一键生成九宫格短视频,优雅帮你装朋友圈!2、开始实战前,使用pip安装2个依赖,即:1、视频处理依赖moviepy2,图像处理依赖PIL#安装两个依赖#视频处理pip3installmoviepy#图像处理依赖pip3installPillow3。实战前,先准备一段视频原素材,通过6个步骤将原视频转成九宫格视频。1.新建加工文件夹。创建一个临时文件夹和一个视频输出文件夹。defmkdir_folder(file_path):"""创建文件夹,如果不存在则创建;否则不处理:paramfile_path::return:"""ifos.path.exists(file_path):returnos.mkdir(file_path)#新建临时文件夹和输出文件夹mkdir_folder(self.path_temp)mkdir_folder(self.path_output)2.获取视频的音频文件和视频基本信息首先,使用moviepy根据原视频构造一个VideoFileClip对象,从而得到视频宽、高、帧率、时长等信息self.video_raw_clip=VideoFileClip(file_path)#width,heightself.video_width,selfself.video_height=self.video_raw_clip.w,self.video_raw_clip.h#framerateselfself.fps=self.video_raw_clip.fps#videodurationselfself.during=self.video_raw_clip.duration然后,从视频中提取BGM音频对象并将其写入文件defget_audio_from_video(video_raw_clip,output_path):"""从视频中提取音频:paramvideo_raw_clip:videoClip对象:paramoutput_path:输出音频文件完整路径:return:"""audio=video_raw_clip.audioaudio.write_audiofile(output_path)returnoutput_path3.处理视频帧,我们使用原始视频Clip对象iter_frames()方法,循环获取所有视频帧图片需要指出的是,为了保证后面视频合成的方便,视频帧的文件名是按照i=1的顺序排列的forframeinself.video_raw_clip.iter_frames():image=Image.fromarray(frame)#保存视频帧图片的临时路径(完整路径)frame_file_complete_path=self.path_temp+"%04d.jpg"%ii+=1视频的每一帧被切割成9张图片,我们可以明确指定图片之间的距离,然后计算新画布的宽高,最后绘制一张白色背景的图片#1,裁剪成9张图片,计算每张图片的宽高item_width=int(self.video_width/3)item_height=int(self.video_height/3)#2,新宽高item_width_new=self.video_width+self.item_space*2item_height_new=self.video_height+self.item_space*2#3,重建一个canvas背景new_image=Image.new(image.mode,(item_width_new,item_height_new),color='white')接下来获取每个区域的坐标,将第二个和第三个图像区域水平和垂直添加间隔偏移,粘贴创建一个新的在图#4上,裁剪图片,然后将其粘贴到新画布中#i:horizo??ntal,j:verticalforiinrange(0,3):forjinrange(0,3):#Cropareabox=(j*item_width,i*item_height,(j+1)*item_width,(i+1)*item_h八)#根据面积裁剪图片crop_image=image.crop(box)#水平和垂直方向的第二块和第三块要加上偏移距离x=0ifj==0else(item_width+self.item_space)*jy=0ifi==0else(item_height+self.item_space)*i#根据上面计算的坐标值粘贴9张图片到背景中new_image.paste(crop_image,(int(x),int(y)))#保存图片到本地new_image.save(frame_file_complete_path)4.从一篮子图片中重新组合视频将上一步生成的帧图片按照原视频的帧率转换成视频。需要注意的是,为了保证生成的视频不会乱序,最好把帧图片按照名字排序比较好defpics_to_video(pics_path,output_path,fps):"""图片转换为视频pics_to_video('./../gif_temp/','./../video_temp/temp1.mp4',20):parampics_path::paramoutput_path::return:"""image_paths=list(map(lambdax:pics_path+x,os.listdir(pics_path)))#注意:这里必须进行一次排序,保证所有帧的顺序一致.endswith('.jpg'),image_paths))#pictureclipclassclip=ImageSequenceClip(image_paths,fpsfps=fps)clip.write_videofile(output_path)5.添加BGM背景音乐将原视频的音频文件设置为视频文件上一步生成的,然后写入一个新文件defvideo_with_audio(path_video_raw,path_bgm_raw,output):"""视频合成音频:return:"""videoclip=VideoFileClip(path_video_raw)audioclip=AudioFileClip(path_bgm_raw)#设置视频和音频,写入文件到videoclip.set_audio(audioclip).write_videofile(output,codec='libx264',audio_codec='aac',temp_audiofile='temp-audio.m4a',remove_temp=True)6.删除临时文件使用shutil删除上述视频处理的临时文件,包括帧图片和临时视频文件。deletedefremove_folder(file_path):"""删除文件夹:paramfile_path::return:"""shutil.rmtree(file_path)#删除临时文件remove_folder(self.path_temp)7.将东莞仔、炸哥、乌鸦的视频作为实例查看效果,最终处理效果如下:4.最后通过上面的一系列操作,我们实现了将一段视频处理成九宫格视频