用Python进行短视频二次创作,网红必备
无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 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 步操作,就能完成对大部分短视频的二次创作。如果大家对内容感兴趣的话欢迎点赞分享哦,大家的肯定是我最大的鼓励和支持。