文章目录

  • 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.avi3.把该图片显示到 屏幕中 (要对图片进行缩放 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 +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生成不确定号码,达到点名效果。
具体效果和代码如下:
实体效果:


具体代码:

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通过重定向获取到当前进度,计算出屏幕像素映射的长度,通过线程循环获取且当用户点击到进度条的坐标时,计算触屏坐标的相应进度,再进行视频跳转)…
界面设计也是一个比较花费时间的过程…

【Linux】基于Mplayer开源多媒体库的音视频播放器相关推荐

  1. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...

  2. QT视频播放器(windows qt、linux qt 音视频播放器)

    想要更多项目私wo!!! 一.项目简介        这是基于Qt的QMediaPlayer实现的音视频播放器,实现了播放器的常用功能,例如根据播放列表选择播放的音视频,拖动滑块控制音视频播放. 二. ...

  3. Linux系统的madplay、mplayer音视频播放器的制作

    Linux系统音视频播放器的制作 madplay和mplayer的安装环境 一.Linux系统录音播放源码的下载和移植 1.需要下载alsa-lib-1.2.6.tar.bz2(声音驱动的内核组件库) ...

  4. 基于Qt、FFMpeg的音视频播放器设计一

    前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...

  5. 全志F1C100s主线linux入坑记录 (6)音视频播放(视频播放软解)

    音视频播放(视频播放软解) 百度网站 文章目录 音视频播放(视频播放软解) 一.音频播放 1.声卡驱移动植入 (1)下载安装声卡补丁 (2)配置声卡 (3)linux内核编译烧录 (4)使用声卡 二. ...

  6. 基于electron的音视频播放器

    基于electron的音视频播放器 前言 选择做一个音视频播放器桌面应用程序原因 技术的选型 已经实现了的功能 音视频播放实现 右键菜单实现 总结 效果图 安装包下载: 最后如果大家觉得我这个音视频播 ...

  7. android音视频播放器开发百度云,Android 播放端 SDK

    1 概述 PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单.快捷的接口,帮助开发者在 Android ...

  8. Qt FFmpeg 音视频播放器

    使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频. 本demo环境为 qt5.12 vs2019-32位 .pro的qt工程 FFmpeg版本位3.4.8 vs2092-32位 本 ...

  9. 使用Qt编写的跨平台音视频播放器(一)

    1.初衷 为了学习Qt,遂自己琢磨着写一个音视频播放器(比较五花八门,借鉴模仿了好几个软件的界面),可以有很多种实现方式,在这里我使用的是QMediaPlayer,和QVideoWidget显示.有时 ...

最新文章

  1. python类属性描述_如何描述Python对象,以及属性、标识、类型和值之间的关系?...
  2. JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)
  3. aba会导致问题_护发素会导致掉发?这个纠结多年的问题,真相原来是这回事
  4. ES6, Angular,React和ABAP中的String Template(字符串模板)
  5. LeetCode 2064. 分配给商店的最多商品的最小值(二分查找)
  6. 95-190-442-源码-window-Trigger-ProcessingTimeTrigger
  7. 一直当菜鸟吧!——关于全局变量
  8. 网络常用端口号(全)
  9. 什么是RS232电平?什么是TTL电平?
  10. 大学综评自招面试 计算机专业,自主招生中的综合评价面试技巧
  11. excel 筛选重复项_列表项的Excel筛选器:2011年“鲨鱼周”
  12. 软件测试中冒烟测试范例,浅谈冒烟测试及用例
  13. 自然语言处理和python_Python与自然语言处理搭建环境
  14. 少儿编程微课程7:星际飞行单机版
  15. 安装 Apache+php+mysql+phpMyAdmin XAMPP及错误解决办法
  16. JS 大杂烩(持续更新)
  17. mac设置开机启动app_Mac App无法启动? 这是解决方法
  18. 猫猫龙猫猫004:vim编辑器理解和命令
  19. 刷机时代落幕——刷机现状、原理及方法步骤
  20. 我的计算机制作幻灯片在哪,电脑ppt制作软件,电脑里制作PPT(幻灯片)的软件在哪?...

热门文章

  1. 帆软填报问题之填报显示提交成功,数据库却查不到数据
  2. 剑指offer: 二叉树中和为某一值的路径
  3. 天载配资策略指数能否创新高
  4. 关于springmvc静态资源常被忽视,有可能致命的点
  5. 关于安装双系统时多重引导的说明
  6. Linux(安装apache,设置端口,基于端口的配置方法)
  7. Java自学指南四、书籍
  8. 水面垃圾收集器在线监测项目案例
  9. CSS的选择器 :first-child和:last-child
  10. collections.deque的队列方法,[]内的语句规范,del,字典(dict)