路过的年轻人啊,你是要用左手点个赞呢,还是要右手点个关注呢

前言:

网络上热门的代码舞视频源代码来了,通过借助FFmpeg的视频编辑能力和pythone+opencv对图片进行解析编辑,最后合成一个代码舞视频

先看看效果

1. 首先给python安装opencv依赖

pip install opencv-python pillow

2. 安装FFmpeg

http://ffmpeg.org/download.html

3. 建立FFmpeg环境变量:

解压下载下来的FFmpeg压缩包,然后在系统环境变量Path中新建一条,将FFmpeg解压后的bin目录添加进去
示例

C:\Users\59983\Downloads\ffmpeg-2022-06-01-git-c6364b711b-full_build\bin

4.运行

将以下Python代码保存成py文件,在py文件目录中建立video文件夹,将需要转换的视频名字改成test.mp4,然后运行py文件等待日志输出完毕就可以发现video文件夹会多出来一个代码舞视频

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_chardef 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) / lengthreturn self.config_dict["ascii_char_list"][int(gray / unit)]# 第一步从函数,将txt转换为图片# 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_chardef txt_2_image(self, file_name):im = Image.open(file_name).convert('RGB')# gif拆分后的图像,需要转换,否则报错,由于gif分割后保存的是索引颜色raw_width = im.widthraw_height = im.heightwidth = 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().fontx = 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_hy = -font_w# self, xy, text, fill = None, font = None, anchor = None,# *args, ** kwargsdr.text((y, x), txt[i], fill=colors[i])# dr.text((y, x), txt[i], font=font, fill=colors[i])y += font_wname = file_name# print(name + ' changed')im_txt.save(name)# 第一步,将原视频转成字符图片# 调用栈:video_2_txt_jpg -> txt_2_image -> rgb_2_chardef video_2_txt_jpg(self, file_name):vc = cv2.VideoCapture(file_name)c = 1if 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 = Falsewhile r:cv2.imwrite(str(c) + '.jpg', frame)self.txt_2_image(str(c) + '.jpg')  # 同时转换为ascii图r, frame = vc.read()c += 1os.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)returnelif 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):# 第一步,将原视频转成字符图片print("第一步,将原视频转成字符图片")vc = self.video_2_txt_jpg(self.config_dict["input_file"])print("获取原视频帧率")# 获取原视频帧率fps = vc.get(cv2.CAP_PROP_FPS)# print(fps)vc.release()print("第二步,将字符图片合成新视频")# 第二步,将字符图片合成新视频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')print("第三步,从原视频中提取出背景音乐")# 第三步,从原视频中提取出背景音乐self.video_extract_mp3(self.config_dict["input_file"])print("第四步,将背景音乐添加到新视频中")# 第四步,将背景音乐添加到新视频中self.video_add_mp3(self.config_dict["input_file"].split('.')[0] + '.avi', self.config_dict["input_file"].split('.')[0] + '.mp3')print("第五步,如果没配置保留则清除过程文件")# 第五步,如果没配置保留则清除过程文件self.clean_cache_while_need()print("代码舞视频制作完成")if __name__ == '__main__':obj = Video2CodeVideo()obj.main_logic()

最后我还有一句话要说:

螃蟹在剥我的壳,笔记本在写我。漫天的我落在枫叶上,雪花上。而你在想我。

武汉三行情书第一作品

Python实现视频转代码舞相关推荐

  1. python+OpenCV视频检测+代码以及注解

    这部分是关于检测摄像头中的人脸,以及对mp4中的文件人脸检测,上代码: #导入cv模块 import cv2 as cv #检测函数 def face_detect_demo(img):gary = ...

  2. python爬虫视频下载代码_Python3百行代码批量下载抖音视频|python爬虫|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...

  3. python制作代码舞视频来啦~

    上一篇文章我们介绍了如何制作字符画视频,今天就来给大家介绍一下代码舞的视频制作 最后效果展示 首先是原版 接着是黑白版的 最后是彩色版的 是不是看着很nice呢,哈哈哈哈 项目实现 第一步 首先我们要 ...

  4. Python之抖音快手代码舞--字符舞

    先上效果,视频敬上: 字符舞: 代码舞 源代码: video_2_code_video.py import argparse import os import cv2 import subproces ...

  5. 用Python做个小仙女代码蹦迪视频

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...

  6. python编程实例视屏-使用Python实现视频下载功能实例代码

    最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有一个程序可以把各大视频网站的热门用户最新发布的视频下载下来,不仅方便了观看,还可以将没有版权的视频发布在个人社交网站上,增加自 ...

  7. python视频处理代码_python如何实现视频转代码视频

    本文实例为大家分享了python如何实现视频转代码视频的具体代码,供大家参考,具体内容如下 # -*- coding:utf-8 -*- #coding:utf-8 import argparse i ...

  8. b站路飞学城python课梨视频项目代码

    @b站路飞学城python课梨视频项目代码 # -*- coding:utf-8 -*- import requests from lxml import etree import random im ...

  9. python多线程下载视频_python 实现多线程下载视频的代码

    代码: def thread(url): r = requests.get(url, headers=None, stream=True, timeout=30) # print(r.status_c ...

  10. 使用Python+Moviepy 5行代码实现两视频顺序拼接

    ☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 一.引言 最近看到好几篇类似"n行Python代码-"的博文,看起来还 ...

最新文章

  1. linux 时间戳及时间差计算
  2. 浅谈 Scala 中下划线的用途
  3. nfs需要开通什么端口_创业板开通需要什么条件?开通创业板门槛,要怎么样开通创业板?...
  4. java虚拟机规范阅读(三)异常
  5. 速途网范锋:我的创业路早已命中注定
  6. build.gradle配置参数详解
  7. 第十九:如何在Windows下把Allure2与Jenkins的集成生成自定义的测试报告(重点超详细)
  8. Java Vistor 设计模式
  9. centos 6.8 配置csh的shell和环境变量
  10. Mybatis插入postgresql数据库中类型为UUID的字段
  11. 冰点文库 3.2.14
  12. STM32F4之SDIO接口
  13. CCF推荐-计算机网络领域顶级期刊会议
  14. C语言根据国家英文首字母进行排序
  15. e5cz温控表中文说明书_欧姆龙温控器e5cz说明书 OMRON温控表E5EC说明书
  16. 物联网---网络通信协议
  17. ASPICE SWE3之——模型生成软件详细设计1 配置
  18. android的app勾选了通知消息,为何Android中大部分锁屏APP都要手动勾选“通知使用权”(Notification Access)?...
  19. 港科夜闻|香港科大(广州)与深圳湾实验室签署重要战略合作协议,共同促进粤港澳大湾区产业升级、社会发展与科技进步...
  20. 专线网络与家庭宽带区别(基础篇)

热门文章

  1. AU入门音频编辑基本认识
  2. Maya中怎么一键清除历史
  3. RAP简介教程常用规则
  4. flutter 初视回味
  5. log4cxx linux 使用,log4cxx在Linux下的编译使用
  6. android 18x games,Roadgames
  7. 《论文阅读》THE CURIOUS CASE OF NEURAL TEXT DeGENERATION
  8. 一篇文章从了解到入门shell
  9. 大数据时代:数据收集比数据挖掘更有意义
  10. 英特尔推出全新RRP物联网平台 计划为零售技术投资一亿美元