凡科免费网站可以做推广吗,网上注册网站要钱吗,做效果图的外包网站,百度投放广告联系谁1. 场景如果你经常刷抖音和微信朋友圈#xff0c;一定发现了最近九宫格短视频很火#xff01;从朋友圈九宫格图片#xff0c;到九宫格视频#xff0c;相比传统的图片视频#xff0c;前者似乎更有个性和逼格除了传统的剪辑软件可以实现#xff0c;是否有其他更加快捷方便的…1. 场景如果你经常刷抖音和微信朋友圈一定发现了最近九宫格短视频很火从朋友圈九宫格图片到九宫格视频相比传统的图片视频前者似乎更有个性和逼格除了传统的剪辑软件可以实现是否有其他更加快捷方便的方式比如一键生成批量生成废话不多说本篇文章将大家使用 Python 一键生成九宫格短视频优雅地帮你在朋友圈装一次逼2.准备在开始实战之前使用 pip 安装 2 个依赖分别是1、视频处理依赖 moviepy2、图片处理依赖 PIL# 安装两个依赖# 视频处理pip3 install moviepy# 图片处理依赖pip3 install Pillow3.实战一下在实战之前先准备一段原始视频素材下面通过 6 个步骤将原始视频转换为九宫格视频1、新建处理文件夹新建一个临时文件夹和一个视频输出文件夹def mkdir_folder(file_path):创建一个文件夹如果不存在就创建否则不做处理:param file_path::return:if os.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.video_height self.video_raw_clip.w, self.video_raw_clip.h# 帧率self.fps self.video_raw_clip.fps# 视频时长self.during self.video_raw_clip.duration接着从视频中提取 BGM 音频对象并写入到文件中def get_audio_from_video(video_raw_clip, output_path):从视频中提取音频:param video_raw_clip: 视频Clip对象:param output_path: 输出音频文件完整路径:return:audio video_raw_clip.audioaudio.write_audiofile(output_path)return output_path3、处理视频帧我们使用原始视频 Clip 对象的 iter_frames() 方法循环获取所有的视频帧图片需要指出的是为了保证后面视频合成的便捷性这里对视频帧的文件名按顺序进行命令i 1for frame in self.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),colorwhite)接着获取每一块区域的坐标值针对横向、纵向第 2、3 个图片区域加上间隔偏移粘贴到上面新建的图片上即可# 4、裁剪图片然后粘贴到新的画布中去# i:横向、j纵向for i in range(0, 3):for j in range(0, 3):# 裁剪区域box (j * item_width, i * item_height, (j 1) * item_width, (i 1) * item_height)# 根据区域裁剪图片crop_image image.crop(box)# 横向、纵向第2块和第3块要加上偏移距离x 0 if j 0 else (item_width self.item_space) * jy 0 if i 0 else (item_height self.item_space) * i# 将9张图片按照上面计算的坐标值粘贴到背景中去new_image.paste(crop_image, (int(x), int(y)))# 保存图片到本地new_image.save(frame_file_complete_path)4、一篮子图片重新合成视频把上一步生成的帧图片按照原视频的帧率转为视频需要注意的是为了保证生成的视频不会错乱最好对帧图片按照名称进行一次排序def pics_to_video(pics_path, output_path, fps):图片转为视频pics_to_video(./../gif_temp/, ./../video_temp/temp1.mp4, 20):param pics_path::param output_path::return:image_paths list(map(lambda x: pics_path x, os.listdir(pics_path)))# 注意这里必须进行一次排序保证所有帧的顺序是一致image_paths sort_strings_with_emb_numbers(image_paths)# 过滤掉非图片image_paths list(filter(lambda image_path: image_path.endswith(.jpg), image_paths))# 图片剪辑类clip ImageSequenceClip(image_paths,fpsfps)clip.write_videofile(output_path)5、加入 BGM 背景音乐将原始视频的音频文件设置到上一步生成的视频文件然后写入一个新的文件中去def video_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,codeclibx264,audio_codecaac,temp_audiofiletemp-audio.m4a,remove_tempTrue)6、删除临时文件利用 shutil将上面视频处理的临时文件包含帧图片、临时视频文件删除掉def remove_folder(file_path):删除文件夹:param file_path::return:shutil.rmtree(file_path)# 删除临时文件remove_folder(self.path_temp)7、查看效果4.最后通过上面的一系列操作我们实现了将一段视频处理成九宫格视频我已经将文中全部源码包含生成九宫格视频和图片两套代码 上传到后台关注公众号后回复「九宫格 」即可获得全部源码