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中将阿拉伯数字转换成中文的实现代码
May 19 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
python解包用法详解
Feb 17 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
angular.bind使用心得
2015/10/26 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python操作xml文件详细介绍
2014/06/09 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
英语感恩演讲稿
2014/01/14 职场文书
保密承诺书范文
2014/03/27 职场文书
个人培训自我鉴定
2014/03/28 职场文书
项目投资意向书
2014/04/01 职场文书
作风建设演讲稿
2014/05/23 职场文书
环保宣传标语
2014/06/12 职场文书
2014年社区工作总结
2014/11/18 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
医学生自荐信范文
2015/03/05 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python