上一篇文章我们介绍了如何制作字符画视频,今天就来给大家介绍一下代码舞的视频制作
首先是原版
接着是黑白版的
最后是彩色版的
是不是看着很nice呢,哈哈哈哈
第一步
首先我们要准备一个视频,然后我们需要把视频转化为gif图片
视频转化为gif的方式途径有很多,我这里是在这个网站里面转化的
第二步
在这里我们需要借助到一个工具
第一个框框是图片的位置,第二个框框是文件输出的位置,一般不需要改,上传图片后,我们点击Settings选项
Output type有三个选项,第一个是生成一个html文件,第二个是生成黑白的代码gif图片,第三个是生成彩色的gif图片,也就是文章开头的样子,同时在它的输出路径下有一个temp文件。里面存放的就是gif图片每一帧的图片
第三步
这里我们就需要用python代码将temp文件夹里面的每一帧图片合成mp4视频
首先导入本次项目需要的包
import os
import re
import cv2
from PIL import Image
然后我们要将temp文件夹里面的gif图片改成数字名字,顺便把bmp类型的图片删除
def rename_gif(gif_path): # temp_path 是你存放gif和bmp文件的路径文件夹,也就是temp文件夹的路径
file_list = os.listdir(gif_path) # 读取当前文件夹所有文件
n = len(file_list)
for i in range(n):
s = str(file_list[i])
if s[-4:] == ".gif": # 检查后缀
res = re.findall(r"\d+", s) # 获取它的顺序值
src = os.path.join(os.path.abspath(gif_path), s) # 原先的图片名字
dst = os.path.join(os.path.abspath(gif_path), res[0] +'.gif') # 根据自己的需要重新命名
os.rename(src, dst) # 重命名,覆盖原先的名字
else:
os.remove(gif_path + s) # 删除.bmp文件
然后我们需要将gif图片转化为jpg类型便于后面合成mp4文件
def iter_frames(im):
try:
i= 0
while 1:
im.seek(i)
imframe = im.copy()
if i == 0:
palette = imframe.getpalette()
else:
imframe.putpalette(palette)
yield imframe
i += 1
except EOFError:
pass
def gif2img(gif_path):
gifs = os.listdir(gif_path)
gifs.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
for gif in gifs:
im = Image.open(gif_path+gif) # 打开gif格式的图片
im = im.convert('RGB')
if not os.path.exists('./img'):
os.makedirs('./img')
for i, frame in enumerate(iter_frames(im)):
frame.save('./img/' + gif[0:-4] + '.jpg', **frame.info) # 保存成jpg格式
最后就是合成我们的视频
def charts2video(img_path, video_path):
"""将给定目录下的图片转成视频
Args:
img_path: 图片路径
video_path: 输出视频的路径和名称
Returns: 图片转成的视频
"""
images = os.listdir(img_path)
images.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
fps = 12 # 帧数
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
im = Image.open(img_path + images[0])
video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
for img_i in images:
frame = cv2.imread(img_path + img_i)
print('开始将 ' + img_i + ' 加入视频\n')
video_writer.write(frame) # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
video_writer.release()
当然最后还有我们的主函数
if __name__ == '__main__':
gif_path = './temp/' # gif文件的路径
video_path = '合成后的视频.mp4' # 要保存的视频路径
# 修改.gif文件的名字
rename_gif(gif_path)
# 将.gif文件转换为.jpg文件
gif2img(gif_path)
# 将.jpg文件转换为.mp4文件
charts2video('./cache_char/',video_path)
最后就合成我们需要的代码舞视频啦,如果你想再给代码舞视频加上背景音乐,你需要用视频剪辑软件进行合成,从原始视频里面提取背景mp3文件的话,可以用网上在线转换器,我这里用的是
最后所有源码奉上
import os
import re
import cv2
from PIL import Image
def rename_gif(gif_path): # temp_path 是你存放gif和bmp文件的路径文件夹,也就是temp文件夹的路径
file_list = os.listdir(gif_path) # 读取当前文件夹所有文件
n = len(file_list)
for i in range(n):
s = str(file_list[i])
if s[-4:] == ".gif": # 检查后缀
res = re.findall(r"\d+", s) # 获取它的顺序值
src = os.path.join(os.path.abspath(gif_path), s) # 原先的图片名字
dst = os.path.join(os.path.abspath(gif_path), res[0] +'.gif') # 根据自己的需要重新命名
os.rename(src, dst) # 重命名,覆盖原先的名字
else:
os.remove(gif_path + s) # 删除.bmp文件
def iter_frames(im):
try:
i= 0
while 1:
im.seek(i)
imframe = im.copy()
if i == 0:
palette = imframe.getpalette()
else:
imframe.putpalette(palette)
yield imframe
i += 1
except EOFError:
pass
def gif2img(gif_path):
gifs = os.listdir(gif_path)
gifs.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
for gif in gifs:
im = Image.open(gif_path+gif) # 打开gif格式的图片
im = im.convert('RGB')
if not os.path.exists('./img'):
os.makedirs('./img')
for i, frame in enumerate(iter_frames(im)):
frame.save('./img/' + gif[0:-4] + '.jpg', **frame.info) # 保存成jpg格式
def charts2video(img_path, video_path):
"""将给定目录下的图片转成视频
Args:
img_path: 图片路径
video_path: 输出视频的路径和名称
Returns: 图片转成的视频
"""
images = os.listdir(img_path)
images.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
fps = 12 # 帧数
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
im = Image.open(img_path + images[0])
video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
for img_i in images:
frame = cv2.imread(img_path + img_i)
print('开始将 ' + img_i + ' 加入视频\n')
video_writer.write(frame) # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
video_writer.release()
if __name__ == '__main__':
gif_path = './temp/' # gif文件的路径
video_path = '合成后的视频.mp4' # 要保存的视频路径
# 修改.gif文件的名字
rename_gif(gif_path)
# 将.gif文件转换为.jpg文件
gif2img(gif_path)
# 将.jpg文件转换为.mp4文件
charts2video('./cache_char/',video_path)
以上就是代码舞的视频制作,希望能得到你的喜欢