基于Mplayer的视频播放器
1.需求分析:
1.该程序能够加载指定路径下所有的音视频文件
(.mp3 .mp4 .avi .rm .rmvb .flv .wma)
2.能够通过界面操作视频播放器
支持:
上键
下键
回车
ESC
支持:
焦点定位
1.一级页面功能如下:
+-------------------+
| 视频播放器 |
|-------------------|
|1.查看播放列表 |
|2.开始/暂停 |
|3.停止 |
|4.上一个 |
|5.下一个 |
|6.快进 |
|7.定位 |
|8.播放方式 |
|9.退出 |
+-------------------+
查看播放列表二级页面如下:
+-------------------+
| 视频播放器 |
|-------------------|
|1.张三的歌.mp4 |
|2.李四的曲.avi |
|... |
+-------------------+
定位的二级页面
+-------------------+
| 视频播放器 |
+-------------------+
定位:XX:XX:XX
3.在一级页面启动播放列表功能,进入二级页面,
焦点定位到对应歌曲按下enter播放歌曲,按下
ESC按键能够返回一级页面
4.在一级页面启动下一个功能,能够播放下一个音
视频文件,如果到达最末尾则提示:最后一首歌曲
5.在一级页面启动上一个功能,能够播放上一个音
视频文件,如果到达最前面则提示:第一首歌曲
6.在一级页面启动快进功能,能够按倍速播放,
第一次选择启动2倍速播放
第二次选择启动4倍速播放
第三次选择返回1倍速播放(默认)
周而复始
7.在一级页面启动开始功能,
如果音视频正在播放,则暂停播放
如果音视频正在暂停,则继续播放
如果音视频文件没有播放,则按照
播放方式(1.顺序循环 2.单曲循环 3.随机播放)
播放歌曲
8.在一级页面启动停止功能:
如果音视频文件没有播放,则提示:未播放音视频文件
如果音视频正在播放,则停止当前播放内容
9.在一级页面启动定位功能:
如果定位在音视频文件播放时间内,则跳到对应位置播放
如果定位位置超过文件播放时间,则提示:定位错误
10.播放方式
在一级页面启动播放方式功能:
第一次选择启动单曲循环
第二次选择启动随机播放
第三次选择返回顺序循环(默认)
11.在一级页面启动退出功能:
则程序退出
思考内容:
1.如何使用颜色打印?
printf颜色打印
2.如何操作焦点位置?
3.如何加载音视频文件?
4.如何从终端接收上键?下键?回车?ESC按键?
5.如何打印界面?
6.如何存储所有的音视频文件?
7.如何控制mplayer播放器?
#include "head.h"
void Watch1(int i);
void Pasue(void);
void Quickly1(void);
void Quickly2(void);
void Quickly4(void);
void Stopplay(void);
void Playup(void);
void Playdown(void);
void Playlocation(void);
void Playway(void);
typedef struct media
{
int id;
char menulist[512];//菜单名字的长度
}MEDIA_CFG_S;
typedef struct menuinfo
{
int id;
int pos_start;
int pos_end;
int focus;
}MENU_CFG_S;
MEDIA_CFG_S medialist[32]=
{
{1,"查看播放列表"},
{2,"开始/暂停"},
{3,"停止播放"},
{4,"播放上一个"},
{5,"播放下一个"},
{6,"快进播放"},
{7,"播放定位"},
{8,"播放方式"},
{9,"退出软件"},
};
int pos_start;
int pos_end=8;
int focus;
int menupage = 1;
int cnt=0;
int mode; //播放模式
int quickly = 1;
char c[16][2000] = {0};
//strcpy(c,"1.flv");
char q[100]={0};
int Look(void)
{
DIR *dp = NULL;
struct dirent *cc = NULL;
char *w =NULL;
int i =0;
dp = opendir("/home/linux/Music"); //第一步 打开目录(名字为dir1)
while (1) //重复找出所有目录下的文件或者目录文件
{
cc = readdir(dp); //读取目录下的信息
if (NULL == cc)
{
break;
}
if ('.' == cc->d_name[0]) // d_name 为数组 .开头的都是隐藏文件
{
continue;
}
strcpy(c[i],cc->d_name);
i++;
}
putchar('\n');
closedir(dp);
printf("+-----------------------------+\n");
printf("| 音视频播放器 |\n");
printf("|-----------------------------|\n");
for (i = pos_start; i < pos_end; i++)
{
if(i==focus)
{
cnt = focus;
printf("| |\r|\033[30;43m %-20s\033[0m\n",c[i]);
}else
{
printf("|%s |\n",c[i]);
}
}
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("+-----------------------------+\n");
}
void MenuShow(void)
{
int i = 0;
if(menupage == 1)
{
printf("+-----------------------------+\n");
printf("| 音视频播放器 |\n");
printf("|-----------------------------|\n");
for(i = pos_start;i<= pos_end;i++)
{
if(i == focus)
{
printf("| |\r|\033[30;43m%2d.%-20s\033[0m\n",medialist[i].id,medialist[i].menulist);
}else
{
printf("| |\r|%2d.%-20s\n",medialist[i].id,medialist[i].menulist);
}
}
printf("| |\n");
printf("+-----------------------------+\n");
}else if(menupage == 2)
{
Look();
}
return;
}
void MenuChoose(void)
{
char ch = 0;
char w[10]={0}; //存储 控制上,下,退出,进入 键的数组 (这些命令是由多个字符组成 所以用数组)
int wlen = 8;
memset(w,0,sizeof(w));
fgets(w,sizeof(w),stdin);
if(27 == w[0] && 10 == w[1]) //Esc
{
menupage = 1;
}
if(menupage == 1)
{
if(10 == w[0] && focus == 0) //回车键
{
menupage = 2;
}
if(10 ==w[0] && focus==8)
{
exit(1);
}
if(w[0] == 10 && focus == 1) //回车键
{
Pasue();
}
if(w[0] == 10 && focus == 5)
{
Quickly2();
fgets(w,sizeof(w),stdin);
if(w[0]==10)
{
Quickly4();
}
fgets(w,sizeof(w),stdin);
if(w[0]==10)
{
Quickly1();
}
}
if(w[0]==10 && focus == 2)
{
Stopplay();
}
if(w[0]==10 && focus==3)
{
Playup();
}
if(w[0]==10 && focus==4)
{
Playdown();
}
if(w[0]==10 && focus==6)
{
Playlocation();
}
if(w[0]==10 && focus==7)
{
Playway1(); //单曲循环播放
fgets(w,sizeof(w),stdin);
if(w[0] == 10)
{
Playway3();//随机播放
}
fgets(w,sizeof(w),stdin);
if(w[0])
{
Playway2();//顺序循环播放
}
}
}
else if(menupage == 2)
{
if(10 == w[0]) //回车键
{
Watch1(focus);
}
/*
if(w[0]==10)
{
}
if(w[0]==10)
{
Playdown();
}
*/
}
/*======================================================*/
if(27 == w[0] && 91==w[1])
{
if(65 == w[2])//上
{
if(focus > pos_start)
{
focus--;
}else if(focus == pos_start && pos_start ==0)
{
return;
}else if(focus == pos_start)
{
pos_start--;
pos_end--;
focus--;
}
}else if(66 ==w[2]) //下
{
if(focus < pos_end)
{
focus++;
}else if(focus == pos_end && pos_end == wlen)
{
return;
}else if(focus == pos_end)
{
pos_start++;
pos_end++;
focus++;
}
}
}
return ;
}
/* 看视频*/
void Watch1(int i) //播放视频
{
pid_t pid;
pid = fork();
if(-1 == pid)
{
perror("fail to fork");
return ;
}
if(0==pid)
{
// char q[100]={0};
sprintf(q,"/home/linux/Music/%s",c[i]);
close(1);
close(2);
mkfifo("/tmp/myfifo",0777);
execlp("mplayer", "mplayer", "-slave", "-input", "file=/tmp/myfifo", q, NULL);
}
return ;
}
void Pasue(void) //暂停
{
int fd = 0;
fd = open("/tmp/myfifo",O_RDWR);
if(-1 == fd)
{
perror("fail to fork");
return ;
}
write(fd,"pause\n",6);
close(fd);
return ;
}
/* 快进 */
void Quickly1(void)
{
int fd = 0;
fd = open("/tmp/myfifo",O_RDWR);
write(fd,"speed_set 1\n",12);
close(fd);
return;
}
void Quickly2(void)
{
int fd = 0;
fd = open("/tmp/myfifo",O_RDWR);
write(fd,"speed_set 2\n",12);
close(fd);
return;
}
void Quickly4(void)
{
int fd = 0;
fd = open("/tmp/myfifo",O_RDWR);
write(fd,"speed_set 4\n",12);
close(fd);
return;
}
/* 停止播放 */
void Stopplay(void)
{
int fd = 0;
fd = open("/tmp/myfifo",O_RDWR);
write(fd,"stop\n",5);
close(fd);
return;
}
/*播放上一个 */
void Playup(void)
{
menupage = 2;
if(cnt -1 >=0 )
{
Stopplay();
cnt--;
}
menupage = 1;
Watch1(cnt);
}
/* 播放下一个*/
void Playdown(void)
{
menupage = 2;
if(c[cnt +1] != 0)
{
Stopplay();
cnt++;
}
menupage = 1;
Watch1(cnt);
}
/*播放定位*/
void Playlocation(void)
{
int a =0;
printf("请输入定位位置(秒):");
scanf("%d",&a);
char b[20] = {0};
int fd = 0;
fd = open("/tmp/myfifo",O_RDWR);
if(-1==fd)
{
perror("fail to oepn");
return;
}
sprintf(b,"seek %d 2\n",a); //拼接字符串
printf("%s",b);
write(fd,b,strlen(b));
close(fd);
}
/* 播放方式*/
void Playway1(void) //单曲循环模式
{
printf("单曲循环模式");
if()
}
void Playway2(void) //顺序循环模式
{
printf("顺序循环模式");
}
void Playway3(void) //随即播放模式
{
printf("随机播放模式");
}
int main(void)
{
// char c[1000] = {0};
while(1)
{
system("clear");
MenuShow(); //菜单
MenuChoose(); // 菜单控制键
}
return 0;
}