由于mplayer提供了slave模式与其他进行交互,所以整合到界面中就不再述说,主要对自己完成这些功能其中要注意的地方进行记录:
1.播放完整的命令:/sdcard/mplayer -quiet -geometry 160:64 -vf scale=480:272 -slave -input file=./gui_ctrl_fifo /sdcard/video/*.mp4
2.参数-quiet不能换成-really-quiet,否则没有反馈信息
3.在程序中建立管道时使用:
unlink("./gui_fifo");
mkfifo("./gui_fifo",O_CREAT|0777);
perror("gui mkfifo");
时不时的会报错,于是去除这些代码,手动创建管道,程序中直接打开使用。
4.向管道写入控制命令时命令字符串最后需要加一个'\n',我使用函数
void writeCtrlPipeStr(const char * orderstr)
{
memset(m_buf, 0, sizeof(m_buf));
strcpy(m_buf, orderstr);
strcat(m_buf, "\n");
m_buf[strlen(m_buf)]='\0';
if(write(m_fifoFd, m_buf, strlen(m_buf)) !=strlen(m_buf))
perror("write");
}
5.对于反馈字符串的处理
while(1)
{
size=read(fd_fifo,buf,sizeof(buf));
buf[size]='\0';
keyPtr = strstr(buf, "ANS_TIME_POSITION");
if(NULL != keyPtr)
{
strcpy(m_curPlayTimeStr, keyPtr+sizeof("ANS_TIME_POSITION=") -1);
refreshTimeDisplay(atoi(m_curPlayTimeStr), true);
continue;
}
keyPtr = strstr(buf, "ANS_LENGTH");
if(NULL != keyPtr)
{
strcpy(m_totalPlayTimeStr, keyPtr+sizeof("ANS_LENGTH=") -1);
refreshTimeDisplay(atoi(m_totalPlayTimeStr), false);
continue;
}
}
6.基本思路是调用mplayer播放器在一个进程中,这个进程负责调用播放器并将需要的信息通过共享内存对外提供,此进程所有输入信息重定向到一个管道中,反馈的信息供另一个进行读取并分析(代码见附件)