基于ARM cortex-A53的音视频播放
- 一、演示效果
- 二、实验要求
- 1、UI界面设计要求
- 2、音视频播放要求
- 3、音视频可以动态更换
- 三、重点代码剖析
- 1、主函数int main(int argc char ** argv)
- (1)这个开发板的LCD显示屏像素为800 * 480,但是坐标为1024 * 600(与底层的驱动有关)
- (2)添加每个界面的标志位,防止各个界面的功能相互影响,出现Bug
- (3)播放音视频前,需要把已播放的音视频kill,防止两个或多个音视频同时播放
- (4)在开发板设置特定的尺寸播放视频
- (5)在开发板播放特定的音视频文件
- (6)学习madplay、mplayer播放器的移植
- 四、ARM cortex-A53开发板工程、源文件和UI界面的资源在[gec开发板音视频播放项目]()
一、演示效果
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)