这个活儿非常简单,大家都可以尝试一下

第一步:用转换格式的方法把视频换成bmp位图的模式

第二步:用前人的成果(ASC工具)将图片用一种特殊的方式转换成.txt的文本文件

第三步:快速清屏输出:

Code:

#include<string.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
#include <iostream>
using namespace std;

int main()
{
	void recursur();
//函数声明
	int i = 0, caf = 33;
	char p = 0;
	FILE *fp;
	clock_t stime = 0, ftime = 0;
	char buf[1921] = {}, seat[] = "output\\test(0).txt", ai[10];
//buf是输出的字符串,seat是打开的文件名
	printf("-----test art player-----\nPress Enter to play.\nSource:av706from bilibili\n");
	getchar();
	system("cls");
	PlaySound("test.wav", NULL, SND_FILENAME | SND_ASYNC);
//输入声音
	stime = clock();
	while (i <= 6568)// 
	{
//6568是输出的总帧数,视情况而定
		if (i % 30 == 0)
		{
			caf = 43;
		}
		else
		{
			caf = 33;
		}
//设定刷新时间
		strcpy(seat, "output\\test(");
		sprintf(ai, "%d", i);
		strcat(seat, ai);
		strcat(seat, ").txt");
//把seat设定成要打开的文件的形式
		ftime = clock();
		if ((ftime - stime) >= caf)
		{
//简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)
//如果系统运行的时间还没到下一次运行时要清屏的时间,那if不进入,也就不会清屏,继续while循环
			i++;
//播放下一帧
			fp = fopen(seat, "r");
			fread(buf, sizeof(buf), 1, fp);
			buf[1920] = '\0';
			fclose(fp);
			fprintf(stdout, "%s", buf);
			fprintf(stdout, "Frame:%d", i);
			stime += caf;
//加一下当前循环的时候运行的时间
			recursur();
		}
	}
	system("cls");
	printf("----- art player-----\nThanks for watching!\nMade by Sukuna.\n\n");
	printf("Press Enter to Exit.\n");
	getchar();
	return 0;
}
void recursur()
{
	HANDLE hout;
	COORD coord;
	coord.X = 0;
	coord.Y = 0;
	hout = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hout, coord);
}

说一下recursur函数把

HANDLE 是一种句柄变量,类似于void*这种类型,COORD是cmd窗口光标类型,把光标设置成(0,0)
接着hout赋值为SED_OUTPUT_HANDLE
最后一个函数就把光标的位置重新设置一下,光标设置为0

HANDLE GetStdHandle( DWORD nStdHandle );GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。
STD_OUTPUT_HANDLE表示标准输出的句柄

SetConsoleCursorPosition是一个window api;作用是设置控制台(cmd)光标位置

这个函数是一个模版,记得就行

最后修改日期:2020年11月2日