设为首页 收藏本站
开启辅助访问 快捷导航
菜单
猿人部落 主页 资讯 查看内容

基于Mplayer开源多媒体库的音视频播放器

2019-7-26 18:06 发布者: J_Kira_Y 评论 0 查看 1465
文章目次1 项目概况2 项目需求3 搭建情况4 技能形貌5 概要操持6 条件预备和主界面构架7 点名体系:8 相册:9 视频:1

文章目次

  • 1 项目概况
  • 2 项目需求
  • 3 搭建情况
  • 4 技能形貌
  • 5 概要操持
  • 6 条件预备和主界面构架
  • 7 点名体系:
  • 8 相册:
  • 9 视频:
  • 10 音乐:
  • 11 项目总结

1 项目概况

本次项目是基于Linux情况的交织编译arm-linux-gcc,在GEC6818arm开辟板上运行,创建多条链表分别存储遍历到当前目次下子目次中的音乐、视频和图片文件名,通过读取触摸装备文件的点击事故举行判定,选择对相册切换以及音视频的快进/快退、上下首切换、音量调治、进度条调治等功能

2 项目需求

(1)制作播放器 (根本要求)

利用触摸屏实现音量的调治 快进快退的调治 进度条(可以通过进度条控制视频的播放位置)

控制功能:
//调用system下令 播放视频
system(“mplayer -slave -quiet -input file=/pipe -geometry 0:0 -zoom -x 800 -y 380 mn.avi”);

//打开指定管道文件
fd=open(/pipe)

//写入控制下令到管道中  
    write(fd, "pause\n",strlen("pause\n")); 
	---------------------------
system("echo pause > /pipe");

//怎样获取mplayer输出的数据 
 dup2() ->文件重定向

(2)预览效果 (强化)

获取体系中的全部视频文件,把他的预览图表现到桌面中, (把预览图与视频路径关联起来,到链表中),
提供用户选择  

//获取一帧图像的下令  
mplayer -ss 84 -noframedrop -nosound -vo jpeg -frames 1 xx.rmvb

-ss 获取那一秒   
  

 预览图: 
  1.遍历目次搜刮视频文件 (.avi (不要太大,由于硬盘只有500M))

  2.找到视频文件后  调用mplayer -ss 84 -noframedrop -nosound -vo jpeg -frames 1 xx.rmvb 下令天生图片  
  
			(直接天生一张100*100的小图下令如下:)
			mplayer   -zoom -x 100 -y 100  -ss 99 -noframedrop  -nosound -vo jpeg -frames 1   Faded3.avi
			
  3.把该图片表现到 屏幕中 (要对图片举行缩放 100 100)
//多历程 ,多线程 , 历程间的管道通讯, 注意:掩护共享资源

3 搭建情况

开辟情况
Linux

开辟工具
arm-linux-gcc、Notepad++

其他工具:
mplayer开源多媒体库、jpeglib库、font库

形貌:
通过开源代码编译器notepad++编写代码,利用arm-linux-gcc交织编译,再通过LINUX平台的SSH服务器将编译天生的步调文件传输到开辟板中,末了实验。

移植mplayer开源多媒体库:
MPlayer是一款开源的多媒体播放器,以GNU通用公共允许证发布。此款软件可在各主流作业体系利用,比方Linux和其他类Unix作业体系、微软的视窗体系及苹果电脑的Mac OS X体系。MPlayer是建基于下令行界面,在各作业体系可选择安装差别的图形界面。

由于linux下都是下令行的操纵方式,以是对mplayer的各种操纵都是用下令来实现的,这次紧张用的是它的slave工作方式(在slave模式下,MPlayer为背景运行其他步调,不再截获键盘事故, MPlayer会从标准输入读一个换行符(\n)分隔开的下令)。
移植Mplayer

Mplayer部门指令:

Mplayer紧张指令

Mplayer部门步调代码指令:

write(fd,"volume +5\n",strlen("volume +5\n"));//加声音
write(fd,"volume -5\n",strlen("volume -5\n"));//减声音
write(fd,"seek -5\n",strlen("seek -5\n"));//快退。
write(fd,"seek +5\n",strlen("seek -5\n"));//快进。
write(fd,"pause\n",strlen("pause\n"));//停息播放
write(fd,"seek 100 1\n",strlen("seek 100 1\n"));//制止播放
write(fd,"seek 100 1\n",strlen("seek 100 1\n"));//进度跳转

封装JPEGLIB库和font库:
通过移植封装jpeglib库和font库,可以使6816开辟板表现出JPEG图片和自界说字体。
图库和字库的搭建

4 技能形貌

