首先我们要来看几个函数:
接下来我们安装一下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————_
如有错误和疑问欢迎评论区或者私信交流!