【基于ARM cortex-A53的音视频】

一、演示效果

gec6818音视频项目效果

二、实验要求

1、UI界面设计要求

(1)返回按钮在不同层级不能有干扰;
(2)界面坐标会触发到设定的功能;
(3)在音乐和视频播放选择界面具备退出按钮;
(4)返回退出按钮的防误碰,及退出按钮的再次确认;

2、音视频播放要求

(1)多次随机顺序交替按播放、暂停,恢复,停止,会存在音频不能占用卡机,不能发生视频重叠闪烁;
(2)限制播放不同尺寸视频的缩放;

3、音视频可以动态更换

(1)可以通过传递参数路径更改音视频文件;
(2)难点: 通过双链表实现音视频实现上一曲、下一曲的功能可参考Linux使用双向链表实现图片、音乐、视频的切换和删除功能高级功能

三、重点代码剖析

1、主函数int main(int argc char ** argv)

int main(int argc, char **argv)
{
 int x=0,y=0,k=0;
 
 if(argc !=3)
 {
  printf("1111111111");
  fprintf(stderr, "Usage: %s <MP3_FILENAME> %s <VIDEO_FILENAME>\n", argv[1],argv[2]);  
        exit(1);  
 }
 //屏幕初始化
 lcd_open();  //lcd.h
 //触摸屏初始化
 ts_init(); //ts_6818.h
 
 //1.显示登录界面
 lcd_draw_bmp(0,0,"./ui/welcome.bmp");  //lcd.h
 sleep(2);
 
 //2.显示功能选择界面
 lcd_draw_bmp(0,0,"./ui/choose_fun.bmp");   
 UI_FLAGS = UI_CHOOSE;
 //3.进入功能选择
 while(1)
 {
  ts_get_xyk_6818(&x,&y,&k); //ts.c
  printf("x1=%d,y1=%d\n",x,y);
  
  //点击触摸屏不同区域,实现不同功能
  if(x>128&& x<448 &&y>200 &&y<400) //音乐
   play_s(argv[1]);
  else if(x>538&& x<870 &&y>200 &&y<400) //视频
   play_v(argv[2]);
  else if(x>896&&y>475 && (UI_FLAGS = UI_CHOOSE)) //退出界面
  {
   
   UI_FLAGS=UI_EXIT;
   lcd_draw_bmp(0,0,"ui/exit.bmp");
   while(1)
   {
    ts_get_xyk_6818(&x,&y,&k); //ts.c
    printf("x1=%d,y1=%d\n",x,y);
    if(x>154&& x<422 &&y>275 &&y<388)
    {
     UI_FLAGS=UI_CHOOSE;
     break;
     //continue;
     /* continue 语句只结束本次循环,而不是终止整个循环,continue 的用法十分简单,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。而且,continue 只能在循环语句中使用,即只能在 for、while 和 do…while 中使用,除此之外 continue 不能在任何语句中使用。
     所以,再次强调:continue 不能在 switch 中使用,除非 switch 在循环体中。此时 continue 表示的也是结束循环体的本次循环,跟 switch 也没有关系。*/
    }
    else if(x>600&& x<810 &&y>275 &&y<388) 
    {
     break; /*break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。跳出本级while循环,非本级if判断,而是针对循环,break 语句,它不仅可以跳出“循环体”,还可以跳出 switch。但事实上,break 也只能用于这两种情况。break 语句不能用于循环语句和 switch 语句之外的任何其他语句中。不管是 for 循环,还是 while 循环,或者是 do…while 循环,都可以用 break 跳出来,但是 break 只能跳出一层循环。当有多层循环嵌套的时候,break只能跳出“包裹”它的最里面的那一层循环,无法一次跳出所有循环。*/
    }
   }
   
   if(UI_FLAGS==UI_CHOOSE)
    lcd_draw_bmp(0,0,"./ui/choose_fun.bmp");   //选择界面
   else if(UI_FLAGS==UI_EXIT)
   {
    //printf("111111111111");
    system("killall -9 madplay");
    system("killall -9 mplayer");
    lcd_draw_bmp(0,0,"ui/byebye.bmp");  //退出界面
    break;
   }
  }
 }
  
 
 //解除初始化
 lcd_close();  //lcd.c
 ts_uninit();  //ts_6818.c
 
 return 0;
}

(1)这个开发板的LCD显示屏像素为800 * 480,但是坐标为1024 * 600(与底层的驱动有关)

可根据公式换算,设800 * 480 需要取的坐标为x1、y1,1024* 600需要取的坐标为x2、y2:
则有:
x2/x1 = 1024/800;
y2/y1 = 600/480;

知道800 * 480其中的需要的坐标点,可根据公式换出 x2 = 1024/800 * x1; y2 =600/480 * y1;

(2)添加每个界面的标志位,防止各个界面的功能相互影响,出现Bug

int UI_FLAGS = 0; //控制UI显示标志1
#define UI_WELCOME 1
#define UI_CHOOSE 2
#define UI_BUTTON 3
#define UI_A  4
#define UI_V  5
#define UI_EXIT  6

当切换UI界面时,首先需要更改显示界面标志位

(3)播放音视频前,需要把已播放的音视频kill,防止两个或多个音视频同时播放

   system("killall -9 madplayer \n");	//杀死madplayer视频播放器
   system("killall -9 mplayer \n");	//杀死mplayer音乐播放器

(4)在开发板设置特定的尺寸播放视频

mplayer -zoom -x 720 -y 480 %s &
参数说明:
-fs 视频图像居中
-zoom -x 800 -y 480 设置大小(具体按自己的开发板LCD分辨率设置)

(5)在开发板播放特定的音视频文件

须有一下函数语句:int main(int argc, char **argv)
play_s(argv[1]); play_v(argv[2]);
void play_v(char *namepath) void play_s(char *namepath)

(6)学习madplay、mplayer播放器的移植

可参考:Linux系统的madplay、mplayer音视频播放器的制作

四、ARM cortex-A53开发板工程、源文件和UI界面的资源在gec开发板音视频播放项目

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小鹿

博主不差钱,点个赞就行哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值