各位同学好久不见
又来到毕老师小课堂时间了
今天我们来教大家
用Python自动生成快闪文字视频
最出名的快闪文字视频
当属苹果16年的广告了
https://www.bilibili.com/video/av6197763/
文字搭配着音乐节奏闪现
效果简单又震撼
虽说这两年好像已经被做烂了
前两天出去吃个烤串发现店家的广告都是快闪类型的
但是如果真的想做其实还有点麻烦
不管你是用PPT还是Premier
都得慢慢对齐鼓点节奏
做一个视频怕是要循环这首歌上百遍
做完就不想再听到这首歌了
效果堪比把歌曲设为早晨的闹钟
今天!
毕老师来帮一下各位苦逼的视频从业人员
我们用万能的Python
自动生成快闪文字视频!
就算老板要求做两小时的快闪文字视频
都不用害怕了!
首先我用非常出名的一首鬼畜来尝试
改革春风吹满地
原作品为小可儿在B站创作的
https://www.bilibili.com/video/av19390801
然后我们看看由程序自动找鼓点生成的快闪文字视频
https://www.zhihu.com/video/1124734415242416128上面视频当中
所有的鼓点都是由程序自动找到的
视频的生成也是全部由程序完成
唯一需要手动操作的就是
将文字按照需要切分出来
其实这一步也可以省略
比如下面这个视频
我利用分词模块
将这篇新闻
https://news.163.com/19/0618/20/EHVSFA1J0001875P.html
用快闪文字的方式
呈现出来
https://www.zhihu.com/video/1124734564881666048这个新闻呈现的方式
是不是很带感呢
当然如果每篇新闻都这么看
估计得累死……
如果你想直接获取这个快闪文字的Python代码
FlashText代码
接下来我们一步步简单讲解这个代码是如何实现的
首先我们需要用到的模块有
其中
librosa用来分析鼓点节奏
moviepy用来生成视频
jieba用来分词
click用来制作命令行工具
首先导入我们需要的模块
import librosa
from moviepy.editor import TextClip, CompositeVideoClip, AudioFileClip
import jieba
import click
接下来定义我们的主函数main()
其中输入参数有6个
width: 生成视频的宽度
height: 生成视频的高度
text: 存有文字的文本文件地址
music: 背景音乐
word_split: 是否自动分词(不自动分词就按换行切分)
output: 生成视频的文件名
同时我们利用click来帮我们
将这个python文件做成命令行工具
click的用法如下
具体可以看github
https://github.com/pallets/click
于是我们的main()函数变成下面这样
@click.command()
@click.option('--width', prompt='Width', default=360, help='The width of video clips')
@click.option('--height', prompt='Height', default=240, help='The height of video clips')
@click.option('--text', prompt='Text file', default='text.txt', help='The source text file')
@click.option('--music', prompt='Music file', default='改革春风吹满地.mp3', help='The music file')
@click.option('--word_split', prompt='Split words', default=False, help='Split words or not')
@click.option('--output', prompt='Output file', default='FlashText.mp4', help='The output file name')
def main(width, height, text, music, word_split, output):
其中prompt参数表示运行程序时会弹出的输入提示
default为默认值
即用户直接回车时选取的值
接下来在main()函数里
我们完成所有的事情
首先读入存有文字的文本文件
with open(text, 'r', encoding='utf-8') as f:
text_str = f.read()
然后我们根据用户选择来看是否要分词
if word_split:
seg_list = jieba.lcut(text_str)
punct = set(''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒
﹔﹕﹖﹗﹚﹜﹞!),.:;?|}︴︶︸︺︼︾﹀﹂﹄﹏、~¢
々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖([{£¥〝︵︷︹︻
︽︿﹁﹃﹙﹛﹝({“‘-—_…/''')
word_list = list(filter(lambda x: x not in punct, seg_list))
else:
word_list = text_str.split('n')
这里当word_split为True时
我们用jieba.lcut(text_str)获得分词后的列表
类似下图这样
接下来我们用两句话来剔除掉
分词后的列表中的标点符号
其中最主要就是用filter()函数
结合lambda来剔除
算是一个比较简单的剔除符号的方法
而如果word_split为False
那么我们直接将文档以换行符来切分
完成文字的分割以后
我们就来分析音乐鼓点
这里librosa就帮上大忙了
librosa是个非常强大的Python模块
可以分析音频的各种信息
这里我们用到它的beat_track方法
y, sr = librosa.load(music)
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
beat_times = list(librosa.frames_to_time(beats, sr=sr))
beat_times.append(beat_times[-1] + 1)
最终我们会得到一个beat_times列表
里面包含了每个鼓点的时间
同时可以注意到最后一行
beat_times.append(beat_times[-1] + 1)
这里我将列表最后一位重复了一下
并往后偏移1秒
主要是方便我们后面处理最后一个鼓点的视频片段
得到了鼓点时间列表以后
我们来开始制作每个文字视频片段
clips = []
for index, beat_time in enumerate(beat_times[:-1]):
print(f'{index + 1}/{len(beat_times)}——{word_list[index]}')
if index >= len(word_list):
break
text_clip = TextClip(
word_list[index],
fontsize=width // 8,
color='white',
size=(width, height),
method='caption',
font='msyhbd.ttc')
.set_start(beat_time)
.set_end(beat_times[index + 1])
text_clip = text_clip.set_pos('center')
clips.append(text_clip)
这里我们用到moviepy
moviepy是我个人非常喜欢的一个python模块
一个非常强大的python视频制作模块
以后有机会再多讲讲这个模块的使用
这里我们用到了moviepy的文字片段
TextClip()
里面第一个参数是具体的文字
然后可以设置字体大小、颜色等
method='caption'是表示这个文字是标题类
当TextClip设置为标题类时
我们可以同时设置size
当文字宽度超过size时会自动换行
然后可以直接链式调用两个方法
set_start()和set_end()
用来设置这个视频片段的起始和结束时间
这里我们就正好设置为某个鼓点和下一个鼓点之间的时间
这样我们就完成了每个文字片段视频的制作
最后来生成完整的视频
final_clip = CompositeVideoClip(clips)
audio_clip = AudioFileClip(music)
final_video = final_clip.set_audio(audio_clip)
final_video.write_videofile(
output,
fps=30,
codec='mpeg4',
preset='ultrafast',
audio_codec="libmp3lame",
threads=4)
利用moviepy的CompositeVideoClip
来合成多个视频片段clip
用AudioFileClip制作音频片段
然后合成
最后直接用write_videofile()方法生成完整视频
这个方法里可以设置视频、音频编码
以及帧率FPS
最后加上
if __name__ == '__main__':
main()
就大功告成啦!
这样以后想要制作简单的快闪文字视频
只需要运行这个python文件
根据提示输入信息
就可以等着程序帮你搞定啦
是不是超方便
本期毕老师小课堂到这里就结束了啦
欢迎关注毕老师
我会继续教大家一些好玩有趣的脑洞项目
我是毕老师,依然会不定时给你们分享一些有趣好玩实用的东西,欢迎关注~
警察蜀黍!就是这个人!脑子简直有泡!还不赶紧关注一下!