mplayer
- 1、mplayer的安装
- 2、mplayer的键盘模式
-
- 3、Slave模式:
- 启动方法一:在终端下敲命令来启动mplayer
-
- 启动方法二:在进程中调用exec启动Mplayer程序。
- 案例:父进程 控制 子进程的mplayer
- 案例:获得mplayer的回应
1、mplayer的安装
sudo apt-get updatesudo apt-get install mplayer
2、mplayer的键盘模式
启动方法:# mplayer /home/britney_spears.avi (改为自己的路径) 全屏:# mplayer -vf scale=800:480 /home/britney_spears.avi
启动mplayer后可以通过键盘按键来控制mplayer播放
基本控制键:
left or right 向后/向前搜索10秒
up or down 向后/向前搜索1分钟
pageup or pagedown 向后/向前搜索10分钟
p or SPACE 暂停播放(按任意键继续)
q or ESC 停止播放并退出
0 or 9 音量控制(音量循环模式)
3、Slave模式:
可以通过给mplayer发送命令的方法来控制mplayer。
启动方法一:在终端下敲命令来启动mplayer
# mplayer -idle -slave -quiet /home/sad_or_happy.mp3 1:-ac mad 这两个参数的意思是指定用mad解码器。2:-idle 播放文件至文件末尾后mplayer不退出。3:-slave 指定mplayer运行在slave模式下。4:-quiet 指定mplayer不向屏幕上,打印乱码信息。5:/home/britney_spears.avi 指定mplayer播放的第一首歌曲的路径。
使用这种方法运行mplayer时,mplayer默认从标准输入去获取命令。 可以在终端下敲命令控制mplayer。例如:pause //暂停mplayer播放
Mplayer 在slave模式下常用的命令:
loadfile string //播放string指定的歌曲。//string为歌曲路径+文件名(例:“loadfile ../easylove.mp3”)。volume x 1 //设置音量,x为音量的大小。mute 1/0 //静音开关。1:静音;0:取消静音。pause //暂停/取消暂停。seek value //快进或快递参数value指定的秒数当value为正时,快进;当value为负时,快退。get_percent_pos //获得文件的播放进度(百分比:0--100)。get_time_pos //获得文件的当前位置,以秒为单位,精确到小数位1位。get_file_name //获得文件的文件名。get_time_length //获得文件的长度,以秒为单位。get_meta_album //获得文件的 '专辑' 的元数据。get_meta_artist //获得文件的 '艺术家' 的元数据。get_meta_comment //获得文件的 '评论' 的元数据。get_meta_genre //获得文件的 '流派' 的元数据。get_meta_title //获得文件的 '标题' 的元数据。get_meta_year //获得文件的 '年份' 的元数据。get_percent_pos ----->回应格式:ANS_PERCENT_POSITION=52get_time_pos---->回应格式:ANS_TIME_POSITION=124.2get_file_name --->回应格式:ANS_FILENAME='da.mp3'get_time_length ---->回应格式:ANS_LENGTH=221.00get_meta_album--->回应格式:ANS_META_ALBUM=''get_meta_artist--->回应格式:ANS_META_ARTIST=''get_meta_comment--->回应格式:ANS_META_COMMENT=''get_meta_genre--->回应格式:ANS_META_GENRE=''get_meta_title--->回应格式:ANS_META_TITLE=''get_meta_year--->回应格式:ANS_META_YEAR=''
启动方法二:在进程中调用exec启动Mplayer程序。
例:ubuntu下(推荐)
execlp("mplayer","mplayer","-slave", "-quiet","-idle","-input", "file=./fifo_cmd","./media/sad_or_happy.mp3", NULL);
arm下:
execl("./mplayer_arm"," mplayer_arm ", "-ac", "mad","-slave", "-quiet","-idle","-input", "file=./fifo_cmd","./media/sad_or_happy.mp3", NULL); 参数:1:"-ac", "mad"指定使用mad解码器。2:"-slave"MPlayer 从标准输入读取以新行 (\n) 分隔开的命令行。3:"-quiet"使得控制台输出消息较少。4:"-idle"播放文件至文件末尾后mplayer不退出5:"-intput", "file=./tmp/cmd_fifo" Mplayer 通过命名管道”./tmp/cmd_fifo”获取命令。6:song_path_name 歌曲的路径+文件名首地址。7:NULLMplayer可以通过它来判断到底有多少个参数,这个必不可少
案例:父进程 控制 子进程的mplayer
#include<stdio.h>#include<unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>int main(){//创建一个命名管道mkfifo("fifo_cmd", 0666);pid_t pid = fork();if(pid == 0)//子进程{//启动mplayerexeclp("mplayer", "mplayer", "-slave","-quiet",\"-idle","-input", "file=./fifo_cmd", "da.mp3",NULL);}else if(pid > 0)//父进程{//以写的方式打开命名管道 fifo_cmdint fd = open("fifo_cmd", O_WRONLY);if(fd < 0){perror("open");}sleep(10);write(fd,"loadfile love.mp3\n", strlen("loadfile love.mp3\n"));close(fd);}return 0;}
运行结果:
10秒切换另一首歌
案例:获得mplayer的回应
#include<stdio.h>#include<unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <pthread.h>void* send_cmd(void *arg)//arg =&fd{int fd = *(int *)arg;while(1){write(fd,"get_time_pos\n", strlen("get_time_pos\n"));sleep(1);}}void* recv_msg(void *arg){int *fd = (int *)arg;while(1){char buf[128]="";read(fd[0], buf,sizeof(buf));if(strncmp(buf,"ANS_TIME_POSITION", strlen("ANS_TIME_POSITION")) == 0){int time = 0;sscanf(buf,"ANS_TIME_POSITION=%d", &time);printf("time=%d\n",time);}}}int main(){//创建一个命名管道(给mplayer发送指令)mkfifo("fifo_cmd", 0666);//创建一个无名管道(接受mplayer应答)】int pipe_fd[2];pipe(pipe_fd);pid_t pid = fork();if(pid == 0)//子进程{//将标准输出设备1 重定向fd[1]dup2(pipe_fd[1], 1);//close(1), 重定向//启动mplayerexeclp("mplayer", "mplayer", "-slave","-quiet",\"-idle","-input", "file=./fifo_cmd", "da.mp3",NULL);}else if(pid > 0)//父进程{//以写的方式打开命名管道 fifo_cmdint fd = open("fifo_cmd", O_WRONLY);if(fd < 0){perror("open");}pthread_t tid1;pthread_create(&tid1,NULL, send_cmd, &fd);pthread_detach(tid1);pthread_t tid2;pthread_create(&tid2,NULL, recv_msg, pipe_fd);pthread_detach(tid2);while(1);close(fd);}return 0;}