快进/快退/暂停/退出/播放/播放上一个/播放下一个/音量变大/音量变小/静音....
        
        mplayer开源的多媒体播放器。
            
        mplayer另外的一种工作模式:从(slave)模式
        
        在slave模式下,mplayer为后台运行其它程序,不再截获键盘事件,mplayer
        会从标准输入读取一个换行符分隔开的命令。
                    
    mplayer所支持的命令可以通过:
        mplayer -input cmdlist

a.头文件部分

#ifndef __HEAD_H__
#define __HEAD_H__#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <dirent.h>
#include <semaphore.h>#endif
#include "head.h"//Mplayer_Exitw为1表示退出当前歌曲的播放,为0表示不退出
int Mplayer_Exit = 0;//如果为1表示自动模式,为0表示手动模式
int sta = 0;//Quit为1表示退出整个进程,为0表示不退出
int Quit = 0;//MP4的保存路径
#define MP4_PATH "/mnt/hgfs/code"//有名管道的路径
#define FIFONAME "/home/china/test.fifo"//文件的类型
typedef enum File_Type
{FILE_MP3,FILE_MP4,FILE_C,FILE_H,FILE_CPP,FILE_BMP,FILE_JPG,UNKOWN_TYPE = 1000
}FILE_TYPE;//文件名最大的长度
#define MAX_LEN  256typedef struct head
{struct node *first;    struct node *last;int num;                  //一共有多少首歌
}Head;//数据结点
struct node
{char filename[MAX_LEN];        //保存MP3/MP4路径名struct node *next;            //下一首歌struct node *prev;            //上一首歌
};/*根据filename指定的文件名判断其类型
*/
FILE_TYPE Judge_Format(const char *filename)
{//文件名的最后一个元素的下标int len = strlen(filename) - 1;//从文件的尾部开始往前找第一个 .while(filename[len] != '.' && len >= 0){len--;}//判断类型if(!strcmp(filename+len,".mp3") || !strcmp(filename+len,".MP3")){return FILE_MP3;}else if(!strcmp(filename+len,".bmp")){return FILE_BMP;}else if(!strcmp(filename+len,".jpg")){return FILE_JPG;}else if(!strcmp(filename+len,".mp4")){return FILE_MP4;}else if(!strcmp(filename+len,".c")){return FILE_C;}else{return UNKOWN_TYPE;}
}/*Scanf_MP4:将指定路径下的MP3/MP4文件扫描出来后保存到一条双向链表中@返回值:成功返回MP3/MP4链表的头结点,失败返回NULL
*/
Head* Scanf_MP4(void)
{//创建头结点并初始化Head *list = malloc(sizeof(*list));list->first = list->last = NULL;list->num = 0;//打开目录DIR *dir = opendir(MP4_PATH);if(dir == NULL){perror("Open Dir Failed");return NULL;}struct dirent *dirp = NULL;//读取目录项while(dirp = readdir(dir)){//处理掉目录项中的 . 和 ..if(!strcmp(".",dirp->d_name) || !strcmp("..",dirp->d_name)){continue;}//判断目录项的类型FILE_TYPE type = Judge_Format(dirp->d_name);if(type == FILE_MP3 || type == FILE_MP4){    //新建数据结点保存MP3/MP4的路径名struct node *pnew = malloc(sizeof(*pnew));sprintf(pnew->filename,"%s/%s",MP4_PATH,dirp->d_name);pnew->next = pnew->prev = NULL;//将其插入带头结点的双向链表中去if(list->first == NULL){list->first = list->last = pnew;}else {list->last->next = pnew;pnew->prev = list->last;list->last = pnew;}}}closedir(dir);return list;
}//信号处理函数
void My_Handler(int sig)
{if(sig == SIGCHLD){//关闭标准输入fclose(stdin);//切换到自动模式sta = 1;}
}int main()
{signal(SIGCHLD,My_Handler);//打开有名管道int fd_fifo = open(FIFONAME,O_RDWR);if(fd_fifo == -1){perror("Create FIFO Failed");return -1;}//将指定的目录下的MP3/MP4文件全部都获取到//并且要将其保存到一条双向链表中去Head *list = Scanf_MP4();if(list == NULL){printf("木有一首歌!\n");return -1;}//取下来一首歌struct node *p = list->first;while(1){pid_t pid = fork();if(pid == -1){perror("Fork Failed");return -1;}else if(pid == 0){//子进程unsigned char fifoname[128] = {0};printf("--------------当前正在播放%s--------------\n",p->filename);sprintf(fifoname,"file=%s",FIFONAME);//子进程负责播放音乐//char *argv[1024] = {"mplayer","-slave","-quiet","-input",fifoname,"-zoom","-x","800","-y","480",p->filename,NULL};execlp("mplayer","mplayer","-slave","-quiet","-input",fifoname,"-zoom","-x","800","-y","480",p->filename,NULL);}else {//音量的大小int vol = 50;sta = 0;Mplayer_Exit = 0;//把标准输入重新打开freopen("/dev/pts/1","r",stdin);//父进程while(!Mplayer_Exit){               unsigned char vols[MAX_LEN] = {0};//从键盘上获取输入char c = getchar();if(sta == 1)  {c = 'n';}//a 快退5秒 d 快进5秒 n 下一首 p 上一首 s 暂停/播放 w:音量+5 r音量-5 q退出switch(c){case 'a':write(fd_fifo,"seek -5\n",strlen("seek -5\n"));break;case 'd':write(fd_fifo,"seek 5\n",strlen("seek 5\n"));break;case 'n':p = p->next;if(p == NULL){p = list->first;}Mplayer_Exit = 1;break;case 'p':p = p->prev;if(p == NULL){p = list->last;}Mplayer_Exit = 1;break;case 's':write(fd_fifo,"pause\n",strlen("pause\n"));break;                       case 'w':                 sprintf(vols,"volume %d 1\n",vol = vol + 5);write(fd_fifo,vols,strlen(vols));break;                         case 'r':sprintf(vols,"volume %d 1\n",vol = vol - 5);write(fd_fifo,vols,strlen(vols));break;   case 'q':Mplayer_Exit = 1;Quit = 1;break;                   }if(Mplayer_Exit){//把播放上一首歌的子进程给干掉kill(pid,SIGKILL);}}//回收子进程的资源waitpid(pid,NULL,0);if(Quit){exit(0);}}}
}

从控制台输入控制命令(在终端上输入指令)
            在终端上先输入指令:
                mplayer -slave -quiet xxx.mp4
                slave:指定从模式,以接收指令
                quiet:不要输出无意义的信息

基于mplayer的简易影音播放器相关推荐

  1. 【Qt学习之行】简易影音播放器

    文章目录 简述 实验步骤 新建项目 添加影音相关的QT库 添加添加类.函数.变量等 设计ui界面 设计影音功能 实验验证 简述 掌握影音图像包括音乐等的播放,掌握播放.停止.循环等方法:进而能够完成影 ...

  2. 基于jQuery的网页影音播放器jPlayer的基本使用教程

    原文地址:http://www.jb51.net/article/80655.htm jPlayer简介: 想在网页上播放背景音乐,不想用html标签的方式,因为那样只有音乐全部下载完以后才能播放,还 ...

  3. 项目记录:基于QT的简易音乐播放器

    一.功能介绍 1.能够自定义背景图片 2.实现了音乐播放器的最基本功能,即播放与否.切换歌曲及歌单.显示歌曲信息.调节音量.播     放模式等 3.根据所选中的框体,更新播放列表及播放顺序 4.从播 ...

  4. 第8章系统服务(简易音频播放器的实现)

    开发一个简易音乐播放器,要求实现: 综合使用Service,BroadCast,ContentProvider等组件实现后台播放. 播放和暂停.上一首.下一首.停止: 后台播放功能, 按下返回键退出应 ...

  5. linux 嵌入式 播放器,基于Linux的嵌入式媒体播放器研究

    摘要: 计算机多媒体技术和嵌入式技术的高速发展,各种集计算机.通信.消费电子产品等特征于一体的电子产品得以广泛应用,嵌入式媒体播放器已经成为此类产品中主要的应用软件.同时,随着Linux系统在各种嵌入 ...

  6. Android Studio简易音乐播放器设计作业

    Android Studio简易音乐播放器设计作业 实验成功展示 实验代码 MainActivity.java XML文件 class文件 利用BroadcastReceiver模拟音乐播放器,实现播 ...

  7. CMP FLASH影音播放器插件

    我搜索视频播放插件很久了,一直没有找到合适的(要么功能不完善.要么有水印.要么界面不美观),今天终于找到了一个不错的视频播放插件--CMP4 Flash 影音播放器插件. CMP是一款免费的在线Fla ...

  8. 单片机音乐播放器课程设计C语言,单片机课程设计简易音乐播放器

    单片机课程设计简易音乐播放器 论文题目:简易音乐播放器所属系部:电子工程系 指导教师: 学生姓名: 学 号: 专 业: 电子信息工程技术 题目: 简易音乐播放器任务与要求:本设计以 MCS-51 系列 ...

  9. 基于WASM的H265 Web播放器

    基于WASM的H265 Web播放器 1 背景 2 代码 3 依赖 3.1 WASM 3.2 FFmpeg 3.3 WebGL 3.4 Web Audio 4 播放器实现 4.1 模块结构 4.2 线 ...

最新文章

  1. Python,Opencv cv2.Canny()边缘检测
  2. 无线鼠标计算机不识别,win7系统下USB无线鼠标电脑检测不到如何解决
  3. android studio gradle 配置
  4. Linux mysql生成不了随机密码,用MySQL 生成随机密码
  5. js中如何判断一个DOM对象是否存在?
  6. linux命令——crontab的使用方法
  7. AngularJS之代码风格36条建议【一】(九)
  8. python 进程池_Python实践17-进程池
  9. JavaScript 中遍历对象的属性 1
  10. [轉]Exploit Linux Kernel Slub Overflow
  11. send和sendmsg性能测试
  12. 触发器应用 trigger
  13. spring注释_Spring注释
  14. golang-Tag
  15. 用正则彻底去除HTML\CSS\script代码
  16. js导出变量 vue_Vue+Element前端导入导出Excel
  17. .net 获取邮箱邮件列表和内容
  18. 用c语言实现基本数据结构(图)
  19. Matlab基于蚁群算法求解多旅行商MTSP问题
  20. 搭建自己的以图搜图系统 (一):10 行代码以图搜图

热门文章

  1. ElementUI的消息提示框及确认框
  2. 代码精进之路:从码农到工匠读书笔记
  3. linux目录权限子目录权限,linux中更改所有子文件和子目录所有者权限
  4. 产品经理修炼手册-经验分享
  5. 无理数,用于图案自动生成
  6. hdu 3833 YY's new problem(哈希)
  7. 用python计算图像面积_地图图像中屋顶面积的计算
  8. 《Adobe After Effects CS4经典教程》——1.10 控制用户界面的亮度
  9. 2012用户体验年会 奇虎360CEO兼首席体验官 周鸿祎主题演讲——简而未减
  10. ArcGIS--GIS常用类型数据下载