热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(Python3)视频转字符动画初学者超详细实战,亲测有效!

之前是为了完成老师布置的一个作业,觉得视频转字符动画乍一看比较容易完成,于是就选了这个项目。但是实际做了之后才觉得对于初学者来讲,确实轻敌了。在网上找了好几篇相关的文章,但是总觉得

之前是为了完成老师布置的一个作业,觉得视频转字符动画乍一看比较容易完成,于是就选了这个项目。但是实际做了之后才觉得对于初学者来讲,确实轻敌了。
在网上找了好几篇相关的文章,但是总觉得解释得不够详细,新手很容易被一些小地方打倒,今天一时兴起就把之前做的内容整理了一下,借用了网上的代码,想马上看效果的同学只需要把第63行代码的字体文件路径第129行的代码的待转换视频文件路径改为自己的路径就OK。

点击观看B站做出来的视频效果:
https://b23.tv/av85345204

一、要准备的Python库以及用到的模块

1.PIL库下载与安装

pillow下载:https://github.com/python-pillow/Pillow
《(Python3)视频转字符动画初学者超详细实战,亲测有效!》

《(Python3)视频转字符动画初学者超详细实战,亲测有效!》

将文件解压后,进行pillow安装:https://jingyan.baidu.com/article/2a138328efc944074a134fd7.html

pycharm的pillow库下载及安装:
https://blog.csdn.net/qq_36693604/article/details/77581753

pillow库使用:
https://www.cnblogs.com/Lival/p/6211602.html

2.shutil模块

shutil库详解:
https://www.cnblogs.com/sui776265233/p/9225417.html

3.os模块

os模块用法综合:
https://www.cnblogs.com/heluobing/p/10963763.html

4.sys模块

https://blog.csdn.net/qq_38526635/article/details/81739321

5.ffmpeg

ffmpeg的下载和安装:
https://www.chiser.cc/1406.html
ffmpeg的使用方法:
①https://www.cnblogs.com/leisure_chn/p/10297002.html
②https://blog.csdn.net/u011330638/article/details/82392268

需要注意的地方

1.第62行代码,字体设置
查看自己电脑上的字体:
①首先,找到”我的电脑“,并打开系统盘。
②在系统盘中,找到”Windows“文件夹。
③在”Windows“文件中,找到“Fints”文件夹,此文件夹中的内容就是此电脑的所有字体。
④打开Fonts文件夹,即可看到所有的字体。

源代码及参考文章出处:https://zhuanlan.zhihu.com/p/44373317?utm_source=wechatMessage_article_bottom

送上源代码

