Mplayer音乐视频播放器 项目

基于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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MPlayer是一个流行的音频和视频播放器,而Qt是一种跨平台的应用程序框架。结合使用MPlayer和Qt,可以制作一个功能丰富的音乐播放器。首先,你需要安装Qt和MPlayer。 关于Qt的安装,你可以参考这个链接:。它提供了Qt的安装教程,你可以按照其中的步骤进行安装。 而对于MPlayer的安装,你可以在终端中使用以下命令进行安装:sudo apt-get install mplayer。这个命令会从软件仓库中下载并安装MPlayer。 一旦你完成了Qt和MPlayer的安装,你可以开始制作音乐播放器了。你可以参考这个链接:。它提供了使用树莓派3B、Qt和MPlayer制作音乐播放器的详细步骤。在这个链接中,你将找到关于播放、暂停、上一曲、下一曲和音量调节等功能的实现方法。 如果你需要下载MPlayer的最新源码,你可以访问这个链接:。在这个链接中,你将找到MPlayer的最新版本,并且提供了下载和编译的详细步骤。 总结起来,要制作一个mplayer qt音乐播放器,你需要先安装Qt和MPlayer,然后按照指引进行配置和开发。希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [树莓派3B qt+mplayer制作音乐播放器(10)](https://blog.csdn.net/qq_41102371/article/details/106305346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示](https://blog.csdn.net/qq21497936/article/details/119991329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值