Python抖音快手代码舞(字符舞)的实现方法


Posted in Python onFebruary 07, 2021

先上效果,视频敬上:

字符舞:

Python抖音快手代码舞(字符舞)的实现方法

代码舞

源代码:

video_2_code_video.py

import argparse
import os
import cv2
import subprocess
from cv2 import VideoWriter_fourcc
from PIL import Image, ImageFont, ImageDraw

# 命令行输入参数处理
# aparser = argparse.ArgumentParser()
# aparser.add_argument('file')
# aparser.add_argument('-o','--output')
# aparser.add_argument('-f','--fps',type = float, default = 24)#帧
# aparser.add_argument('-s','--save',type = bool, nargs='?', default = False, const = True)
# 是否保留Cache文件,默认不保存

class Video2CodeVideo:
 def __init__(self):
 self.config_dict = {
  # 原视频文件
  "input_file": "video/test.mp4",
  # 中间文件存放目录
  "cache_dir": "cache",
  # 是否保留过程文件。True--保留,False--不保留
  "save_cache_flag": False,
  # 使用使用的字符集
  "ascii_char_list": list("01B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:oa+>!:+. "),
 }

 # 第一步从函数,将像素转换为字符
 # 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_char
 def rgb_2_char(self, r, g, b, alpha=256):
 if alpha == 0:
  return ''
 length = len(self.config_dict["ascii_char_list"])
 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
 unit = (256.0 + 1) / length
 return self.config_dict["ascii_char_list"][int(gray / unit)]

 # 第一步从函数,将txt转换为图片
 # 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_char
 def txt_2_image(self, file_name):
 im = Image.open(file_name).convert('RGB')
 # gif拆分后的图像,需要转换,否则报错,由于gif分割后保存的是索引颜色
 raw_width = im.width
 raw_height = im.height
 width = int(raw_width / 6)
 height = int(raw_height / 15)
 im = im.resize((width, height), Image.NEAREST)

 txt = ""
 colors = []
 for i in range(height):
  for j in range(width):
  pixel = im.getpixel((j, i))
  colors.append((pixel[0], pixel[1], pixel[2]))
  if (len(pixel) == 4):
   txt += self.rgb_2_char(pixel[0], pixel[1], pixel[2], pixel[3])
  else:
   txt += self.rgb_2_char(pixel[0], pixel[1], pixel[2])
  txt += '\n'
  colors.append((255, 255, 255))

 im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))
 dr = ImageDraw.Draw(im_txt)
 # font = ImageFont.truetype(os.path.join("fonts","汉仪楷体简.ttf"),18)
 font = ImageFont.load_default().font
 x = y = 0
 # 获取字体的宽高
 font_w, font_h = font.getsize(txt[1])
 font_h *= 1.37 # 调整后更佳
 # ImageDraw为每个ascii码进行上色
 for i in range(len(txt)):
  if (txt[i] == '\n'):
  x += font_h
  y = -font_w
  # self, xy, text, fill = None, font = None, anchor = None,
  # *args, ** kwargs
  dr.text((y, x), txt[i], fill=colors[i])
  # dr.text((y, x), txt[i], font=font, fill=colors[i])
  y += font_w

 name = file_name
 # print(name + ' changed')
 im_txt.save(name)


 # 第一步,将原视频转成字符图片
 # 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_char
 def video_2_txt_jpg(self, file_name):
 vc = cv2.VideoCapture(file_name)
 c = 1
 if vc.isOpened():
  r, frame = vc.read()
  if not os.path.exists(self.config_dict["cache_dir"]):
  os.mkdir(self.config_dict["cache_dir"])
  os.chdir(self.config_dict["cache_dir"])
 else:
  r = False
 while r:
  cv2.imwrite(str(c) + '.jpg', frame)
  self.txt_2_image(str(c) + '.jpg') # 同时转换为ascii图
  r, frame = vc.read()
  c += 1
 os.chdir('..')
 return vc

 # 第二步,将字符图片合成新视频
 def txt_jpg_2_video(self, outfile_name, fps):
 fourcc = VideoWriter_fourcc(*"MJPG")

 images = os.listdir(self.config_dict["cache_dir"])
 im = Image.open(self.config_dict["cache_dir"] + '/' + images[0])
 vw = cv2.VideoWriter(outfile_name + '.avi', fourcc, fps, im.size)

 os.chdir(self.config_dict["cache_dir"])
 for image in range(len(images)):
  # Image.open(str(image)+'.jpg').convert("RGB").save(str(image)+'.jpg')
  frame = cv2.imread(str(image + 1) + '.jpg')
  vw.write(frame)
  # print(str(image + 1) + '.jpg' + ' finished')
 os.chdir('..')
 vw.release()

 # 第三步,从原视频中提取出背景音乐
 def video_extract_mp3(self, file_name):
 outfile_name = file_name.split('.')[0] + '.mp3'
 subprocess.call('ffmpeg -i ' + file_name + ' -f mp3 -y ' + outfile_name, shell=True)

 # 第四步,将背景音乐添加到新视频中
 def video_add_mp3(self, file_name, mp3_file):
 outfile_name = file_name.split('.')[0] + '-txt.mp4'
 subprocess.call('ffmpeg -i ' + file_name + ' -i ' + mp3_file + ' -strict -2 -f mp4 -y ' + outfile_name, shell=True)

 # 第五步,如果没配置保留则清除过程文件
 def clean_cache_while_need(self):
 # 为了清晰+代码比较短,直接写成内部函数
 def remove_cache_dir(path):
  if os.path.exists(path):
  if os.path.isdir(path):
   dirs = os.listdir(path)
   for d in dirs:
   if os.path.isdir(path + '/' + d):
    remove_cache_dir(path + '/' + d)
   elif os.path.isfile(path + '/' + d):
    os.remove(path + '/' + d)
   os.rmdir(path)
   return
  elif os.path.isfile(path):
   os.remove(path)
  return
 # 为了清晰+代码比较短,直接写成内部函数
 def delete_middle_media_file():
  os.remove(self.config_dict["input_file"].split('.')[0] + '.mp3')
  os.remove(self.config_dict["input_file"].split('.')[0] + '.avi')
 # 如果没配置保留则清除过程文件
 if not self.config_dict["save_cache_flag"]:
  remove_cache_dir(self.config_dict["cache_dir"])
  delete_middle_media_file()

 # 程序主要逻辑
 def main_logic(self):
 # 第一步,将原视频转成字符图片
 vc = self.video_2_txt_jpg(self.config_dict["input_file"])
 # 获取原视频帧率
 fps = vc.get(cv2.CAP_PROP_FPS)
 # print(fps)
 vc.release()
 # 第二步,将字符图片合成新视频
 self.txt_jpg_2_video(self.config_dict["input_file"].split('.')[0], fps)
 print(self.config_dict["input_file"], self.config_dict["input_file"].split('.')[0] + '.mp3')
 # 第三步,从原视频中提取出背景音乐
 self.video_extract_mp3(self.config_dict["input_file"])
 # 第四步,将背景音乐添加到新视频中
 self.video_add_mp3(self.config_dict["input_file"].split('.')[0] + '.avi', self.config_dict["input_file"].split('.')[0] + '.mp3')
 # 第五步,如果没配置保留则清除过程文件
 self.clean_cache_while_need()

