在抖音上看到代码舞觉得很好看,上网一搜好多语言都有实现的,但是C++的比较少。参考其他实现方法,我用C++写了一个。先看结果。
运行后会播放动画和音乐。代码如下:
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <mmsystem.h>
using namespace std;
#define MAX_ROW 100
#define MAX_COL 100
#define MAX_FRAME 1348
//#pragma comment(lib, "winmm.lib") //这里不用加,这个程序是用Qt Creator编写的,在.pro文件中增加了LIBS += -lWinmm。如果其他编译器则需要这句
static char buffer[MAX_COL*MAX_ROW]; //定义一个buffer存图片
void init()
{
//console title
SetConsoleTitle("Code-Dance");
// 分辨率:控制台窗口大小
system("mode con cols=151 lines=50");
//隐藏控制台的光标
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO info = {1, 0};
SetConsoleCursorInfo(hout, &info);
}
void readData()
{
FILE *fp;
char fileName[128];
for (int i=0; i<MAX_FRAME; i++)
{
sprintf(fileName,"F:/Programs/CodeDance/txtPath/ASCII-%d.txt", 5*(i+1)); //读取文件,这个是我本机的路径,里面存了很多文件,文件名的格式为ASCII-数字.txt这样的。
fp = fopen(fileName, "r");
if (fp == NULL)
{
continue;
}
fseek(fp, 0, SEEK_END);
long length = ftell(fp);
rewind(fp);
memset(buffer, 0, MAX_COL*MAX_ROW);
fread(buffer, 1, static_cast<size_t>(length), fp);
fclose(fp);
printf("%s",buffer); //用cout<<buffer;输出也可以
Sleep(167); //间隔时间,是根据总时长除以图片数算的为了音频与视频对齐
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD loc;
loc.X = 0;
loc.Y = 0;
SetConsoleCursorPosition(houtput, loc);
}
}
int main()
{
init();
mciSendString("play ./video.mp3", NULL, 0, 0); //play music
readData();
return 0;
}
代码中的video.mp3是音乐文件,为了保持一致,这个音乐文件和视频文件长度一样。
上面程序主要用来播放字符文件,播放一张清除一下屏幕,连续的播放产生字符动画的效果。于是有了这样的问题:
字符文件从哪来? --> 是从图片转换过来。我将批量的图片文件用ASCIIGenerator这个软件进行转换,并且可以指定图片大小。该软件上网可以搜到。
这些图片从哪里来? --> 是从视频中提取出来。详见Qt从视频中获取每一帧数据
有了这些准备工作后,就可以播放了。附加一句,这个是在windows下实现的。