自己建立网站是免费的吗:Python技能:制造抖音卡点视频?Python
本文摘要: 1目 标 场 景玩抖音的朋友都应该知道,最近「卡点视频」简直不要太火。抖音上很多大神也出了剪辑各种卡点视频的教程。实践上,使用很多手机 APP 或者 PR、FCPX 软件也能够制造卡点视频,可是剪辑功率都太慢。假如想完成一篮子剪
1目 标 场 景

玩抖音的朋友都应该知道,最近「卡点视频」简直不要太火。抖音上很多大神也出了剪辑各种卡点视频的教程。

实践上,使用很多手机 APP 或者 PR、FCPX 软件也能够制造卡点视频,可是剪辑功率都太慢。假如想完成一篮子剪辑素材,通过运转一段代码,得到一个卡点视频,这种感觉不要太爽。

本篇文章的意图是使用 Python 从一篮子素材中快速地剪辑卡点小视频这一操作。

2准 备 工 作

首要,对视频的剪辑需要用到「opencv」库,通过 pip3 装置到虚拟环境中。

# opencv 用于剪辑视频pip3 install opencv-python

然而,通过 opencv 剪辑的视频只有画面,没有布景音乐。

我们需要借助「ffmpeg」,将抖音下载好的某个卡点视频使用 ffmpeg 命令别离出音频文件,然后合并到上面剪辑的视频傍边。

# 别离BGM、合并视频和BGMpip3 install ffmpeg

3编 写 脚 本

我们以抖音上的某个卡点音乐为例,这段布景音乐的节奏需要一个 2s 的视频,然后其他都是静态图片,每一个图片显示 0.5s。

下面通过 5 个步骤完成卡点视频的剪辑,分别是:剪辑开始视频、合并静态图片视频、合并上面两段视频、给视频加入水印、加入布景音乐。

第一步,我们需要从视频素材文件中剪辑一段 2s 的片段。

通过 cv2 库为视频文件构建一个「VideoCapture」对象,然后获取到视频的帧率和视频的分辨率。

# 视频源videoCapture = cv2.VideoCapture(soure_filename)

# 获取视频的帧率fps = videoCapture.get(cv2.CAP_PROP_FPS)

# 获取视频的分辨率img_size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

然后,使用上面的帧率、分辨率构建一个写入对象,即:「VideoWriter」。

# 构建一个视频写入对象video_writer = cv2.VideoWriter(output_filename, cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, img_size)

终究,通过传入要开始剪辑的起始点和要剪的长度,然后循环读取视频帧,假如满足条件,就写入到方针视频文件中。

写入视频帧完成之后,需要手动开释对象资源。

# 开始帧和完毕帧start_frame = fps * start_timeend_frame = start_frame + peroid * fps



# 循环读取视频帧,只写入开始帧和完毕帧之间的帧数据while True:success, frame = videoCapture.readif success:i += 1if start_frame <= i <= end_frame:# 将截取到的画面写入“新视频”video_writer.write(frame)else:break# 释放资源videoCapture.release


第二步,需要把所有的静态文件都组成一段视频。

ps:为了保证每一张静态图片都显示 0.5s,并且静态图片生成的视频与第一段视频使用同一帧率,因此我们应该针对每一张图片写入屡次,即多帧数据。每张图片写入的总次数为上段视频的帧率的 1/2。

和剪辑视频类似,静态图片组成视频也需要先构建一个写入对象 VideoWriter,然后通过向上取整获取要写入的总帧数。

# 视频格局:MP4fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')

# 构建写入对象video = cv2.VideoWriter(output_video_path, fourcc, fps, img_size)

# 每一张图片要写入的帧数目total_count = math.ceil(fps / 2)

另外需要留意的是,为了保证图片组成的视频能与第一段视频顺畅剪辑在一同,这里需要对图片的分辨率进行缩放,没有像素的方位填充为黑色。

def resize_image(target_image_path, target_size):"""调整图片巨细,缺失的部分用黑色填充:param target_image_path: 图片途径:param target_size: 分辨率巨细:return:"""image = Image.open(target_image_path)

