天天刷抖音,发现一些 好玩的 快闪文字视频, 自己尝试着做了几个,用了很多 的 工具做了一下,发下需要收费, 于是,用Python整了个 工具来合成 文字视频,效果如下:PFinal社区,快闪文字视频https://www.zhihu.com/video/1127196631308853248
目录结构如下:
工作流程如下:
data.txt 是需要读取和现实的文字:
假如生活,欺骗了你,不要悲伤,不要心急,多被骗几次,就好了。
这世上,99%的事,都可以,用钱来解决,唯一,不能解决的,那1%,就是没有钱。
由于断句的问题还没有解决,所以 手工 加,号断的句。入口main.py代码如下:
# -*- coding:utf-8 -*-
import os
from generate_img.generate_img import generate_bg_img
from generate_img.generate_img import generate_img
from generate_img.generate_img import get_text
from generate_img.generate_img import img_to_video
from generate_img.generate_img import video_to_img
from generate_img.generate_img import get_radio
if __name__ == '__main__':
if os.path.exists('bg.png') == False:
generate_bg_img()
text_list_all = get_text()
if len(text_list_all) > 0:
radio = 1
for text_list in text_list_all:
i = 1
get_radio(','.join(text_list), radio)
for text in text_list:
generate_img(text, i, 50)
i += 1
img_to_video(len(text_list), radio)
radio += 1
generate_bg_img() 方法 是生成背景图片的方法
def generate_bg_img():
image = Image.new("RGB", (544, 960), "black")
draw_table = ImageDraw.Draw(im=image)
# image.show()
image.save('bg.png', 'PNG')
image.close()
generate_img() 方法 是把文字转换成 每一帧图片,转换成的图片如下:
def generate_img(text="中文", k=1, num=50, last_string=''):
img = cv2.imdecode(np.fromfile('bg_' + str(random.randint(1, 2)) + '.jpg', dtype=np.uint8), -1)
x = random.randint(10, 100)
# print(img.shape)
y = random.randint(100, img.shape[0] - 200)
colors = {1: "black", 2: "red", 3: "white"}
f = 1
font_size = random.randint(30, 70)
while f <= num:
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg)
font = ImageFont.truetype("simkai.ttf", font_size + random.randint(1, 2), encoding="utf-8")
draw.text((x + random.randint(-5, +5), y + random.randint(-5, +5)), text, colors[random.randint(1, 3)],
font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imencode('.jpg', cv2charimg)[1].tofile('image/' + str(k) + "_" + str(f) + ".jpg")
cv2.waitKey(0)
cv2.destroyAllWindows()
f += 1
get_text() 方法是 获取 字符串断句的列表
def get_text():
text_list = [];
with open('data.txt', "r", encoding='utf-8', errors='ignore') as f:
for string in f.readlines():
text_list.append(string.split(','))
return text_list
img_to_video() 方法是图片生成 视频的方法:
def img_to_video(total, radio):
# print(open('auido_%s.mp3' % str(radio)))
fps = 28
size = (544, 960)
name = random.randint(1, 1000)
videowriter = cv2.VideoWriter(str(name) + ".mp4", cv2.VideoWriter_fourcc(*"mp4v"), fps, size)
for f in range(1, 51):
img_fen = cv2.imread('fen.png')
videowriter.write(img_fen)
path = r'image/'
for x in range(1, total + 1):
for i in range(1, 51):
# print(path + str(x) + '_' + str(i) + '.jpg')
img = cv2.imread(path + str(x) + '_' + str(i) + '.jpg')
cv2.waitKey(1)
videowriter.write(img)
videowriter.release()
time.sleep(1)
print("video audio merge!!!!!")
audioclip = AudioFileClip('auido_%s.mp3' % str(radio))
print(str(name) + ".mp4")
videoclip = VideoFileClip(str(name) + ".mp4")
# print(videoclip)
videoclip2 = videoclip.set_audio(audioclip)
video = CompositeVideoClip([videoclip2])
video.write_videofile(str(name) + str(random.randint(1, 10)) + ".mp4", codec='mpeg4', fps=28)
在这个方法之前, 需要把 把字符串转换成,音频, 使用了 百度的语音合成API,代码如下:
def get_radio(text, i):
client = AipSpeech(config.APP_ID, config.API_KEY, config.SECRET_KEY)
result = client.synthesis(text, 'zh', 1, {
'vol': 5,
'spd': 2,
'per': 4
})
if not isinstance(result, dict):
with open('auido_%s.mp3' % str(i), 'wb') as f:
f.write(result)
需要的可以 留言.
更多知识分享,请扫码关注: