目录

前言

一、分析

二、流程图

三、所需第三方库

四、代码

五、注意事项

六、总结


前言

最近在刷哔哩哔哩视屏时,偶然间看到了关于python把视频转换为字符动画的视频案例,觉得非常有趣,我在全网找教程和案例,最终还是没有找到符合我口味的教程,所有我结合网上一些示例,自制了一款用视频转换为字符动画的项目。


一、分析

众所周知,视频就是一张一张的图片构成的。那么如何实现视频转换图片,接下来小编用ffmpeg进行视屏转图片、音频提取、图片转视屏等操作。

什么是FFmpeg:

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 FFmpeg编码库可以使用GPU加速。

----百度百科

说白了FFmpeg是多媒体视频处理工具,所有我们用Python调用ffmpeg命令来简化我们的代码。

ffmpeg资源下载地址:

地址:https://wwb.lanzouw.com/irLF3yi1cmh
密码:bnju

二、流程图

python视频转换为字符动画的流程图如下:


三、所需第三方库

如何下载慢或报错超时后面加上镜像地址 -i https://pypi.douban.com/simple/
例如:pip install numpy==1.21.2 -i https://pypi.douban.com/simple/​
pip install tqdm
pip install numpy==1.21.2
pip install Pillow==8.4.0

四、代码

以下是相关全部的代码:

# -*- coding:utf-8 -*-
import os
import numpy as np
import tkinter as tk
from tqdm import tqdm
from time import sleep
from shutil import rmtree
from tkinter import filedialog
from PIL import Image, ImageDraw, ImageFont, ImageEnhanceSAMPLE_RATE = 0.4
OUT_FILE_NAME = "out"# 获取当前路径
now_path = os.getcwd()def main():"""主函数"""input("*** 注意:过程中会创建许多图片或文件夹,请不要乱动或删除!*** (回车继续...) ")# 打开视屏路径try:filepath = get_video()except FileExistsError as k:print(k)sleep(2)returnprint("开始转换。。。")# 视频转换为图片video_to_photos(filepath)# 如果文件夹中含有其他音乐则删除now_music = [f for f in os.listdir(now_path) if f.split(".")[-1] == "mp3"]for m in now_music:os.remove(now_path + "/" + m)# 获取视频中的音乐get_music(filepath)# 获取当前文件夹下的所有图片文件photos = [f for f in os.listdir(now_path) if f.split(".")[-1] == "jpg"]# 获取当前文件夹下的音乐music_list = [f for f in os.listdir(now_path) if f.split(".")[-1] == "mp3"]if music_list:music = music_list[0]else:music = None# 如果没有out文件夹,则创建文件夹if not os.path.exists(OUT_FILE_NAME):os.mkdir(OUT_FILE_NAME)# 图片转字符图像print("\n转换中,过程中请勿关闭,请稍等...")for p in tqdm(photos):ascii_art(now_path + "/" + p, p.split(".")[0])# # 字符图像转视屏photos_to_video()# 如果当前文件夹中含有提取的音乐则将视频、音乐合并# 然后删除音乐if music:music_join_video()os.remove(now_path + "/" + music)# 删除所有图片保留视屏print("\n正在清理缓存,请稍等...")for p in photos:os.remove(now_path + "/" + p)os.remove(now_path + "/" + OUT_FILE_NAME + ".mp4")rmtree("./%s" % OUT_FILE_NAME, True)print("转换完成,请在output.mp4中查看转换的视屏!")sleep(2.3)def ascii_art(file, save_name):"""图片转字符图"""# 打开图片im = Image.open(file)# 调整图片亮度brightness = 2  # 增强亮度的值enh_bri = ImageEnhance.Brightness(im)im = enh_bri.enhance(brightness)# 保存的路径save_path = "%s/%s/%s%s" % (now_path, OUT_FILE_NAME, save_name, ".png")# 计算字母长宽比font = ImageFont.load_default()# font = ImageFont.truetype("SourceCodePro-Bold.ttf", size=12)aspect_ratio = font.getsize("x")[0] / font.getsize("x")[1]new_im_size = np.array([im.size[0] * SAMPLE_RATE, im.size[1] * SAMPLE_RATE * aspect_ratio]).astype(int)# 调整图像im = im.resize(new_im_size)# 判断是否为纯色图片,如果为纯色图片调整图像大小不进行字符处理r, g, b = im.getextrema()if r[0] == r[1] and g[0] == g[1] and b[0] == b[1]:letter_size = font.getsize("x")im_out_size = new_im_size * letter_sizeim_out = Image.new("RGB", tuple(im_out_size), im.getcolors()[0][1])im_out.save(save_path)return# 保留一个图像的副本以进行颜色采样im_color = np.array(im)# 转换为灰度的图像im = im.convert("L")# 转换为numpy数组以进行图像处理im = np.array(im)# 以升序定义将形成最终ascii的所有符号symbols = np.array(list(" .-vM"))# 规范化的最小值和最大值到 [0, max_symbol_index)im = (im - im.min()) / (im.max() - im.min()) * (symbols.size - 1)# 生成ascii样品ascii = symbols[im.astype(int)]# 创建一个用于绘制ascii文本的输出图像letter_size = font.getsize("x")im_out_size = new_im_size * letter_sizebg_color = "black"im_out = Image.new("RGB", tuple(im_out_size), bg_color)draw = ImageDraw.Draw(im_out)# 绘制文本y = 0for i, line in enumerate(ascii):for j, ch in enumerate(line):color = tuple(im_color[i, j])  # 来自原始图像的样本颜色draw.text((letter_size[0] * j, y), ch[0], fill=color, font=font)y += letter_size[1]  # 按字母的高度增加y# 保存成图像文件im_out.save(save_path)def get_video():"""打开视屏路径"""print("请您选择要转换的视屏")# 打开选择文件对话框root = tk.Tk()root.withdraw()filepath = filedialog.askopenfilename()  # 获得选择好的文件file_extension = os.path.splitext(filepath)[1]# 如果不在格式内则报错if file_extension not in [".mp4", ".flv", ".avi", ".mpg", ".wmv"]:raise FileExistsError("目前只支持mp4, flv, avi, mpg, wmv视频格式")return filepathdef video_to_photos(filepath):"""视频转换为图片"""# 调用ffmpeg命令实现视屏转为图片 fps=25command = "{}/tool/ffmpeg -i {} -r 25 -f image2 image-%1d.jpg".format(now_path, filepath)os.system(command)def photos_to_video():"""图像转视屏"""# 调用ffmpeg命令实现图片转为视屏command = "{0}/tool/ffmpeg -i {0}/{1}/image-%1d.png out.mp4".format(now_path, OUT_FILE_NAME)os.system(command)def get_music(filepath):"""获取视频中的音乐"""# 调用ffmpeg命令获取视频中的音乐command = "{}/tool/ffmpeg -i {} -f mp3 {}.mp3".format(now_path, filepath, OUT_FILE_NAME)os.system(command)def music_join_video():"""视频、音乐合并"""# 调用ffmpeg命令获取视频中的音乐command = "{0}/tool/ffmpeg -i {1}.mp3 -i {0}/out.mp4 {1}put.mp4".format(now_path, OUT_FILE_NAME)os.system(command)if __name__ == "__main__":main()