根本

  • C语言
  • 文件IO(遍历目次,读写文件)
  • 链表(创建多个双向循环链表存取歌曲、图片、影戏名)

核心

  • 体系编程(进/线程的创建、通讯)
  • Mplayer指令的运用(重定向、音量、进度调治、停息/播放)
  • 触摸屏(点击事故、滑屏处置处罚)
  • font库的利用(动态表现字体、像素点映射)
  • jpeglib库的利用(图片表现切换)

5 概要操持

团体概要操持图如下:

项目框架

6 条件预备和主界面构架

一开始通过创建链表、遍历各模块文件夹存进节点。初始化触摸屏,表现图片…
详细效果和代码如下:

实体效果:

屏保:
屏保
主界面:
主界面
详细代码:

int main()
{	
    in_list();//创建图片/视频/音乐链表
	struct double_list  *p=head3;
	lcd_fd=open("/dev/input/event0",O_RDWR);//打开触摸屏
		if(lcd_fd < 0)
		{
			perror("open ts fail:");
		}
	show_protect();	//增长屏保	
//-------------滚动条-------------
	pthread_t tid;
	pthread_create(&tid,NULL,move_move,NULL);
//-------------滚动条-------------		
    while(1)
		{				
			printf("\n");
			show_pohoto("xuanze.bmp");//选择功能菜单:视频or 相册or 音乐	     	     	
			lcd_finger();
			if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
			{		
                 if(y>145 &&y<205 && x>480 && x<688)
				{
					 pthread_cancel(tid); //取消滚动条                  
					video_contents(head);//视频目次
					pthread_create(&tid,NULL,move_move,NULL);//回功能菜单后,重新创建滚动条           
	    		}
                 if(y>235 &&y<300 && x>480 && x<688)
				{
                    pthread_cancel(tid);		
				   show_pic(head2); //相册    
					pthread_create(&tid,NULL,move_move,NULL);
				}
				if(y>333 &&y<395 && x>480 && x<688)
				{
                    pthread_cancel(tid);					
				   p=show_music(p,head3); //进入音乐界面 
					pthread_create(&tid,NULL,move_move,NULL);
				}
                if(y>55 &&y<165 && x>270 && x<460)
				{
				  pthread_cancel(tid);		
                  make_roll();//点名
				  pthread_create(&tid,NULL,move_move,NULL);
				}			
			}  				
   }	
	return 0;
}

7 点名体系:

利用线程循环滚动和随机函数srand天生不确定号码,到达点名效果。
详细效果和代码如下:
实体效果:
点名体系
点名2
详细代码:

int  make_roll()//抽奖
{
	char num[22];
	int a=0;//担当随机号码
	while(1)
	{	
		printf("\n");
		show_pohoto("choujiang.bmp");	
			
		pid2 =fork();
		if(pid2 == 0)  //子历程
		{
			pthread_t tid1;
			
			 while(1)
			{		
				lcd_finger();				
				if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
				{
					if(y>380 &&y<480 &&x>0 &&x<110)
					{	
						  pthread_create(&tid1, NULL, gundong, NULL);	
					}		
					if(y>370 &&y<480 &&x>690 &&x<800)
					{
                        strcpy(num,"noreturn");
						write(pipe_fd[1],num,sizeof(num));				
						 exit(0);
					}	
					if(y>320 &&y<440 &&x>300 &&x<490)
					{					
						strcpy(num,"return");
						write(pipe_fd[1],num,sizeof(num));				 
						exit(0);
						 //return 1;
					}						
				}		
			}
	
	    }
	    wait(NULL);
	
        read(pipe_fd[0],num,sizeof(num));
		printf("num=%s\n",num);
		if(strcmp(num,"return")==0)
		{
			return 1;
		}	
	
		printf("\n");
		show_pohoto("choujiang2.bmp");
		srand((unsigned)time(NULL));
		a=rand()%57+1;
		show_num1(a);
		sleep(5);	
    }
		
}

8 相册:

