emWin视频播放器,含uCOS-III和FreeRTOS两个版本

第10期:视频播放器

配套例子:
V6-918_STemWin提高篇实验_视频播放器(RTX版本,仅支持MDK4.74)

 

例程下载地址:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=23687

 

工程介绍:
1. 重要提示:
    (1)本例子仅支持MDK4.74编译,且由于文件系统RL-FlashFS的限制,文件名仅支持ascii字符。
    (2)测试此例子前,务必将我们提供的文件夹“SD卡根目录存放的两个测试文件夹”里面的两个文件夹复制粘贴到SD根目录下。
    (3)首次使用先点击视频列表,视频名会被记录到listview控件里面,然后就可以任意操作了。如果文件夹中视频较多,首次打开会稍慢些,主要是因为要获取每个视频的播放时间。以后打开就比较快了,主要是对视频列表对话框做了隐藏和显示处理,而不是重复的创建和删除。
    (4)创建两个任务,一个GUI任务,用来刷emWin本身支持的emf格式视频,另一个是音频播放任务,用来播放视频中的声音,音频文件是从原始视频中提取出来的,使用MP3格式。由于两个任务都要操作文件系统,分别读取emf视频文件和MP3格式的音频文件,所以文件系统就需要互斥访问,也就是得支持重入。
    (5)优化:重新添加uCGUI3.98里面的JPEG解码文件,覆盖emWin原有的解码,并做DMA2D优化,emWin自带的卡死,基本300ms左右一帧480*272图片,而优化后,差不多80ms左右就一帧。缺点就是跟emWin原有的机制兼容有些问题,不过程序设计中已经将其避免。emWin支持的三缓冲可以继续使用。
2. 功能说明:
     (1) 支持上一个,下一个,快进和快退。
     (2)emWin任务是低优先级任务,音频解码任务是高优先级任务,两个任务之间通过消息邮箱和事件标志进行通信。
     (3)视频列表对话框做了模态处理,这样用户打开此对话框后只能操作这个对话框,而不能操作主界面。

 

截图效果:

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,首先我们需要使用Emwin中的窗口控件来创建数字键盘和EDIT工具来显示输入的数值。 首先创建一个窗口控件来容纳数字键盘。在窗口中绘制0-9的数字键盘。可以使用BUTTON控件或者TEXT控件来实现每个数字键。 接下来,创建一个EDIT控件来实时显示输入的数值。可以使用WM_HEDIT_Create函数创建一个水平方向的EDIT控件。 接着,为每个数字键添加按键响应函数,将数字键的值添加到EDIT控件中。可以使用WM_HEDIT_AddChar函数将字符添加到EDIT控件中。 最后,将数字键盘和EDIT控件添加到窗口中并显示窗口即可。 以下是示例代码: ``` #include "DIALOG.h" #define ID_WINDOW_0 (GUI_ID_USER + 0x00) #define ID_BUTTON_0 (GUI_ID_USER + 0x01) #define ID_BUTTON_1 (GUI_ID_USER + 0x02) #define ID_BUTTON_2 (GUI_ID_USER + 0x03) #define ID_BUTTON_3 (GUI_ID_USER + 0x04) #define ID_BUTTON_4 (GUI_ID_USER + 0x05) #define ID_BUTTON_5 (GUI_ID_USER + 0x06) #define ID_BUTTON_6 (GUI_ID_USER + 0x07) #define ID_BUTTON_7 (GUI_ID_USER + 0x08) #define ID_BUTTON_8 (GUI_ID_USER + 0x09) #define ID_BUTTON_9 (GUI_ID_USER + 0x0A) #define ID_EDIT_0 (GUI_ID_USER + 0x0B) static WM_HWIN hEdit; static void _cbWindow(WM_MESSAGE *pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(GUI_BLACK); GUI_Clear(); break; default: WM_DefaultProc(pMsg); break; } } static void _cbButton(WM_MESSAGE *pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_DrawRect(&pMsg->hWin->Rect); break; case WM_NOTIFY_PARENT: switch (pMsg->Data.v) { case WM_NOTIFICATION_CLICKED: if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0)) { WM_HEDIT_AddChar(hEdit, '0'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1)) { WM_HEDIT_AddChar(hEdit, '1'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2)) { WM_HEDIT_AddChar(hEdit, '2'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3)) { WM_HEDIT_AddChar(hEdit, '3'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4)) { WM_HEDIT_AddChar(hEdit, '4'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5)) { WM_HEDIT_AddChar(hEdit, '5'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_6)) { WM_HEDIT_AddChar(hEdit, '6'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_7)) { WM_HEDIT_AddChar(hEdit, '7'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8)) { WM_HEDIT_AddChar(hEdit, '8'); } else if (pMsg->hWin == WM_GetDialogItem(pMsg->hWin, ID_BUTTON_9)) { WM_HEDIT_AddChar(hEdit, '9'); } break; default: break; } break; default: BUTTON_Callback(pMsg); break; } } void MainTask(void) { GUI_Init(); WM_SetCreateFlags(WM_CF_MEMDEV); WM_SetDesktopColor(GUI_BLACK); WM_SetCallback(WM_HBKWIN, _cbWindow); WM_CreateWindowAsChild(0, 0, LCD_GetXSize(), LCD_GetYSize(), WM_HBKWIN, WM_CF_SHOW, _cbWindow, 0); WM_CreateWindow(10, 10, 220, 280, WM_CF_SHOW, _cbWindow, 0); hEdit = WM_HEDIT_CreateEx(10, 10, 200, 40, 0, WM_CF_SHOW, 0, ID_EDIT_0, 10); WM_CreateWindowAsChild(10, 60, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(80, 60, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(150, 60, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(10, 130, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(80, 130, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(150, 130, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(10, 200, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(80, 200, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); WM_CreateWindowAsChild(150, 200, 60, 60, WM_GetDesktopWindowEx(0), WM_CF_SHOW, _cbButton, 0); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_0), "0"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_1), "1"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_2), "2"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_3), "3"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_4), "4"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_5), "5"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_6), "6"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_7), "7"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_8), "8"); BUTTON_SetText(WM_GetDialogItem(WM_GetDesktopWindowEx(0), ID_BUTTON_9), "9"); while (1) { GUI_Delay(100); } } ``` 这个示例程序中,我们使用了BUTTON控件来实现数字键盘,使用了WM_HEDIT控件来实时显示输入的数值。在_cbButton回调函数中,我们为每个数字键添加了按键响应函数,将数字键的值添加到EDIT控件中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值