自带骚气的Python操作:把视频转换成字符动画

640?wx_fmt=jpeg


作者 | 小k,专注于 Python 编程,推送各种 Python 干货文章,资源分享,面试真题,爬虫实战、数据分析。(来源:痴海)

编辑 | Emily

前言

谈到程序员,大家的马上想到“智商高、挺聪明,厉害的,但是也有点呆板和木讷”这些评价。今天我就要教大家用我们自己的方式,分分钟就能很骚气~载发到朋友圈,秀一波!

首先,写一段 Python 3 程序读取一个 mp4 格式的视频,以终端形式输出。最后呈现出的效果?请看下面的视频~


前期准备

这个程序有 3 个代码文件:getIamge.py、image2txt,py、play.py,两个存放图片和文本的文件夹,以及一个 mp4 视频。在运行之前首先要确定你是否已经安装了 PIL 与 numpy 第三方库,以及 ffmpeg 插件。

640?wx_fmt=jpeg

项目文件结构

PIL 和 numpy 可以通过 pip 来安装。而 ffmpeg 可以去官网下载(https://www.ffmpeg.org/download.html#build-windows)。打开官网对应你的系统,点击下面的图标,去下载。

640?wx_fmt=png

ffmpeg 安装


安装好 ffmpeg,在配置下环境变量:右击我的电脑-属性-高级系统设置-环境变量-Path,加上「;d:\ffmpeg\bin」(你自己的安装路径)即可。

getImage.py

所需的第三库和 ffmpeg 安装好以后,就可以开始运行 python 代码。首先运行的是 getImage.py。getImage.py 是用于从视频中提取帧图片,提取的帧图片存放于「images/」文件夹,若文件夹中已存在帧图片可不运行该程序。若要调整每帧图片数可调整变量 crop_time 累加的数值,清空已存在的图片集,修改视频路径「videoPath」、帧图片目录路径「imagePath」,再运行 getImage.py。

getImage.py 代码:

 
 

import os
def getImage(videoPath, imagePath):
   img_count = 1
   crop_time = 0.0
   while crop_time <= 15.0:
       os.system('ffmpeg -i %s -f image2 -ss %s -vframes 1 %s.png' % (videoPath, str(crop_time), imagePath + str(img_count)))
       img_count += 1
       print('Geting Image ' + str(img_count) + '.png' + ' from time ' + str(crop_time))
       crop_time += 0.1
   print('Image Collected')
if __name__ == '__main__':
   videoPath = 'E:/badapple/a/1.mp4'
   imagePath = 'E:/badapple/a/images/'
   getImage(videoPath, imagePath)

image2txt.py

image2txt.py 用于将图片转化为一定尺寸的字符画,从「images/」文件夹中提取图片并转化为 txt 文本存放于「txt/」文件夹。默认要求的终端尺寸为 100x50 ,若屏幕不能支持该大小,可以将参数 charWidth 修改为自定义的每行显示字符数,调整后若运行 play.py 要求终端大小为 (charWidth)x(charWidth/2) 。参数值具体多少,没有一个固定的值,可以自己多尝试下。

注意:这个文件单独运行是没有任何反应的,因为在这个文件中只是定义了 getImage 函数,并没有去调用。具体的调用是在「play.py」中。

代码:

 
 

from PIL import Image
import numpy
def image2txt(inputFile, outputFile):
   im = Image.open(inputFile).convert('L')
   charWidth = 100
   im = im.resize((charWidth, charWidth // 2))
   target_width, target_height = im.size
   data = numpy.array(im)[:target_height, :target_width]
   f = open(outputFile, 'w',encoding='utf-8')
   for row in data:
       for pixel in row:
           if pixel > 127:
               f.write('1')
           else:
               f.write(' ')
       f.write('\n')
   f.close()

play.py

「play.py」用于获取 txt 文本集与依次显示 txt 文本集,以达到在终端播放字符动画的效果。运行之前请修改视频目录「videoPath」、txt 文件夹目录「txt_dir_path」、images 文件夹目录「img_dir_path」。然后运行 play.py。

注意:如果你是苹果系统,那你还需要把代码中的「type」改成「cat」,window 的就不用改。即:

 
 

os.system('cat ' + txtPath + str(txt_count) + '.txt')

写在最后

作者已经把对应的程序源码和视频文件上传到云盘,最后赶紧把代码下载下来,get 这波有点骚气的操作!

https://pan.baidu.com/s/1vqapbHseEsTLnEmJjopF7A 

密码: dugh


(本文为投稿文章,转载请联系原作者。)



福利

公众号后台回复:2018Python,获取2018Python开源项目Top100整理资料!或扫码添加小助手微信,回复:1,入群获取。


640?wx_fmt=jpeg




推荐阅读:

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值