if __name__ == '__main__':
 obj = Video2CodeVideo()
 obj.main_logic()

运行环境:

操作系统:win10

版本:Python 3.8.4

依赖库:pip install opencv-python pillow

管理员权限安装,我的已安装过,显示这样:

Python抖音快手代码舞(字符舞)的实现方法

依赖应用: ffpmeg(下载直接解压、将bin目录加到PATH环境变量)

Python抖音快手代码舞(字符舞)的实现方法

小白式运行(大佬请装瞎):

将上面的源代码命名video_2_code_video.py,在同一目录下新建文件夹video:

Python抖音快手代码舞(字符舞)的实现方法

在video中放入要转换的原视频,命名test.mp4:

Python抖音快手代码舞(字符舞)的实现方法

打开Python3.8

Python抖音快手代码舞(字符舞)的实现方法

运行video_2_code_video.py,如下图显示表示正在运行:

Python抖音快手代码舞(字符舞)的实现方法

会产生一些中间文件诸如:

Python抖音快手代码舞(字符舞)的实现方法

Python抖音快手代码舞(字符舞)的实现方法

经过漫长的等待,终于得偿所愿:

Python抖音快手代码舞(字符舞)的实现方法

test-txt.mp4就是所要的代码舞啦:

Python抖音快手代码舞(字符舞)的实现方法

总结 

到此这篇关于Python抖音快手代码舞实现的文章就介绍到这了,更多相关Python抖音快手代码舞内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python and、or以及and-or语法总结
Apr 14 Python
Python实现单词翻译功能
Jun 06 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
pycharm的python_stubs问题
Apr 08 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
Python爬虫之爬取二手房信息
Apr 27 Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 #Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 #Python
python数据抓取3种方法总结
Feb 07 #Python
python 批量将中文名转换为拼音
Feb 07 #Python
如何用用Python将地址标记在地图上
Feb 07 #Python
python 三种方法提取pdf中的图片
Feb 07 #Python
Python 转移文件至云对象存储的方法
Feb 07 #Python
You might like
php二维数组用键名分组相加实例函数
2013/11/06 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
深入理解javascript中的this
2021/02/08 Javascript
Python程序语言快速上手教程
2012/07/18 Python
python实现sublime3的less编译插件示例
2014/04/27 Python
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
安全检查验收制度
2014/01/12 职场文书
情侣吵架检讨书
2014/02/05 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
详解php中流行的rpc框架
2021/05/29 PHP