废话不多说,直接来看演示视频吧~

使用

项目链接: https://github.com/victoriqueko/mosaic

Usage: ./mosaic [options]
Allowed options:
  --help                    produce help message
  -f [ --filename ] arg     filename of the stream to open
  -w [ --width ] arg (=80)  the width of the output
  -h [ --height ] arg (=45) the height of the output

开发

其实这个播放器做起来非常简单,先使用 FFmpeg 进行解码,视频流转换成 RGB24 格式之后使用 ANSI 转义序列打印到屏幕上,音频流则转换成 S16 格式之后使用 libao 播放,这样就完成啦~

ANSI 转义序列

参考维基百科给出的资料,首先设置好终端的颜色。

cout << format("\u001B[38;2;%1%;%2%;%3%m") % red % green % blue; // 设置前景色
cout << format("\u001B[48;2;%1%;%2%;%3%m") % red % green % blue; // 设置背景色

因为大部分等宽字符宽高比大约为 1 : 2,因此可以输出一个 Unicode 字符 Upper Half Block 作为两个像素。

cout << format("\u2580"); // 上半部分为前景色,下半部分为背景色

每处理完一行数据之后,同样使用 ANSI 转义序列换行。

cout << format("\u001BE");

同理,每处理完一帧数据之后,使光标回到左上角(第一行,第一列)。

cout << format("\u001B[1;1H");

重复该过程,就可以在命令行中播放视频了。

其它

除了 ANSI 转义序列的部分,剩下的都是普通播放器里的内容了,包括解复用、解码、缩放、重采样、音视频同步等等。由于跟本文关系不大,此处略去不表。