在命令行文本模式下播放视频

2015/11/21

Tags: python ffmpeg

项目github地址: https://github.com/ee0703/console_video

闲来无事,外加新拿到一个Dell的U2312显示器,于是决定弄一个在console中播放badapple的屏保程序,想想都觉得很酷啊。先找找开源的东西,搜索github,于是找到了这玩意。看起来很美好,结果分辨率没法调整,而且不是全屏的,完全没法看啊。

纠结半天后,终于决定自己写一个。从Bilibili上找来一个高清baddapple视频,1080p,60fps,简直太棒了。然而分辨率太大了,于是安装了ffmpeg用来转分辨率。突然想起ffmpeg这货本来就是解码器合集,本来就可以用来播放视频,于是有了以下思路:


              ffmpeg           Python             console
    视频文件  ----------> 图像 -----------> 字符串 -----------> 播放

第一步是Python调用ffmpeg的问题,我搜索了Github,发现已经有现成的基于pipe的python和ffmpeg交互的库,看名字是个日本人写的,在此对这位哥们表示由衷的感谢。

好棒,我已经迫不及待的想要开始装逼了!

第二步稍微有点难度,就是图像转文本,通过pipeffmpeg可以直接得到Image对象,但是怎么把图像转换成文本,同时又保证速度呢(毕竟ffmpeg是实时播放视频,处理速度不能太慢,否则会很卡)。一种比较酷的方法是把图片切成一个一个的小格子,然后将每一个格子识别成一个文字,这也就是传说中的OCR。然而这种方法实在是太慢了,实时播放肯定会很卡,而且实现起来也过于复杂(涉及到机器学习,不是两下就能搞定的)。于是我想到了一种简易粗暴的方法,直接把颜色按灰度值转化成字符。首先找一些按灰度值排好序的字符,空格肯定是灰度最低的(黑色背景下),目前比较常用的灰度序列是下列代码中所示的那串长度为70的字符串。这样,图片转文字就很简单了,核心代码如下:

# 70个字符组成的的灰度值序列
gray_scale = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''

def color2char(color):
    """把 0 ~ 255的灰度颜色值转成字符"""
    index = color/3
    if index >= 69:
        index = 69
    return gray_scale[69-index]

测试了一下baddapple这样的黑白视频,效果还不错。但是因为分辨率低的关系,播放一些普通视频,就非常模糊了,你能看出下面的视频是在打网球吗?

搞定,整个程序不到60行,前前后后共花了不到两个小时。