C语言实现简易音乐播放器

注:在显示音乐播放器的图形界面时,根据的是页面的坐标来显示,故在运行时终端的大小应为Xshell全屏时终端的大小。(否则页面会显示的混乱)
具体运行效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原理:
切割歌词,存入数组,通过sleep函数创建虚拟时钟与歌词中的时间相对应。这样,创建一个进程调用mplayer播放歌曲,同时开始计时就可以完成歌词与歌曲之间的同步。主要的目的在于熟悉链表的使用。(所谓音乐播放器,是一个别人已经写好的mplayer+自己的歌词同步功能)
main.c

#include<stdio.h>
#include"my_lrc_play.h"



int main(int argc, char const *argv[])
{
    my_lrc_play();
    return 0;
}

start_mplayer.c

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
//启动mplayer播放器 
//参数song_path 为歌曲的路径
void mplayer_play(char * song_path)
{
	pid_t pid;
	pid=fork();
	if(pid<0)
	{
		perror("fork");
	}
	else if(pid==0)
	{
		close(1);
		close(2);
		execlp("mplayer","mplayer","-slave","-quiet",song_path,NULL);
		exit(0);
	}
	else
		;
}

歌词切割,以及歌词滚动与时间的匹配

#include"my_lrc_play.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include"start_mplayer.h"
#include"console.h"
#include"my_add.h"
//读lrc文件到堆区空间并返回堆区指针,以便链表的使用
char*  my_read_lrc_file(char my_lrc_name[])
{
    // printf("%s\n",my_lrc_name);
    // return my_lrc_name;
    //字符数组已成功获取

    //打开文件
    FILE* fp = fopen(my_lrc_name,"r");
    if (NULL == fp)
    {
        perror("fopen");
        exit(-1);
    }
    
    //将文件流定位到指针末尾
    fseek(fp,0,2);
    //获取文件长度
    int len = ftell(fp);
    //复位文件流指针(此处如果写fclose应该需要重新打开)
    rewind(fp);

    //使用calloc全体自动置0,接下来仅仅读入len的长度,方便%s访问
    char* stack = (char*)calloc(1,len+1);

    //此处应该考虑文件大于堆区空间的情况,再议
    //
    fread(stack,len,1,fp);
    fclose(fp);

    return stack;

}

int my_strtok_lrc_data(char* stack,char* cut_of_every_row_arr[])
{
    int i = 0;
    cut_of_every_row_arr[i] = strtok(stack,"\r\n");
    //如果还未指向堆区的\0,说明还没切完继续切
    while (cut_of_every_row_arr[i] != NULL)
    {
        i++;
        cut_of_every_row_arr[i] = strtok(NULL,"\r\n");

    }
    return i;
}

// 切好之后,传入切好的堆区头部指针们,进行格式化输出到屏幕
#if 0
//这获取不到是为什么???
void my_analyze_lrc_head(char** cut_of_every_row_arr)
{
    int i = 0;
    while (cut_of_every_row_arr[i][1]<'0'||cut_of_every_row_arr[i][1]>'9')
    {
        
            char msg[128] = "";
            sscanf(&(cut_of_every_row_arr[i][1]),"[%*2c:%[^]]]",msg);
            //光标定位输出******
            printf("%s\n",msg);
            printf("hellp\n");
        i++;
    }
    
}
#endif
//获取头
void my_analyze_lrc_head(char* cut_of_every_row_arr[])
{
    int i =0;
    while (cut_of_every_row_arr[i]!=NULL)
    {
        char* p = cut_of_every_row_arr[i];
        if (p[1]>='a'&&p[1]<='z')
        {
            //char msg[128
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值