通过双向循环链表生存图片名,实现用户可通过左右滑动触摸屏上下、循环切换图片。
详细效果和代码如下:
实体效果:
相册
详细代码:

   int show_pic(struct double_list *head2)//相册功能
 {
	int xx,yy,xxx,yyy;  
    struct double_list  *tmp =  head2->next;
    char buff[66];
    
    sprintf(buff,"/mnt/sd/project2/photo/%s",tmp->pic_name);	//拼接路径
	printf("\n");	
	show_pohoto(buff);//表现图片

	while(1)
		{
			while(1)
			{					
		        lcd_finger();			
			    if(xy.type == EV_KEY && xy.code == BTN_TOUCH )															
				{												
			 		if( xy.value == 1)  
				    {						
						 xx = x;
						 yy = y;					
				    }       								    
                    else
					{						
						if(y>370 &&y<480 && x>0 && x<200)//退出
						{										 
						 return 1;							
						}					
						xxx=x-xx;
						yyy=y-yy;						
						break;		
					}				
				}
	        }									
			if(yyy>=-30&&yyy<=30&&xxx>20)  //向右滑动,下一张图片
			{	
				tmp=tmp->next;								 
				if(tmp==head2)
				{
					tmp=tmp->next;
				}

				bzero(buff,sizeof(buff));
				sprintf(buff,"/mnt/sd/project2/photo/%s",tmp->pic_name);//拼接路径	
				printf("\n");
				show_pohoto(buff);//表现图片
			}			
			if(yyy>=-30&&yyy<=30&&xxx<-20)  //向左滑动,上一张图片
			{		
				tmp=tmp->prev;					 
				if(tmp==head2)
				{
					tmp=tmp->prev;														 
				} 			  
				bzero(buff,sizeof(buff));
				sprintf(buff,"/mnt/sd/project2/photo/%s",tmp->pic_name);	
				printf("\n");
				show_pohoto(buff);									
			}		
		}
 }

9 视频:

通过视频目次,判定触屏坐标选择相应视频,进入播放界面播放视频以及其他播放功能。
详细效果和代码如下:
实体效果:
视频目次:
视频目次
播放器:
播放器 详细代码:

int video_contents(struct double_list  *head)//视频目次
{
	struct double_list  *tmp =  NULL;
	while(1)
	{
		printf("\n");
		show_pohoto("shipingmulu.bmp");
		show_jpg("1giao.jpg",150,60);
		show_jpg("2xzq.jpg",350,60); 	
		show_jpg("3cxk.jpg",550,60);	
		show_jpg("4nixx.jpg",150,260);	
		show_jpg("5xhpp.jpg",350,260);
		show_jpg("6superme.jpg",550,260);
		while(1)
		{
			lcd_finger();
			if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
			{
				 printf("目次中:x=%d,y=%d\n",x,y);
		
				if(y>60 &&y<160 && x>150 && x<250)//播放第一个影戏
				{
					
					tmp=seek_pos(head,1);//指针跳转到第一个节点			
					player_video(tmp);
					break;
				}
				
				if(y>60 &&y<160 && x>350 && x<450)//播放第二个影戏
				{
					
					tmp=seek_pos(head,2);				
					player_video(tmp);
					break;
				}
			    //....省略反面4个视频
                if(y>380 &&y<480 && x>0 && x<150)
				{//返回选择功能菜单
					 return 1;
			    }
			}
		}
	}
}

int player_video(struct double_list  *head)//播放视频界面
{
	struct double_list  *tmp=head;
    char new_name[32];
	 pid =fork();
	if(pid == 0)  //子历程
	{
    	printf("\n");
		show_pohoto("shiping.bmp");	
        
        strcpy(new_name,tmp->pic_name);
        strtok(new_name,".");
	 
		show_name(new_name);//表现视频名字
	    drw_sound(5);
        char buff[100];//吸收拼接好的播放视频指令
	  
		int fd = open("/pipe1",O_RDWR);//打开通讯的管道文件
		if(fd < 0)
		{
			perror("fail:");
			exit(0); //退出历程
		}

		dup2(fd,1);//重定向标准输出装备形貌符 	
		//=======革新进度条=======
		pthread_t tid;
		pthread_create(&tid,NULL,func,NULL);
		pthread_detach(tid); 

		//=======举行触摸屏操纵========
		pthread_t tid1;
		pthread_create(&tid1,NULL,finger,NULL);//(快进/退却、音量调治、停息/播放、静音.....)
	    pthread_detach(tid1);						
	 
        sprintf(buff,"mplayer -slave -quiet -input  file=/pipe  -geometry  0:0 -zoom -x 750 -y 410  /mnt/sd/project2/shiping/%s",tmp->pic_name);		
		system(buff);		//实验播放下令 

		exit(0);
	}	         
 	
    wait(NULL);
}

10 音乐:

实现音乐播放器的功能:上下首、播放/停息、音量调治、歌曲名字、背景播放。
详细效果和代码如下:
实体效果:
音乐播放器
详细代码:

struct double_list* show_music(struct double_list *p,struct double_list *head3)//播放音乐
{
	struct double_list  *tmp=NULL;
	
	if(p==head3)//判定用户是否第一次进入音乐界面
	{
	   tmp =  head3->next;
	}
    else
    {
       tmp = p;
    }	 
	
	printf("\n");
	show_pohoto("music.bmp");	
   