五、注意事项

1、每转换一个视频只能开一个程序
2、不要同时转换2个视频
3、转换完成后请取走转换好的视屏再启动程序

4、要把下载好的ffmpeg放在tool文件夹下


六、总结

以上这篇Python把视频转换为字符动画方法就是小编今天分享给大家的全部内容了,希望能给大家一个参考,感谢大家的观看,如果在操作过程中遇到什么问题,也欢迎向我反馈,看到这儿的朋友要是喜欢的话就点个关注呗^_^,你们的支持是我更新的最大动力!

python还可以这么玩?用Python把视频转换为字符动画(含音频、高清、彩图)【附源码】相关推荐

  1. 疯狂python讲义视频 百度云-疯狂Python讲义 PDF高清版附源码

    内容简介 本书全面,深入地介绍了Python编程的相关内容,大致可分为四个部分.*系统部分介绍了Python的基本语法结构,函数编程,类和对象,模块和包,异常处理等: 第二部分主要介绍Python常用 ...

  2. 【原来python还可以这么玩】python逆向爬取网易云评论进行情感分析

    遥遥微光,与我同行 好久不见,各位小伙伴们!嗐,春节真滴快啊!祝大家新年快乐! 书山有路勤为径,学海无涯苦作舟!又得开始愉快滴学习了! 小夜斗今天给大家伙分享一期干货,芜湖起飞! JS逆向网易云爬取评 ...

  3. 用Python玩人脸融合,想知道你未来孩子的长相?(附源码)

    这次花了点时间,将百度智能云里面的人脸识别功能与python结合,进行了一场实验.结果还是蛮有成就感的,过程也挺简单,不会复杂,说不定,你就能融合出你孩子的长相了耶~ 下面我们一起敲起键盘吧! 前期预 ...

  4. python爬取网页版QQ空间,生成词云图、柱状图、折线图(附源码)

    python爬取网页版QQ空间,生成词云图.柱状图.折线图 最近python课程学完了,琢磨着用python点什么东西,经过一番搜索,盯上了QQ空间,拿走不谢,欢迎点赞收藏,记得github给个sta ...

  5. Python自制游戏:还原经典款贪吃蛇,表弟玩着玩着都哭了(附源码)

    文章目录 一.写在前面 二.准备工作 1.用到的软件 2.用到的模块 三.来吧 展示 四.效果 五.打包成exe可执行文件 一.写在前面 贪吃蛇这个游戏,在游戏机横行的年代,基本上闲下来就会玩玩贪吃蛇 ...

  6. python获取虎牙弹幕_教你用20行代码爬取直播平台弹幕(附源码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  7. python实现自动发送邮件,同时给多人发送,是工作变的简单(附源码)

    python自动发送邮件,实现同时给多人发送和邮箱轰炸(注意尽量不要轰炸哦,小心封号). 要想自动发送邮件首先需要获得我们邮箱的授权码. 授权码获取  QQ邮箱主页  >设置>账户> ...

  8. Python 基于微博舆情分析系统的设计与实现,GUI可视化界面(毕业设计,附源码,教程)

    文章目录 1. 简介 2. 技术选型 3. 实现功能简介 **第4章系统总体设计** 5. 系统选型 1. 简介 微博舆情分析系统软件是一款方便,快捷,实用的信息服务查询软件.随着智能手机在全球市场的 ...

  9. python数据分析实战项目—运用matplotlib可视化分析10000条北京各大区二手房区域信息(附源码)

    文章目录 开发工具 数据内容 实现代码 运行效果 10000条二手房信息下载地址 总结 开发工具 python版本:Python 3.6.1 python开发工具:JetBrains PyCharm ...

  10. Python数据分析实战-将一维列表和二维列表内容保存到本地excel文件(附源码和实现效果)

    前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型).同时做了关于图像识别的系列文章,让读者理解python进行图像识别的过程.原理和方 ...

