概述
文章目录
- 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, "pausen",strlen("pausen"));
---------------------------
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部分程序代码指令:
write(fd,"volume +5n",strlen("volume +5n"));//加声音
write(fd,"volume -5n",strlen("volume -5n"));//减声音
write(fd,"seek -5n",strlen("seek -5n"));//快退。
write(fd,"seek +5n",strlen("seek -5n"));//快进。
write(fd,"pausen",strlen("pausen"));//暂停播放
write(fd,"seek 100 1n",strlen("seek 100 1n"));//停止播放
write(fd,"seek 100 1n",strlen("seek 100 1n"));//进度跳转
封装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生成不确定号码,达到点名效果。
具体效果和代码如下:
实体效果:
具体代码:
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=%sn",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=%dn",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 1n",strlen("seek 100 1n"));//停止播放
j--;
}
}
if(y>30 &&y<125 && x>625 && x<785)//暂停播放
{
write(fd,"pausen",strlen("pausen"));
}
if(y>322 &&y<360 && x>560 && x<620)//后退
{
write(fd,"seek -5n",strlen("seek -5n"));
}
if(y>322 &&y<360 && x>673 && x<730)//快进
{
write(fd,"seek +5n",strlen("seek +5n"));
}
if(y>280 &&y<335 && x>615 && x<670)//加声音
{
write(fd,"volume +20n",strlen("volume +20n"));
}
if(y>365 &&y<420 && x>615 && x<670)//减声音
{
write(fd,"volume -20n",strlen("volume -20n"));
}
if(y>125 &&y<220 && x>625 && x<785)//下一首
{
write(fd,"seek 100 1n",strlen("seek 100 1n"));
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 1n",strlen("seek 100 1n"));
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通过重定向获取到当前进度,计算出屏幕像素映射的长度,通过线程循环获取且当用户点击到进度条的坐标时,计算触屏坐标的相应进度,再进行视频跳转)…
界面设计也是一个比较花费时间的过程…
最后
以上就是独特超短裙为你收集整理的【Linux】基于Mplayer开源多媒体库的音视频播放器1 项目概况2 项目需求3 搭建环境4 技术描述5 概要设计6 条件准备和主界面构架7 点名系统:8 相册:9 视频:10 音乐:11 项目总结的全部内容,希望文章能够帮你解决【Linux】基于Mplayer开源多媒体库的音视频播放器1 项目概况2 项目需求3 搭建环境4 技术描述5 概要设计6 条件准备和主界面构架7 点名系统:8 相册:9 视频:10 音乐:11 项目总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复