用Python进行短视频二次创作,网红必备

liftword4个月前 (01-07)技术文章30

无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 UP 主都会争先抢后去模仿拍摄或剪辑,然后上传到平台,最后都能带来不错的流量。

对于一般的短视频,完全可以通过裁剪、特效转场、加入混合图层和字幕等一系列操作,很快就能制作出一个全新的视频,这些操作完全可以使用 Python 来实现。

今天老男孩老师就来教大家,利用 Python 实现短视频的二次创作。

要实现短视频的二次创作,一般需要下面 7 个步骤,分别是:获取原始视频属性数据、视频帧处理、视频区域裁剪、制作背景图片视频、合成多段视频、生成描述字幕、加入字幕和背景音乐。

第 1 步,获取原始视频属性数据

首先,利用 爬虫 获取无水印的原始视频,Github 上有很多现成的轮子。

然后,实例化视频片段 VideoFileClip,得到视频的宽、高、帧率等基本属性。

self.video_raw_clip?=?VideoFileClip(self.video_raw_path)

#?视频宽、高
self.video_width,?self.video_height?=?self.video_raw_clip.w,?self.video_raw_clip.h

self.fps?=?self.video_raw_clip.fps


接着,分离出音频文件,对原始视频进行一次剪辑,去除掉视频平台追加的公共画面片段,重新生成一个视频文件。比如抖音默认会追加 4s 的公共视频片段。

?#?分离出音频
self.audio?=?self.video_raw_clip.audio.subclip(0,?self.video_raw_clip.duration?-?4)

#?裁剪尾部的视频素材
temp_video_clip?=?self.video_raw_clip.subclip(0,?self.video_raw_clip.duration?-?4)

#?生成新的视频,并保存到本地
temp_video_clip.set_audio(self.audio)

video_path?=?'./source/temp_source_video.mp4'

temp_video_clip.write_videofile(video_path,?codec='libx264',
????????????????????????????????????????audio_codec='aac',
????????????????????????????????????????temp_audiofile='temp-audio.m4a',
????????????????????????????????????????remove_temp=True)

第 2 步,视频帧处理


要对一个视频进行画面裁剪,首先知道开始裁剪的 起始坐标点裁剪的范围

使用 ffmpeg 命令拿到视频某一个时间点的图片帧,并保存图片文件到本地。

def?time_to_hms(seconds_time):
????"""
????时间转为时分秒
????:param?seconds_time:?秒数
????:return:
????"""
????m,?s?=?divmod(seconds_time,?60)
????h,?m?=?divmod(m,?60)
????return?"%02d:%02d:%02d"?%?(h,?m,?s)

def?get_frame_from_video(video_name,?frame_time,?img_path):
????"""
????获取视频某个时间的帧图片,保存在本地
????get_frame_from_video('./../source/source.mp4',?1,?'./22.jpg')
????:param?video_name:?视频路径
????:param?frame_time:?截取帧的时间位置(s)
????:param?img_path:生成图片的完整路径
????:return:
????"""
????#?秒转为时、分、秒
????time_pre?=?time_to_hms(frame_time)

????os.system('ffmpeg?-ss?%s?-i?%s?-frames:v?1?%s'?%?(time_pre,?video_name,?img_path))

接着利用 PS 的标尺和选区工具配合信息对话框,获取要裁剪的起始坐标、裁剪宽高数据。

#?裁剪起始坐标
position1?=?(0,?328)

#?630?为要裁剪的高度
position2?=?(self.video_width,?630)

第 3 步,视频区域裁剪

moviepy 提供的 crop() 方法可以很方便的区域裁剪视频。需要注意的是,crop() 方法传入的坐标值必须是 偶数,否则会导致区域裁剪失败。

def?video_crop(self,?position1,?position2,?croped_video_path):
?????"""
?????视频裁剪
?????:return:
?????"""

?????#?裁剪的坐标,包含左上角x轴和y轴;右下角x轴和y轴
?????clip2?=?fx.all.crop(self.video_clip,?x1=position1[0],?y1=position1[1],?x2=position2[0],?y2=position2[1])

?????#?保存文件
?????clip2.write_videofile(croped_video_path)

?????#?时长
?????self.time?=?clip2.duration

?????return?clip2

第 4 步,制作背景图片视频


为了保证手机上的观感,针对上面裁剪横向视频,需要混合加入一个竖屏的背景图片图层或视频。

我们可以利用图片制作 GIF 视频 的教程,这里实现方式类似,即一个 图片帧循环写入 到视频文件中。

def?one_pic_to_video(image_path,?output_video_path,?fps,?time):
????"""
????一张图片合成视频
????one_pic_to_video('./../source/1.jpeg',?'./../source/output.mp4',?25,?10)
????:param?path:?图片文件路径
????:param?output_video_path:合成视频的路径
????:param?fps:帧率
????:param?time:时长
????:return:
????"""

????image_clip?=?ImageClip(image_path)
????img_width,?img_height?=?image_clip.w,?image_clip.h

????#?总共的帧数
????frame_num?=?(int)(fps?*?time)

????img_size?=?(int(img_width),?int(img_height))

????fourcc?=?cv2.VideoWriter_fourcc('m',?'p',?'4',?'v')

????video?=?cv2.VideoWriter(output_video_path,?fourcc,?fps,?img_size)

