音樂播放器mplayer的簡單使用

在這裏插入圖片描述

1、mplayer的安裝

sudo apt-get update
sudo 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=52
get_time_pos---->迴應格式:ANS_TIME_POSITION=124.2
get_file_name --->迴應格式:ANS_FILENAME='da.mp3'
get_time_length ---->迴應格式:ANS_LENGTH=221.00
get_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:NULL
 Mplayer可以通過它來判斷到底有多少個參數,這個必不可少

案例:父進程 控制 子進程的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)//子進程
	{
		//啓動mplayer
		execlp("mplayer", "mplayer", "-slave","-quiet",\
		"-idle","-input", "file=./fifo_cmd", "da.mp3",NULL);
	}
	else if(pid > 0)//父進程
	{
		//以寫的方式打開命名管道 fifo_cmd
		int 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), 重定向
		
		//啓動mplayer
		execlp("mplayer", "mplayer", "-slave","-quiet",\
		"-idle","-input", "file=./fifo_cmd", "da.mp3",NULL);
	}
	else if(pid > 0)//父進程
	{
		//以寫的方式打開命名管道 fifo_cmd
		int 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章