由于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播放器在一个进程中,这个进程负责调用播放器并将需要的信息通过共享内存对外提供,此进程所有输入信息重定向到一个管道中,反馈的信息供另一个进行读取并分析(代码见附件)