    char name[24];//担当音乐名字
	char buff[100];//吸收拼接好的播放音乐指令
	bzero(name,sizeof(name));//表现歌曲名字
	strcpy(name,tmp->pic_name);
	strtok(name,".");		       				 				 
	music_name(name);

	int fd = open("/pipe2",O_RDWR);//打开通讯的管道文件 
		if(fd < 0)
		{
			perror("fail:");
			exit(0); //退出历程
		}	
	 while(1)
	 {  		 
		lcd_finger();	
		if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
		{			 
			//实验播放下令 
		    if(y>30 &&y<125 && x>460 && x<625)//播放音乐
			{      
	            if(j==0)
				{				
					sprintf(buff,"mplayer -slave -quiet -input  file=/pipe2  /mnt/sd/project2/music/%s &",tmp->pic_name);//将音乐指令拼接到BUFF中,&  为背景历程播放			
					system(buff);//在背景开始播放	
					bzero(name,sizeof(name));//清空数组
					strcpy(name,tmp->pic_name);
					strtok(name,".");		       				 				 
					music_name(name);
					j++;
					system("echo volume 10 1 > /pipe2"); //低沉初始音量
				}         
				else if(j==1)
				{
                 write(fd,"seek 100 1\n",strlen("seek 100 1\n"));//制止播放
			     j--;
				}		
			}      	
			if(y>30 &&y<125 && x>625 && x<785)//停息播放
			{		
				write(fd,"pause\n",strlen("pause\n"));				
			}			
			if(y>322 &&y<360 && x>560 && x<620)//退却
			{
				write(fd,"seek -5\n",strlen("seek -5\n"));
			}		
	        if(y>322 &&y<360 && x>673 && x<730)//快进
			{
			   write(fd,"seek +5\n",strlen("seek +5\n"));				
			}  
			if(y>280 &&y<335 && x>615 && x<670)//加声音
			{
			  write(fd,"volume +20\n",strlen("volume +20\n"));
			}			
		    if(y>365 &&y<420 && x>615 && x<670)//减声音
			{
			   write(fd,"volume -20\n",strlen("volume -20\n"));
			}
	        if(y>125 &&y<220 && x>625 && x<785)//下一首
			{
	            write(fd,"seek 100 1\n",strlen("seek 100 1\n"));
	            tmp=tmp->next;
				if(tmp==head3)
				{
					tmp=tmp->next;
				}
			    bzero(buff,sizeof(buff));
				sprintf(buff,"mplayer -slave -quiet -input  file=/pipe2  /mnt/sd/project2/music/%s &",tmp->pic_name);//将音乐指令拼接到BUFF中			
                system(buff);//在背景开始播放	
				bzero(name,sizeof(name));//清空数组
				strcpy(name,tmp->pic_name);//将音乐名字生存在数组中
				strtok(name,".");//切割数组		       				 				 
				music_name(name);//表现音乐名字				
				usleep(50000);
				system("echo volume 10 1 > /pipe2"); //低沉初始音量	
			}	
			if(y>125 &&y<220 && x>460 && x<625)//上一首
			{
	            write(fd,"seek 100 1\n",strlen("seek 100 1\n"));
	            tmp=tmp->prev;
				if(tmp==head3)
				{
					tmp=tmp->prev;
				}
			    bzero(buff,sizeof(buff));
				sprintf(buff,"mplayer -slave -quiet -input  file=/pipe2  /mnt/sd/project2/music/%s &",tmp->pic_name);//将音乐指令拼接到BUFF中			
                system(buff);//在背景开始播放
				bzero(name,sizeof(name));
				strcpy(name,tmp->pic_name);
				strtok(name,".");		       				 				 
				music_name(name);
				usleep(50000);
				system("echo volume 10 1 > /pipe2"); //低沉初始音量
			}	
            if(y>390 &&y<480 && x>0 && x<140)//返回功能菜单
			{
				p=tmp;
			  return p;		
			}
		}	
	 }
}

11 项目总结

此次项目紧张运用到链表的利用、mplayer指令的选择、触摸屏的坐标处置处罚、进/线程的创建与停止,对文件IO路径的熟悉。
紧张难点在于界面框架的搭建,线程/历程的停止、视频进度条的天生(根据Mplaye通过重定向获取到当进步度,盘算出屏幕像素映射的长度,通过线程循环获取且当用户点击到进度条的坐标时,盘算触屏坐标的相应进度,再举行视频跳转)…
界面操持也是一个比力淹灭时间的过程…



路过

雷人

握手

鲜花

鸡蛋
收藏 邀请
上一篇:Spark通信架构下一篇:万能音视频转换器:Permute 3 for mac

相关阅读

一周热门

头条攻略!

日排行榜

相关分类