用Python来跳Michael Jackson的太空漫步

作者:brucek 原文链接:https://mp.weixin.qq.com/s/lyiNDbDpw5mt24gVwO0YyA

最近看到一个有意思的程序:ffmpeg。它是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以用来把视频转化为图片,在用 PIL 库把图片处理成编码,这样编码就可以和 MJ 视频一起律动起来了。

说干就干,首先打开之前收集的 MJ 的视频,把那些背景干扰比较少的镜头剪切下来处理。这个工作是个苦差,因为 MJ 的舞蹈视频基本都在演唱会上,背景比较多,效果不是太明显,再加上之前也很少用这些视频处理软件。弄了大半天总算拼了两段稍微好点的,配上了自己剪切的音乐。

视频内容

项目环境

语言: Python3 工具:Pycharm

工具准备

ffmpeg,刚才说的处理视频的程序,可去官网下载https://www.ffmpeg.org/download.html#build-windows,我的电脑是windows 64 位的,和我一样系统的话也可以公众号回复「ff」获取。

PIL 包:Python 的图形处理库。 numpy 包:Python 的一种开源的数值计算扩展,可用来存储和处理大型矩阵。

程序结构

我写了三个 py 文件,一个用来把视频转换为图片,一个用来把图片转为编码,最后一个来做最后的执行。

视频处理

下面的 ffmpeg 程序后面的几个参数我解释一下,-i 后面需要指定输入的文件名。-f 指定格式(音频或视频格式)。-vframes 设置转换多少桢(frame)的视频。-ss 从指定的时间(s)截图。

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('图片收集结束!!!')

用这个函数获取视频的每帧图片,给出的视频存放路径和获取图片的路径调用此函数就可以获取视频每帧的图片,我设置了每 0.1 秒保存一张图片。

图片转换

用 convert('L') 把图片转换为为二值图像,非黑即白。但是它每个像素用 8 个bit 表示,0 表示黑,255 表示白。

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() 

执行这个函数不会有数据返回,用下一个 go.py 文件导入调用才行。

控制输出

调用上个函数 image2txt,图片转换为编码。

def getTxt(imagePath, txtPath):
    img_count = 1
    while img_count <= len(os.listdir(imagePath)):
        imageFile = imagePath + str(img_count) + '.png'
        txtFile = txtPath + str(img_count) + '.txt'
        image2txt.image2txt(imageFile, txtFile)
        print('MJ舞蹈加载中: ' + str(img_count) + '%')
        img_count += 1

通过 os.system('cls') 控制屏幕的及时清除,以便及时显示下一帧图片的编码。

def play(txtPath):
    txt_count = 1
    while txt_count <= len(os.listdir(txtPath)):
        os.system('type ' + txtPath + str(txt_count) + '.txt')
        txt_count += 1
        os.system('cls')

给出编码文件路径和图片路径,执行函数。

txt_dir_path = r'D:\MJ\mjtxt' + '\\'
img_dir_path = r'D:\MJ\mjimages' + '\\'
getTxt(img_dir_path, txt_dir_path)
play(txt_dir_path)

收集完视频图片后在 cmd 控制台执行 go.py 文件,编码出现后点击视频播放就能达到刚才视频中的效果了。

你们可以用自己的视频去做,视频背景固定的话效果更好。

原文发布于微信公众号 - 日常学python(daily_learn)

原文发表时间:2018-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

R语言数据地图——美国地图

之前有过一段时间,特别热衷于数据地图,也分享很多篇关于地图制作的教程(涉及到各种作图软件),但大多是整理拼凑,自己发挥的不多。 最近在看哈德利.威科姆的那本火遍...

64950
来自专栏ThoughtWorks

React全家桶与前端单元测试艺术|洞见

TL;DR——什么是好的单元测试? 其实我是个标题党,单元测试根本没有“艺术”可言。 好的单元测试来自于好的代码,如果说有艺术,那也是代码的艺术。 注:以下“...

37460
来自专栏大数据和云计算技术

技术专栏丨2018 存储技术热点与趋势总结

类型:技术专栏 作者介绍 张凯(Kyle Zhang),SmartX 联合创始人 & CTO。毕业于清华大学计算机系,研究方向为分布式系统和体系结构。2013...

49080
来自专栏听雨堂

MapX5说明

把绘图功能嵌入到用户应用中的最简单、最经济的方法。 MAPINFO MAPX 是强大的ACTIVEX 组件 – 使用标准可视化程序工具可以很容易就整合到商业应...

22050
来自专栏腾讯移动品质中心TMQ的专栏

当我们讨论流畅度的时候,我们究竟在说什么?

前言:那些年我们用过的显示性能指标 相对其他 Android 性能指标(如内存、CPU、功耗等)而言,显示性能(包括但不仅限于我们常说的“流畅度”)的概念本来...

713100
来自专栏跟着阿笨一起玩NET

浅谈数据库设计技巧(上)(转)

转一篇他人写的数据库设计技巧,感觉也不一定都正确,开拓一下思路吧。 说到数据库,我认为不能不先谈数据结构。1996年,在我初入大学学习计算机...

26510
来自专栏Python攻城狮

从数据角度探究《前任3》为什么这么火爆

豆瓣上8万多人只打出了5.8的评分,其中1星-3星占比72.6%,那么问题来了,在绝大多数豆瓣粉丝都认为是“烂片”的情况下,究竟是什么让《前任3》票房意外火爆呢...

10020
来自专栏Python中文社区

数据挖掘实战(一):Kaggle竞赛经典案例剖析

專 欄 ❈那只猫,Python中文社区专栏作者,Python中文社区新Logo设计者,现就读于英国剑桥大学。 ❈— Load Lib ? 在这边提一下为什么要...

36270
来自专栏张善友的专栏

CAP理论十二年回顾:"规则"变了

CAP理论断言任何基于网络的数据共享系统,最多只能满足数据一致性、可用性、分区容忍性三要素中的两个要素。但是通过显式处理分区情形,系统设计师可以做到优化数据一致...

30690
来自专栏哲学驱动设计

Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案

去年4月,我们为 Rafy 框架添加了领域模型设计器组件。时隔一年,谨以本文,简要说明该领域模型设计器的设计思想。 设计目标 Rafy 实体框架中以领域驱动设计...

355100

扫码关注云+社区

领取腾讯云代金券