最新文章

  1. 后台CS代码中创建四种常用的SL动画效果
  2. 服务器统一计算系统,思科为微软扩展统一计算系统UCS服务器
  3. HTML CSS JavaScript 从一个表格到一个灰阶颜色表(目录)
  4. 在传统行业做数字化转型之业务篇
  5. 初识Windows程序
  6. adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用
  7. 碰撞,处理碰撞,发射 Learn Unreal Engine (with C++)
  8. Thinkphp3.2版本Controller和Action的访问方法
  9. 使用pkg打包编译nodejs程序,手动设置缓存内容
  10. SAP License:SAP HANA CLOUD MM 实施的坑
  11. jpa基于按annotation的hibernate主键生成策略
  12. 这位硬核程序员,想好怎么过春节了吗?
  13. Hadoop 1.x和Hadoop 2.x,Hadoop 1.x局限性和Hadoop 2.x YARN优点之间的区别
  14. iPhone模拟器突然开始运行非常慢
  15. roblox虚拟世界怎么做服务器,roblox虚拟世界
  16. 迭代、原型、螺旋、敏捷模型之间的区别
  17. Linux环境下MySql卸载
  18. 读书笔记一 —— Richard Matthew Stallman
  19. 简述机器指令与微指令之间的关系_机器指令与微指令之间的关系是(
  20. html+css圆形图片

热门文章

  1. 智慧城市综合管控平台
  2. 【电脑配置】开发人员必备,黑苹果双系统安装教程
  3. IGBT工作原理及作用
  4. 后端+数据库(pycharm+mysql):使用 “flask”制作的调查量表/问卷
  5. Origin—在曲线的每个峰值处均使用高斯函数进行拟合
  6. 分布式架构总汇【转】
  7. TC软件详细设计文档(手机群控)
  8. 如何对自动驾驶技术进行全面检验?
  9. python 爬取全国最新省市区数据,并存入表
  10. 【软件相关】CATIA v5R20使用技巧