python 视频加字幕_分享如何使用Python进行短视频的二次创作

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 步,视频帧处理

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

20200122123250_35087.jpg

使用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 步,制作背景图片视频

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

实现方式是用一个图片帧循环写入到视频文件中。

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 步操作,就能完成对大部分短视频的二次创作。

## 讲师介绍: 近 5 年个人投资理财年化收益平均超 25%。如果你也想提升自己的睡后收入,轻松赚钱,那么这门课就是为你量身打造。课程基于一个完整真实的量化交易业务来讲授,并融入老师的理财经验以及使用编程技术辅助投资的技巧,让你面对各种复杂投资情况也能做到游刃有余。 ## 学习目标: 从不懂“理财”开始到实现自动交易,成为一个“技术流”理财高手 编程技术 + 核心量化策略 + 交易系统开发 + 讲师经验分享,学会用技术辅助理财 本课程从最基础的什么是量化开始讲起,即使对投资理财不了解同样可以学习,轻松入门无压力。 从如何获取数据开始,到实现实盘交易,课程对量化交易的每一步都进行细致讲解,为你铺开量化交易的每一个细节。 不仅仅只是教你学会使用某种工具,更会教给你量化交易的投资思想,让你面对各种情况都游刃有余。 ## 课程亮点: 设计适合自己并能适应市场的交易策略,才是量化交易的灵魂 课程亲手带你设计并实现两种交易策略,快速培养你的策略思维能力 1. 择时策略:通过这个策略学会如何利用均线,创建择时策略,优化股票买入卖出的时间点。2. 选股策略:掌握选股策略的核心逻辑,并基于收益率创建动量选股策略,并验证其有效性。 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 第三方平台大而全,不易扩展,效率还差,信息安全也是大问题,打造自己的交易平台才是更优解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值