“   阅读文本大概需要 3 分钟

还记得读高中时,有一次和同学一次去网吧上网,他让我看一个视频,是 Michael Jackson 的前倾 45° 的动作,当时觉得舞蹈还可以这样跳,太炫酷了。那时在网吧看了 2 小时 MJ 的舞蹈。此后就迷上了 MJ,迷上了他的太空步,迷上了他的机械舞,迷上了他的超强节奏律动的歌曲,成为了小小的 MJFans。那时为了备战高考,我和这位同学一起在学校附近住了一间房间,那时镇上的房租也很便宜。学习累了,就一起在 MJ 的歌曲中练练太空步,乐此不疲。

大学期间,我还在宿舍没人时自己偷偷看视频练习 MJ 的舞蹈 dangerous,可惜自己基础太差,上不了台面,上台表演的梦想只好作罢。

如今都毕业几年了,手机也换得频繁,但手机里总会有 MJ 的歌,累了乏了就会听听,边听边跟着节奏一起打着节拍,听完之后感觉全身又充满了力量。看到有些视频软件上有人发布了 MJ 的视频,也总会忍不住点进去看看。

最近看到一个有意思的程序: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 文件,编码出现后点击视频播放就能达到刚才视频中的效果了。

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

在公众号回复「MJ」获取源码。

写在最后

方法教给大家了,视频素材可以优化,大家可以自己收集好的视频素材,发到朋友圈,让代码骚动起来!觉得有意思的话希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在后台加入技术交流群,群里有大神,可以一起交流学习。

推荐阅读:

用 Python 玩微信,机器人陪你唠嗑

这篇文章带你轻松入门 python 爬虫

brucepk


长按二维码关注我们

本公众号专注:

1.Python 技术分享

2.Python 爬虫分享

3.资料、工具共享

欢迎关注我们,一起成长!

让代码和迈克杰克逊一起跳舞相关推荐

  1. matlab跳舞小人代码,可控制的跳舞小人

    可控制的跳舞小人 - www.webdm.cn s=250 sw=eval(screen.width/2-120) tl = new Array( " o\n"+ " / ...

  2. 利用亚运会,读懂 Python装饰器

    阅读文本大概需要 5 分钟. 2018 年印度雅加达亚运会已接近尾声,中国在金牌榜和总奖牌榜都遥遥领先于第二名的日本,我也是一名体育爱好者,平时有比赛也会看.看到中国的国旗在海外飘扬,内心会格外的自豪 ...

  3. 通过四六级英语考试的正确姿势

    点击上方"brucepk",选择"置顶公众号" 第一时间关注 Python 技术干货! 阅读文本大概需要 4.6 分钟. 今天是教师节,先祝天下所有老师教师节快 ...

  4. 你的爬虫数据储存在哪?MongoDB入门篇

    点击上方"brucepk",选择"置顶公众号" 第一时间关注 Python 技术干货! "   阅读文本大概需要 3.1 分钟 我们之前做的项目都是以 ...

  5. Python 教你轻松下载网易音乐歌曲

    点击上方"brucepk",选择"置顶公众号" 第一时间关注 Python 技术干货! "   阅读文本大概需要 2.8 分钟 前两篇文章收集了歌手信 ...

  6. 只会写代码,不如去种田

    打小父亲就教我写代码,他是软件工程师,也是我见过最好的导师之一.最近他和我妈妈开了一家有机农场,很积极的倡导可持续生活,也非常热衷地参加社区活动. 这两天 code.org 发起了一场颇为宏大的&qu ...

  7. 终于知道程序员为什么总是带个耳机了!

    "能别带耳机吗?" "你能别来打扰我工作吗?" :"不能!" 前阵子有篇热文:当一个程序员一天被打扰 10 次,后果很惊人! 看后网友都表示 ...

  8. Objective-C之Category(分类)

    Objective-C之Category(分类) 假设有这样一个场景,我们需要定义一个Person类,这个类包含很多方法,如:吃饭.喝水.打LOL.看书.敲代码.唱歌.跳舞.rap.游泳.爬山.玩Sw ...

  9. 学好顶级算法谜题,不再为了编程而编程

    谜题趣味非凡.顶级谜题的解可没那么浅显易得,需要灵光一闪才能发现.算法谜题是指谜题的解法就是算法,解题的步骤可以被机器自动执行.算法可以用英文或者其他任何自然语言来描述,但是为了更加精确,往往会用伪代 ...

最新文章

  1. 在线报名竞赛网站java源码_我用Java写出了一个QQ!可在线聊天(附源码)~
  2. android状态栏半透明灰色,Android7.0沉浸式状态栏蒙灰问题完美解决
  3. 【十问十答】粒子群算法(PSO)
  4. 程序猿专属成语 get√
  5. 《小学生C++趣味编程》第2课 春晓 动动脑 第1题-2018-12-12
  6. PHP初学者头疼问题总结
  7. Python进阶:如何将字符串常量转化为变量? 1
  8. 十种程序语言帮你读懂大数据的“秘密”,Julia位列其中!(转)
  9. @WebServlet
  10. Java复习 思维导图
  11. iVMS-4200 Vs区别_菲尔·杰克逊揭示了迈克尔·乔丹和科比·布莱恩特之间的关键区别...
  12. CCS3.3 新建工程遇到的问题
  13. Html+css+js实战:百度搜索框样式实现
  14. 《Hadoop权威指南》读书笔记——MapeReduce入门
  15. 这么多的面试题目,总有一个你会在面试中碰到
  16. 后台配置商品规格sku(vue+element)
  17. umi 解决找不到antd组件库中组件的路径问题 filePath not found of antd/es/float-button
  18. 零信任在某省政务大数据智能项目的落地实践
  19. SSM-SpringMVC过滤器
  20. PM如何整合资源——来自项目管理群的讨论[转]

热门文章

  1. 阿里实习测评:扇形涂色问题
  2. 网络编程Winsock——listen
  3. 3D Max 或者 Maya 导出 FBX到UE4 的基本注意事项。
  4. 【发表案例】 CCF推荐网络安全类SCI,仅27天录用
  5. 网件使用计算机mac地址吗,网件原生固件设置无线MAC地址过滤详细步骤
  6. pdf加密?教您一招免费去掉PDF文件权限
  7. Eviews基于多元回归模型OLS的CPI影响因素分析
  8. Java大数据就业方向有哪些?
  9. STM32F103C8T6实验代码之NRF24L01P 多发一收
  10. 【软件工程】第五章 结构化设计