from PIL import Image, ImageDraw, ImageFont
import os, sys
import shutil
# 灰阶值越大,取越后面的字符
symbols = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
#生成字符画,在第104行调用!!!!!!
def ascii_art_convert(src_dir, dest_dir): #ascii_art_convert('D:\\temp_thum', 'D:\\temp_ascii')
print('开始生成...')
picts_list = sorted(os.listdir(src_dir)) #返回文件或文件名并排序 src_file = 'D:\\apple.mp4'
len_picts = len(picts_list)
i = 1
#输出所有缩略图文件和文件夹,对每一张图进行操作
for picture in picts_list:
(pixels, x_size, y_size) = load_picture(os.path.join(src_dir, picture)) #调用转灰度图函数
#生成字符画图片,os.path.join(),将join()里面的参数拼接成一个完整得路径。windows默认用\拼接
create_ascii_picture(pixels, symbols,os.path.join(dest_dir, picture), x_size, y_size) #调用灰度图转字符画
print('正在生成中... {0}/{1}'.format(i, len_picts))
i += 1
#在第100行调用!!!!!!
#调用PIL库形成缩略图,也就是改变图片尺寸,为后面转字符画提高效率,并临时存储
def create_thumbnail(src_dir, dst_dir):
picts_list = sorted(os.listdir(src_dir))
for picture in picts_list:
base_name = os.path.basename(picture)
img = Image.open(os.path.join(src_dir, picture))
size = 200, 200
img.thumbnail(size, Image.ANTIALIAS)
img.save(os.path.join(dst_dir, base_name))
#在第17行调用!!!!!!
#将图片转为灰度图
def load_picture(filename):
# Gray = R*0.299 + G*0.587 + B*0.114 灰度公式
#在这里直接调用PIL库实现
img = Image.open(filename).convert('L')
(x, y) = img.size
pixels = list(img.getdata())
img.close()
return (pixels, x, y)
#在第21行调用!!!!!!
#将灰度图的每一个像素点替换为相应的字符
def create_ascii_picture(pixels, symbols, dest_name, x_size, y_size):
scale = 4 # 长宽扩大倍数
border = 1 # 边框宽度
interval_pixel = 2 #原图片间隔多少个像素点来填充,使图片看起来不密集,提高转化时间
img = Image.new('L',(x_size*scale + 2*border,y_size*scale + 2*border),255)
fnt = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf', int(scale*3)) #C:\Windows\Fonts\Arial.ttf 是计算机上字体的文件路径
t = ImageDraw.Draw(img)
x = border
y = border
for j in range(0, y_size, interval_pixel):
for i in range(0, x_size, interval_pixel):
t.text((x, y),symbols[int(pixels[j*x_size + i]/256 * len(symbols))],font=fnt,fill=0)
x += scale * interval_pixel
x = border
y += scale * interval_pixel
img.save(dest_name, "JPEG") #将所有替换后的字符画成一张字符画
#创建目录
def start_convert(src_file):
if not os.path.exists('D:\\temp_pic'):
os.mkdir('D:\\temp_pic')
if not os.path.exists('D:\\temp_thum'):
os.mkdir('D:\\temp_thum')
if not os.path.exists('D:\\temp_ascii'):
os.mkdir('D:\\temp_ascii')
#分离音频
slice_audio_cmd = 'ffmpeg.exe -i {0} -vn D:\\temp.mp3'.format(src_file) #D:\\temp.mp3是临时保存分离音频的路径
os.system(slice_audio_cmd) #os.system()将字符串转化为命令在服务器上运行
#分割视频为若干图片
slice_pic_cmd = 'ffmpeg.exe -i {0} -r 24 D:\\temp_pic/%06d.jpeg'.format(src_file) #分割图片的命令,D:\\temp_pic临时是保存切割好的图片的路径
os.system(slice_pic_cmd)
#生成缩略图
create_thumbnail('D:\\temp_pic', 'D:\\temp_thum') #调用了前面定义的函数 D:\\temp_thum是临时保存缩略图的路径
#生成字符画
ascii_art_convert('D:\\temp_thum', 'D:\\temp_ascii') #调用了前面定义的函数,保存字符画图片D:\\temp_ascii
#合成字符视频
dst_name = os.path.join(os.path.dirname(src_file), 'ascii_' + os.path.basename(src_file)) #os.path.dirname(path)
merge_ascii_video_cmd = 'ffmpeg -threads 2 -start_number 000001 -r 24 -i {0}/%06d.jpeg -i D:\\temp.mp3 -vcodec mpeg4 {1}'.format('D:\\temp_ascii', dst_name)
os.system(merge_ascii_video_cmd)
print('生成完成!')
#删除一些临时的文件及文件夹
if os.path.exists('D:\\temp_pic'):
shutil.rmtree('D:\\temp_pic') #递归地删除分割视频得到的图
if os.path.exists('D:\\temp_thum'):
shutil.rmtree('D:\\temp_thum') #递归地删除缩略图文件
if os.path.exists('D:\\temp_ascii'):
shutil.rmtree('D:\\temp_ascii') # 递归地删除字符画图片
if os.path.exists('D:\\temp.mp3'):
os.remove('D:\\temp.mp3')
if __name__ == '__main__':
src_file = 'D:\\BadApple.mp4' #待转换视频的文件路径
start_convert(src_file) #调用函数

推荐阅读
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • Android开发常见问题汇总(含Gradle解决方案)第二篇
    本文继续深入探讨Android开发中常见的问题及其解决方案,特别聚焦于Gradle相关的挑战。通过详细分析和实例演示,帮助开发者高效解决构建过程中的各种难题,提升开发效率和项目稳定性。 ... [详细]
  • 本文探讨了如何将Python对象转换为字节流,以实现文件保存、数据库存储或网络传输的需求。主要介绍了利用pickle模块进行序列化的具体方法。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
author-avatar
ooleysciacca
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有