iw, ih = image.size # 原始图画的尺寸w, h = target_size # 方针图画的尺寸scale = min(w / iw, h / ih) # 转换的最小比例

# 保证长或宽,至少一个契合方针图画的尺寸nw = int(iw * scale)nh = int(ih * scale)

image = image.resize((nw, nh), Image.BICUBIC) # 缩小图画# image.show

new_image = Image.new('RGB', target_size, (0, 0, 0, 0)) # 生成黑色图画

# 将图画填充为中心图画,两侧为灰色的样式new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))

# 掩盖原图片new_image.save(target_image_path)图片分辨率处理完成之后,终究就能够读取指定文件夹下的图片,依照上面获取的次数把静态图片写入到视频文件中。
# 使用opencv读取图画frame = cv2.imread(image_path)

# 直接缩放到指定巨细frame_suitable = cv2.resize(frame, (img_size[0], img_size[1]), interpolation=cv2.INTER_CUBIC)

# 把图片写进视频# 重复写入多少次count = 0while count < total_count:video.write(frame_suitable)count += 1

以上两步现已完成了两段单独视频的剪辑,第三步是「组成」上面的两段视频。

因为两段视频的帧率、分辨率都一致,这里不需要做其他多余的处理,只需要遍历两段视频文件,循环读取每一帧,然后写入到新的视频文件中。

第四步,需要对视频添加「水印」操作。

添加水印也很便利,使用 cv2 中的函数 putText,指定水印的起始坐标、字体样式、字体巨细和色彩,然后循环每一帧,写入到视频就能够完成。

ret, frame = cap.read

while ret:# 文字在图中的坐标(留意:这里的坐标原点是图片左上角)x, y = img_size[0] - 200, img_size[1] - 50

# 写入水印文字,文字色彩为白色cv2.putText(img=frame, text=mask_word,org=(x, y), fontFace=cv2.FONT_HERSHEY_COMPLEX_SMALL,fontScale=1, color=(255, 255, 255))

video_writer.write(frame)ret, frame = cap.read

# 删除源文件,并重命名暂时文件os.remove(video_path)os.rename(video_temp_path, video_path)

print('水印添加完成~')video_writer.releasecap.release

终究一步就是组成视频和布景音乐,从头生成一段视频文件。

使用视频的帧率与总帧数得到视频的总时长,然后使用 ffmpeg 命令对布景音乐做一次裁剪操作,使得视频的长度与布景音乐的时间长度一致。

#获取视频的长度cap = cv2.VideoCapture(video_path)

#帧率fps = cap.get(cv2.CAP_PROP_FPS)

#总帧数frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)

#视频总时长-秒,这里做取整操作 【浮点类型】time_count = math.floor(frame_count / fps)

print('帧率:%f,总帧数:%d' % (fps, frame_count))print(time_count)

# 3.截取音频# 为了简略,这里一般不会超过一分钟bgm_temp_path = get_temp_path(bgm_path, 'temp_new')os.system('ffmpeg -i %s -ss 00:00:00 -t 00:00:%d -acodec copy %s' % (bgm_path, time_count, bgm_temp_path))

接着使用 ffmpeg 命令,合并视频文件和音频文件,就能够生成一个我们需要的卡点视频。

#视频、音频合二为一# 暂时文件video_temp_path = get_temp_path(video_path, 'temp')os.system('ffmpeg -i %s -i %s -vcodec copy -acodec copy %s' % (video_path, bgm_path, video_temp_path))

# 删除源文件,重命令暂时文件os.remove(video_path)os.rename(video_temp_path, video_path)

4结 果 结 论

运转程序后,视频、图片、布景音乐会主动进行剪辑、组成,终究加上水印,在本地生成一个卡点视频。

【免责声明】本文仅代表作者或发布者个人观念,不代表(www.lmnkf.cn)及其所属公司官方发声,对文章观念有疑义请先联络作者或发布者自己修正,若内容触及侵权或违法信息,请先联络发布者或作者删除,若需我们协助请联络平台管理员,Emailcxb5918(本平台不支撑其他投诉反馈渠道,谢谢合作)。若需要学习以上相关常识请到巨推学院观看视频教程,网站地址www.tsllg.cn。

相关内容