嵌入式6818利用线程实现视频播放器
基于粤嵌6818的视频播放器
一、创建管道文件
//创建管道文件
int create_fifo()
{
//检测管道文件是否存在,不存在就创建
int ret=access("/tmp/fifo",F_OK);
{
if(ret == 0)
{
printf("fifo has exist\n");
}
else if(ret == -1)
{
mkfifo("/tmp/fifo",0777); //创建管道文件
}
}
int fifo_fd=open("/tmp/fifo",O_RDWR); //打开管道文件
if(fifo_fd == -1)
{
perror("open fifo failed");
return -1;
}
return fifo_fd;
}
二、利用slave命令写入管道文件
//把slave命令写入管道文件
int slave_write_cmd(int fifo_fd,char *cmd)
{
write(fifo_fd,cmd,strlen(cmd));
return 0;
}
三、进行视频播放功能
//视频播放功能
void show_video()
{
BmpNode *list=D_R_List_Create(); //链表初始化
Search_Dir_Avi(list,"./avi"); //检索目录下的AVI文件并将文件名存入链表中
BmpNode *p=list->next;
Show_Bmp(800, 480,0, 0, "./video.bmp"); //显示视频主界面
fifo_fd=create_fifo();
int video_stop_cont_flags=1;
int play_flag = 0;
pid_t pid;
pid = fork(); //创建子线程
if(pid==0)
{
while(1)
{
execl("./mplayer", "./mplayer", "-slave", "-quiet", "input file=/tmp/fifo", "zoom", "-x", "700", "-y", "420", "geometry", "0:0", "p->data", NULL);
}
}
while(1)
{
Get_Slide();
//视频播放
if(ts_x1>370 && ts_x1<425 && ts_y1>420 && ts_y1<480)
{
if(play_flag == 0) //当前是播放状态
{
kill(pid, SIGSTOP); //子进程暂停
play_flag = 1;
}
else
{
kill(pid, SIGCONT); //子进程继续
play_flag = 0;
}
}
//视频退出
if(ts_x1>700 && ts_x1<800 && ts_y1>0 && ts_y1<60)
{
//杀死当前子进程
kill(pid , SIGKILL);
Show_Bmp(800, 480, 0, 0, "func.bmp");
close(fifo_fd);
break;
}
//播放上一个视频
if(ts_x1>250 && ts_x1<300 && ts_y1>420 && ts_y1<480)
{
//杀死当前子进程
kill(pid , SIGKILL);
p=p->prev;
if(p==list)
{
p=p->prev;
}
//创建新的子进程去播放上一首
pid = fork();
if(pid == 0)
{
execl("./mplayer", "./mplayer", "-slave", "-quiet", "input file=/tmp/fifo", "zoom", "-x", "700", "-y", "420", "geometry", "0:0", "p->data", NULL);
}
}
//播放下一个视频
if(ts_x1>500&&ts_x1<550 && ts_y1>420&&ts_y1<480)
{
//杀死当前子进程
kill(pid , SIGKILL);
p=p->next;;
if(p==list)
{
p=p->next;
}
//创建新的子进程去播放上一首
pid = fork();
if(pid == 0)
{
execl("./mplayer", "./mplayer", "-slave", "-quiet", "input file=/tmp/fifo", "zoom", "-x", "700", "-y", "420", "geometry", "0:0", "p->data", NULL);
}
}
//视频快进
if(ts_x1>440&&ts_x1<490 && ts_y1>420&&ts_y1<480)
{
slave_write_cmd(fifo_fd,"seek +5\n");
}
//视频快退
if(ts_x1>310&&ts_x1<360 && ts_y1>420&&ts_y1<480)
{
slave_write_cmd(fifo_fd,"seek -5\n");
}
//音量增加
if(ts_x1>70&&ts_x1<110 && ts_y1>420&&ts_y1<480)
{
slave_write_cmd(fifo_fd,"volume +200\n");
}
//音量减少
if(ts_x1>120&&ts_x1<160 && ts_y1>420&&ts_y1<480)
{
slave_write_cmd(fifo_fd,"volume -200\n");
}
//暂停/继续
if(ts_x1>560&&ts_x1<610 && ts_y1>420&&ts_y1<480)
{
if(video_stop_cont_flags == 1)
{
slave_write_cmd(fifo_fd,"pause\n");
video_stop_cont_flags=2;
}
else if(video_stop_cont_flags == 2)
{
slave_write_cmd(fifo_fd,"pause\n");
video_stop_cont_flags=1;
}
}
//视频静音
if(ts_x1>690&&ts_x1<740 && ts_y1>420&&ts_y1<480)
{
slave_write_cmd(fifo_fd,"mute\n");
}
}
}
参考项目:嵌入式GEC6818_音视频播放器项目