????for?index?in?range(frame_num):
????????frame?=?cv2.imread(image_path)
????????#?直接缩放到指定大小
????????frame_suitable?=?cv2.resize(frame,?(img_size[0],?img_size[1]),?interpolation=cv2.INTER_CUBIC)

????????#?把图片写进视频
????????#?重复写入多少次
????????video.write(frame_suitable)

????#?释放资源
????video.release()

????return?VideoFileClip(output_video_path)


需要注意的是,合成图片视频的 帧率、时长 要和上一段视频保持一致。

第 5 步,合成两段视频

上面 2 步完成了原始视频的区域裁剪和背景视频的制作,现在可以将这两段视频进行一次合成。

由于两段视频的宽度很有可能不一样,为了保证合成视频的统一性,需要对其中一段视频的长宽进行 等比例缩放,使得两段视频的宽度保证一致。

def?synthetic_video(video1_clip,?video2_clip2):
????"""
????合成两段视频,生成视频的宽高以第一段视频为准
????:param?video1_clip:
????:param?video2_clip2:
????:return:
????"""
????#?最后生成视频的宽、高
????width,?height?=?video1_clip.w,?video1_clip.h

????#?第二段视频的实际宽、高
????video_width,?video_height?=?video2_clip2.w,?video2_clip2.h

????#?最第二段视频进行缩放
????video_clip1?=?video2_clip2.resize((width,?width?*?video_height?/?video_width))

????#?合成视频的路径
????synthetic_video_clip?=?CompositeVideoClip([video1_clip,?video_clip1.set_pos("center")])

????synthetic_video_clip.write_videofile(
????????'./source/temp_synthetic_video.mp4')

????return?synthetic_video_clip

第 6 步,生成描述字幕

使用 TextClip 可以生成一个描述信息,文字信息属性包含字体名称、大小、颜色、位置、开始时间及持续时间都可以一起设置进去。

#?描述字幕
TextClip(text_content,?font='./fonts/STHeiti?Medium.ttc',
????????????????????fontsize=font_params.get('size'),?kerning=font_params.get('kerning'),
????????????????????color=font_params.get('color')).set_position(("center",?150)).set_duration(duration)

默认字体可能会导致中文字幕不显示,因此,最好指定特定的中文字体。

第 7 步,加入字幕和背景音乐


使用 CompositeVideoClip 即可以将字幕片段嵌入到视频片段中,然后利用set_audio 把音频文件为视频增加一条音频轨道。

最后写入到文件中,即可以生成一个新的短视频。

#?加入字幕
video_with_text_clip?=?CompositeVideoClip([synthetic_video_clip,?desc_text_clip.set_start(0)])

#?设置背景音乐
video_with_text_clip.set_audio(self.audio).write_videofile("output.mp4",
???????????????????????????????????????????????????????????????????codec='libx264',
???????????????????????????????????????????????????????????????????audio_codec='aac',
???????????????????????????????????????????????????????????????????temp_audiofile='temp-audio.m4a',
???????????????????????????????????????????????????????????????????remove_temp=True
???????????????????????????????????????????????????????????????????)
#?删除所有的临时文件
del_temp_file("./source/")

最后


通过上面的 7 步操作,就能完成对大部分短视频的二次创作。如果大家对内容感兴趣的话欢迎点赞分享哦,大家的肯定是我最大的鼓励和支持。

老男孩老师特别为大家准备了学习AI人工智能的干货礼包,后台私信1可获取5000G珍藏大礼包(培训视频、精选软件、内部资料)~让我们一起让IT学习更简单!

相关文章

告别充值,使用Python获取各大平台VIP资源

说起利用Python可以随意抓取VIP资源就很激动,今天老男孩老师就来分享给大家一个很实用的技术,只需20行代码即可爬取所有网页的VIP视频,具体是怎么实现的呢,我们快来看看吧!我们都知道有许多的视频...

老男孩教育2016年第一期免费系列课程

新的一年新的分享老男孩教育2016年首次在腾讯课程发布免费系统课程,每周三晚8点30至晚10点,不见不散!1.老师阵容:老男孩:老男孩教育的创始人,有实力不解释,你懂得~Alex:帅的不要不要的金角大...

两个日本人已经支持华语音乐20年了!原来我们从小就听日语歌长

大家伙早上好,不知道小编今天要说的这位明星大家有没有印象呢?而华语音乐的开始相对较晚,所以很多著名的国王或天后,他们的许多原创名著都是外文封面歌曲。即使到目前为止,也有很多歌曲来自外语歌曲,比如筷子哥...

FastAPI 入门教学

FastAPI 入门教学在当今快速迭代的软件开发环境中,选择一个高效且易用的框架至关重要。Python 的 FastAPI 正是这样一个集速度与灵活性于一身的现代化 Web 框架。本文将带你初步了解...

最简单有效的 zabbix 快速学习法,30分钟快速入门

在公司搭建系统级别的监控,由于ELK对流量监控存在局限——现有的工具只记录了累计的流量,而无法计算每时每刻的流量。所以决定最后用zabbix来对网络做监控和报警,下面会从零开始记录zabbix搭建过程...

Google 大佬们为什么要开发 Go 这门新语言?

大家平时都是在用 Go 语言,那以往已经有了 C、C++、Java、PHP。Google 的大佬们为什么还要再开发一门新的语言呢?难不成是造轮子,其他语言不香吗?背景Go 编程语言构思于 2007 年...