Python 带你进行短视频二次创作
2021/11/21 12:10:19
本文主要是介绍Python 带你进行短视频二次创作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
欢迎关注
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
1目 标 场 景
无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 UP 主都会争先抢后去模仿拍摄或剪辑,然后上传到平台,最后都能带来不错的流量。
对于一般的短视频,完全可以通过裁剪、特效转场、加入混合图层和字幕等一系列操作,很快就能制作出一个全新的视频,这些操作完全可以使用 Python 来实现。
本篇文章的目的是带大家利用 Python 实现短视频的二次创作。
2编 写 代 码
要实现短视频的二次创作,一般需要下面 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/")
3结 果 结 论
通过上面的 7 步操作,就能完成对大部分短视频的二次创作。
完整脚本下载:
https://download.csdn.net/download/huangbangqing12/46065047
这篇关于Python 带你进行短视频二次创作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03用FastAPI掌握Python异步IO:轻松实现高并发网络请求处理
- 2025-01-02封装学习:Python面向对象编程基础教程
- 2024-12-28Python编程基础教程
- 2024-12-27Python编程入门指南
- 2024-12-27Python编程基础
- 2024-12-27Python编程基础教程
- 2024-12-27Python编程基础指南
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型