linux下用C语言实现MP3播放器

首先我们要来看几个函数:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
接下来我们安装一下madplay这是一个播放器。

sudo apt-get install madplay

建议给软件源换成阿里的,下载的快。
安装完成后测试方法为:
madplay xxxx xxxx最好是绝对路径
示例:madplay /home/jason/music/stan.mp3

程序思路:
首先打开存放音乐文件的目录把
然后找出所有的.mp3文件并保存文件名
文件名有了,路径有了。就简单了嘛
接下来看一下madplay指令:

管理madplay的主程序,包括播放,暂停播放,恢复播放,停止播放
system("madplay north.mp3 &");//利用system函数调用madplay播放器播放*.mp3音乐

system("madplay north.mp3 -r &");//循环播放:参数-r

system("killall -9 madplay");//利用system函数调用killall命令将madplay终止掉 
          
system("killall -STOP madplay &");//利用system函数调用killall命令将madplay暂停

system("killall -CONT madplay &");//利用system函数调用killall命令恢复madplay的播放

代码写的比较简陋,没有细细优化,我把遍历目录生成歌单和歌曲播放写在了一起,导致了每次查看歌单会导致程序出错。也就是text_mp3函数访问第一次是莫得问题的,暂停,播放,切换歌曲都是莫得问题的,不过一但查看菜单就会出错。因为每次查看菜单都要重新遍历文件夹。解决方法:给遍历查找,和歌单生成分开写就好了。
别问我为啥不改:懒懒懒!!!!!

#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "dirent.h"
#include "string.h"
#define N 1024
struct text_work
{
    char date[1024];
    char music_name[1024];
    char suffix[4];
};
struct text_work name[100];
char path_str[N]={0};
char str[N]={0};
char str_path[N]={0};
void text_mp3(void);
char* reverse_string(char* str);
int face(void);
void play(void);
void manual(void);
void last(void);
void next(void);
void exit_music(void);
void money(void);
void stop(void);
int count=0;
int tim=0;//歌曲个数
int s;//正在播放歌曲
int main(void)
{
    int n;
    while(1)
    {
       n=face(); 
       switch (n)
       {
       case 1: manual();break;
       case 2: text_mp3();break;
       case 3: stop();break;
       case 4: play();break;
       case 5: last();break;
       case 6: next();break;
       case 7: exit_music();break;
       case 8: money();break;  
       default:printf("输入错误,请重新输入\n");
           break;
       }
    }
    
    
    return 0;
}

void text_mp3(void)
{
    DIR * dir=NULL;
    int flag=0;
    int i;
    char buf[N]={0};
    char *music_path;
    struct dirent * dis;
    printf("请输入需要播放的歌单路径\n");
    scanf("%s", path_str);
    getchar();
    strcpy(str_path,path_str);
    dir=opendir(path_str);
    if(dir==NULL)
    {
        printf("opendir error\n");
    }
    while(1)
    {
    dis=readdir(dir);
    char *buff;
    if(dis==NULL)
    {
        break;
    }   
    if(dis!=NULL)
    {
      printf("\n");
      sscanf(dis->d_name,"%s",name[count].date);
      buff=reverse_string(name[count].date);//逆序
      sscanf(buff,"%4s",name[count].suffix);
      if(strcmp(name[count].suffix,"3pm.")==0)
      {
          flag=1;
          sscanf(dis->d_name,"%s",name[tim].music_name);
          printf(" %d、%s\n",tim, dis->d_name);
          tim++;
      }

    }

    count++;     
    }
    closedir(dir);
    if(flag==0)
    {
        printf("    当前路径下面没有mp3文件!!!\n");
        printf("         请重新查找\n");
    }
    printf("   ^_^   \n");
    printf("请输入你需要播放的歌曲前的标号\n");
    scanf("%d", &s);
    getchar();
    for(i=0;i<count;i++)
    {
        if(s==i)
        {
            music_path=strncat(path_str,name[i].music_name,sizeof(name[i].music_name));
            printf("music_path: %s\n", music_path);
            printf("当前播放歌曲:%s\n",name[i].music_name);
            sprintf(buf,"madplay %s &",music_path);
            system(buf);
        }
    }

}
char* reverse_string(char* str)
{
	char *left = str;
	char *right = str + strlen(str) - 1;

	while (left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;

		left++;
		right--;
	}
	return str;
}
int face(void)
{
    int n;
    printf("*********************************************************\n");
    printf("                       welcome  网抑云                    \n");
    printf("         1、使用手册                   2、查找歌单           \n");
    printf("         3、暂停播放                   4、继续播放            \n");
    printf("         5、上一首歌                   6、下一首歌              \n");
    printf("         7、退出程序                   8、赞赏作者                             \n");
    printf("*********************************************************\n");
    printf("\n");
    scanf("%d", &n);
    getchar();
    return n;
}
void stop(void)
{
  system("killall -STOP madplay &");
}
void manual(void)
{
    char n;
    printf("创作者:sunbeam\n");
    printf("创作日期:2021/1/8\n");
    printf("根据菜单前面的标号既可操作相对应的功能\n");
    printf("歌曲的暂停、切换等需要先查看歌单后才能操作\n");
    printf("********************************\n");
    printf("输入q/Q退出使用手册\n");
    
    while(1)
    {
    scanf("%c", &n);
    if(n=='q'||n=='Q')
    {
        break;
    }  
    else
    {
        printf("输入错误请重新输入\n");
    }
          
    }
    system("clear");

}
void next(void)
{
 char *next_patg;
 char next_buf[N]={0};
 memset(str,0,1024);
 strcpy(str,str_path);
 system("killall -9 madplay");
 s++;
if(s==count)
{
    s=0;
}
 next_patg=strncat(str,name[s].music_name,sizeof(name[s].music_name));
 printf("music_path: %s\n", next_patg);
 printf("当前播放歌曲:%s\n",name[s].music_name);
 sprintf(next_buf,"madplay %s &",next_patg);
 system(next_buf);
}

void last(void)
{
    char *last_path;
    char last_buf[N]={0};
    memset(str,0,1024);
    strcpy(str,str_path);
    system("killall -9 madplay");
    s--;
    if(s==-1)
    {
      s=count-1;
    }
    last_path=strncat(str,name[s].music_name,sizeof(name[s].music_name));
     printf("music_path: %s\n", last_path);
     printf("当前播放歌曲:%s\n",name[s].music_name);
     sprintf(last_buf,"madplay %s &",last_path);
     printf("last_buf: %s\n",last_buf);
     system(last_buf);
}
void exit_music(void)
{
    return 0;
}

void play(void)
{
    system("killall -CONT madplay &");
}
void money(void)
{
    printf("hhh,开玩笑的啦~~\n");
}

代码运行:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
刚刚运行发现,退出出程序也忘写了~~尴尬
END————_
如有错误和疑问欢迎评论区或者私信交流!

  • 14
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值