当前位置: 首页 > 后端技术 > Python

Python带你一键生成朋友圈超人气九宫格短视频

时间:2023-03-26 13:30:25 Python

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)#宽高self.video_width,self...它进入文件defget_audio_from_video(video_raw_clip,output_path):"""从视频中提取音频:paramvideo_raw_clip:视频剪辑对象:paramoutput_path:输出音频文件的完整路径:return:"""audio=video_raw_clip.audioaudio.write_audiofile(output_path)returnoutput_path3.处理视频帧,我们使用原始视频Clip对象的iter_frames()方法循环获取所有视频帧图像。需要指出的是,为了保证后续视频合成的方便,这里视频帧的文件名是按照顺序i=1forframeinself.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.重新创建画布背景new_image=Image.new(image.mode,(item_width_new,item_height_new),color='white')接下来,得到每个区域的坐标值,在第2和第3个图像区域分别在水平和垂直方向添加间隔偏移,粘贴到上面新建的图像中#4.裁剪图像,然后粘贴到新的画布中#i:horizo??ntal,j:verticalforiinrange(0,3):forjinrange(0,3):#裁剪区域框=(j*item_width,i*item_height,(j+1)*item_width,(i+1)*item_height)#根据面积裁剪图片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)))#注意:这里必须进行一次排序,保证所有帧的顺序一致image_paths=sort_strings_with_emb_numbers(image_paths)#过滤掉非图像image_paths=list(filter(lambdaimage_path:image_path.endswith('.jpg'),image_paths))#Imageclipclassclip=ImageSequenceClip(image_paths,fps=fps)clip.write_videofile(output_path)5.添加BGM背景音乐将原视频的音频文件设置为上一步生成的视频文件,然后写入新文件中defvideo_with_audio(path_video_raw,path_bgm_raw,output):"""视频合成audio: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删除上述视频处理的临时文件,包括帧图片和临时文件videofilesDropdefremove_folder(file_path):"""deletefolder:paramfile_path::return:"""shutil.rmtree(file_path)#删除临时文件remove_folder(self.path_temp)4.最后通过以上一系列操作,我们意识到一段视频可以处理成九宫格视频。文中所有源码我都上传了,包括:生成九宫格视频和图片的两套代码,并上传到后台,后台回复“九宫格”即可获取全部源码。如果觉得文章还不错,请大家点赞、分享、留言,因为这将是我继续输出更多优质文章的最强大动力!