Melis4.0[D1s]:9.测试cedar多媒体解码库,视频和lvgl混合显示

news2025/1/11 17:55:28

文章目录

  • 1.测试audio_test命令播放mp3
    • 1.1 finish命令中文件路径的写法(测试)
  • 2.测试cedar_test 命令播放mp4
    • 2.1 不清除logo图层,无法显示视频
    • 2.2 使用disp_layer_alpha_test命令清除logo图层,正常播放视频
  • 3. lvgl设置
    • 3.1 ui图层配置
    • 3.2 lvgl本身配置
    • 3.3 播放视频效果

参考资料:
1.全志官方文档:RTOS_Display_开发指南.pdf
2.全志官方文档:Melis_RTOS_多媒体解码_开发指南.pdf
3.《Melis4.0[D1s]:8.显示测试:图片格式和透明度》
4.《Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl》
跟踪了一下多媒体部分的源码,水平有限,看得晕头转向;发挥拿来主义的精神,能用就好,放弃深入阅读源码的尝试。

1.测试audio_test命令播放mp3

首先要把cedar模块编译进内核:在 melis 的根目录执行 make menuconfig 命令,选中 cedar 模块。

Modules Setup
	-->cedar module support

在这里插入图片描述
测试命令也包含进来:

Kernel Setup 
	--> Drivers Test Sample
		--> cedar Test

在这里插入图片描述
编译,烧录,运行,输入help命令可以看到下面的命令:

msh />help
......
cedar_close      - cedar_close
cedar_test       - cedar_test
audio_close_test - audio_close_test
audio_test       - audio_play_test
......

1.1 finish命令中文件路径的写法(测试)

audio_test命令的格式为:

audio_test [文件名]

我的sd卡目录下有个 mp3 文件夹,在finish中进入文件夹后的路径为:

cd /mnt/F/mp3
msh /mnt/F/mp3>ls
1906.真的爱你-Beyond.mp3 1912.千千阙歌-陈慧娴.mp3 1916.红日-李克勤.mp3 1917.都是你的错-陈慧琳.mp3 1917.都是你的错65k.mp3
distance.mp3

这时,我要播放distance.mp3,我使用了下面4种路径:

audio_test /mnt/F/mp3/distance.mp3           ------- 播放失败
audio_test \\mnt\\F\\mp3\\distance.mp3		 ------- 播放失败
audio_test F:\\mp3\\distance.mp3             ======= 播放成功
audio_test F:/mp3/distance.mp3               ------- 播放失败

只有一种路径是正确的:

audio_test F:\\mp3\\distance.mp3

测试播放纯音频文件不用考虑图层,比较简单。

2.测试cedar_test 命令播放mp4

先禁止melis桌面加载,在《startup.sh》注释掉相关内容:

packecho "Execute startup script begin.............."
#insmod d:\mod\orange.mod
#insmod d:\apps\desktop.mod
echo "...............Execute startup script end"

此时开机只显示全志logo。查询一下此时的图层信息:

msh />disp
screen 0:
# allwinner logo使用 ch[0] lyr[0]图层,alpha_mode = 0 (pixel alpha),alpha = 255,zorder 为 0 
   BUF    enable ch[0] lyr[0] z[0] prem[N] a[pixel 255] fmt[  0] fb[ 640, 480; 640, 480; 640, 480] crop[   0,   0, 640, 480] frame[  80,   0, 640, 480] addr[0x4132b000,0x00000000,0x00000000] flags[0x       0] trd[0,0]

alpha = 255属于全覆盖,不和其他图层混合显示。zorder=0表示最底层,其他图层只要大于0就会覆盖它。当然,覆盖是在图层都是alpha=255的情况下。

2.1 不清除logo图层,无法显示视频

在这种情况下,使用cedar_test 播放视频,只有声音,没有图像。

msh />cedar_test  F:\\hanfu02.mp4

这种情况下,查看一下图层信息(可以看到2个图层都属于ch[0],图层格式一个是RGB,一个是YUV):

msh />disp
screen 0:
   BUF    enable ch[0] lyr[0] z[0] prem[N] a[pixel 255] fmt[  0] fb[ 640, 480; 640, 480; 640, 480] crop[   0,   0, 640, 480] frame[  80,   0, 640, 480] addr[0x4132b000,0x00000000,0x00000000] flags[0x       0] trd[0,0]
   BUF    enable ch[0] lyr[1] z[1] prem[N] a[pixel   0] fmt[ 72] fb[1280, 720; 640, 360; 640, 360] crop[   0,   0,1280, 720] frame[   0,  15, 800, 450] addr[0x42b2d000,0x00000000,0x4273a000] flags[0x       0] trd[0,0]

在这里插入图片描述
这里是不是说同一通道的4图层,只能使用相同的格式?

2.2 使用disp_layer_alpha_test命令清除logo图层,正常播放视频

在上篇文章《Melis4.0[D1s]:8.显示测试:图片格式和透明度》的disp_layer_alpha_test命令再修改一下:

int disp_layer_alpha_test(int argc, char **argv)
{
	......
	if (argc == 2) {		//	如果带有一个参数,不用理会参数是什么,清除所有图层		
		disp_layer_clear_all(0);
		return 0;
	}else if(argc == 4){	//	带3个参数,分别是:   [1]=mode    [2]=alpha    [3]=zorder 
		mode = atoi(argv[1]);
		alpha = atoi(argv[2]);
		i = atoi(argv[3]);
		show_ui_layer(&test_cfg, 1, mode, alpha,(unsigned char)i);
		return 0;
	} else
		g_screen_index = 0;
	......
}		

输入下面的命令,注意:只带一个参数。

msh />disp_layer_alpha_test 0

查询图层信息(可以看到没有图层信息):

msh />disp
screen 0:
de_rate 300000000 hz, ref_fps:      59
mgr0: 800x480 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
        lcd output      backlight(192)  fps:58.4         800x 480
        err:77961       skip:16 irq:124292      vsync:0 vsync_skip:0

现在才可以正常播放视频。播放完毕后,查询图层信息:

msh />disp
screen 0:
#	vi图层ch[0] lyr[1]是,alpha_mode = 0 (pixel alpha),alpha = 0,format = 72,zorder 为 1
   BUF    enable ch[0] lyr[1] z[1] prem[N] a[pixel   0] fmt[ 72] fb[1280, 720; 640, 360; 640, 360] crop[   0,   0,1280, 720] frame[   0,  15, 800, 450] addr[0x42b2d000,0x00000000,0x4273a000] flags[0x       0] trd[0,0]

3. lvgl设置

3.1 ui图层配置

lvgl属于ui图层,所以使用ch[1] lyr[0] ,alpha_mode = 2 (global pixel alpha),alpha = 255,format = 0(ARGB),zorder 为 2(zorder可以改变,其他参数固定)。仿照 show_ui_layer() 写一个show_lvgl_layer() 的函数:

int request_lvgl_layer(unsigned char  zorder)
{
	static int isMemInited=0;	//
	struct test_layer_cfg test_cfg;
	struct test_layer_cfg *cfg = &test_cfg;
	memset(&test_cfg, 0, sizeof(struct test_layer_cfg));

	printf("request mem_id 0,800, 480,\n");
	//	第一次初始化,清除所有图层,申请内存;后面就不用了,只是改变zorder
	if(isMemInited == 0){
		disp_layer_clear_all(g_screen_index);
		disp_mem(0, 800, 480, 0, "r");
		memset(g_p_mem_base,0,800*480*4);
	}
	isMemInited = 1;
	cfg->mem_id = 0;
	cfg->screen_id = 0;
	cfg->layer_cfg.channel = 1;
	cfg->layer_id = 0;
	cfg->layer_cfg.layer_id = 0;

	cfg->layer_cfg.info.fb.format = 0;
	cfg->layer_cfg.info.fb.size[0].width = 800;
	cfg->layer_cfg.info.fb.size[0].height = 480;
	cfg->layer_cfg.info.fb.crop.x = 0;
	cfg->layer_cfg.info.fb.crop.y = 0;
	cfg->layer_cfg.info.fb.crop.width = 800;
	cfg->layer_cfg.info.fb.crop.height = 480;
	cfg->layer_cfg.info.fb.align[0] = 4;
	cfg->layer_cfg.info.mode = 0;
	cfg->layer_cfg.info.alpha_mode = 2;
	cfg->layer_cfg.info.alpha_value = 255;
	cfg->layer_cfg.info.zorder = zorder;
	cfg->layer_cfg.info.screen_win.x = 0;
	cfg->layer_cfg.info.screen_win.y = 0;

	return disp_layer_cfg(cfg);
}

3.2 lvgl本身配置

参考 DOT小文哥 的文章《LVGL视频播放界面实现方法》。
需要在lv_conf.h中设置参数:

#define LV_COLOR_SCREEN_TRANSP 1

然后设置界面背景色的透明度,LV_OPA_0 为透明,LV_OPA_COVER为覆盖,根据需要配置:

    /* init screen style */
    static lv_style_t style_scr_act;
        lv_style_init(&style_scr_act);
        /* set style to  LV_OPA_0 为透明,LV_OPA_COVER为覆盖*/
        lv_style_set_bg_opa(&style_scr_act, LV_OPA_0);
        lv_obj_add_style(lv_scr_act(), &style_scr_act, 0);

测试界面源码:

void lv_example_btn_1(void)
{
    // 创建一个组,稍后将需要使用键盘或编码器或按钮控制的部件(对象)添加进去,并且将输入设备和组关联
    // 如果将这个组设置为默认组,那么对于那些在创建时会添加到默认组的部件(对象)就可以省略 lv_group_add_obj()
    lv_group_t * g = lv_group_create();

    // 将上面创建的组设置为默认组
    // 如果稍后创建的部件(对象),使用默认组那必须要在其创建之前设置好默认组,否则不生效
    lv_group_set_default(g);

    // 将输入设备和组关联(使用前先打开上面注释掉的头文件)
    lv_indev_set_group(g_keypad_device_object, g);     // 键盘
    //lv_indev_set_group(lv_win32_encoder_device_object, g);      // 鼠标上的滚轮(编码器)

    /* init screen style */
    static lv_style_t style_scr_act;
        lv_style_init(&style_scr_act);
        /* set style to  LV_OPA_0,no cover*/
        lv_style_set_bg_opa(&style_scr_act, LV_OPA_0);
        lv_obj_add_style(lv_scr_act(), &style_scr_act, 0);
#define     RIGHT_OFFSET    40
    /* 创建一个btn部件(对象) */
    lv_obj_t * btn1 = lv_btn_create(lv_scr_act());       // 创建一个btn部件(对象),他的父对象是活动屏幕对象
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align(btn1, LV_ALIGN_LEFT_MID, 140, 165);

    lv_obj_t * btn2 = lv_btn_create(lv_scr_act());       // 创建一个btn部件(对象),他的父对象是活动屏幕对象
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, btn1, LV_ALIGN_OUT_RIGHT_MID, RIGHT_OFFSET, 0);

    lv_obj_t * btn3 = lv_btn_create(lv_scr_act());       // 创建一个btn部件(对象),他的父对象是活动屏幕对象
    lv_obj_set_size(btn3, 100, 50);
    lv_obj_align_to(btn3, btn2, LV_ALIGN_OUT_RIGHT_MID, RIGHT_OFFSET, 0);

    lv_obj_t * btn4 = lv_btn_create(lv_scr_act());       // 创建一个btn部件(对象),他的父对象是活动屏幕对象
    lv_obj_set_size(btn4, 100, 50);
    lv_obj_align_to(btn4, btn3, LV_ALIGN_OUT_RIGHT_MID, RIGHT_OFFSET, 0);

    lv_obj_t * slider = lv_slider_create(lv_scr_act());
    lv_obj_align(slider,  LV_ALIGN_BOTTOM_MID, 0, -20);   
}

3.3 播放视频效果

播放视频效果(按键切换):
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题

生产环境服务器规划如下 服务器类型网络环境cal.comnginx外网192.168.7.15:9200tomcat内网192.168.7.16:9200tomcat内网sdd.comnginx内网192.168.7.15:9100tomcat内网192.168.7.16:9100tomcat内网 192.168.7.15和192.168.7.16是做个负载均衡。目前的需求是用户访问外网的cal.…

SIEM工具保护云数据安全

规范对云中敏感数据的访问、跟踪已批准和未批准的应用程序的使用情况以及检测基础架构中影子 IT 应用程序的使用情况,将有助于防止针对云的内部和外部威胁。由于组织的云边界超出了传统的网络边界,因此实施严格的策略来保护敏感数据,并获得对…

宠物界的“富士康”IPO,福贝宠物冲刺上交所主板

随着社会经济的不断发展,人们生活水平的提高,宠物经济逐渐成为了一个备受关注的话题。无论是对于宠物爱好者还是宠物经济从业者,宠物经济的重要性都不容忽视。福贝宠物自然也是宠物经济下的产物。 福贝宠物在上交所主板IPO的申请获得受理。本…

开源单用户客服系统源码-上传附件功能-elementui 异步上传文件【唯一客服开发商】...

之前开源的单用户客服系统,上传附件成功后,还不能展示出文件形式,今天把上传展示出文件形式给开发完善一下。 我想要实现的效果是,展示出文件的名称和大小信息 后端返回一个带有文件信息的json结果,前端把该信息组织一…

打造中国的Web3.0基座,张平院士谈“构建元宇宙及支撑技术“

在近期举办的全球元宇宙大会开幕式上,中国工程院院士、北京邮电大学教授张平出席大会并发表了题为《构建元宇宙及支撑技术》的开场演讲。 演讲中,张平院士分析阐述了理想的元宇宙技术运行状态。他表示,元宇宙需要实现大规模用户持续在线、高…

【JS】1678- 重学 JavaScript API - Broadcast Channel API

当我们网页需要在不同的浏览器窗口之间共享数据时,可能需要使用 WebSocket 或 WebRTC 等技术。但是,这些技术会过于复杂。而浏览器自带的 Broadcast Channel API[1] 可以让我们轻松地在不同浏览器窗口之间共享数据,而无需使用复杂的技术。 本…

Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!

Redis基础篇 Java面试宝典-redis 实战篇Redis 开篇导读 亲爱的小伙伴们大家好,马上咱们就开始实战篇的内容了,相信通过本章的学习,小伙伴们就能理解各种redis的使用啦,接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信…

电脑屏幕录制软件哪个好用?推荐这2款!

案例:怎样才能找到一款好用的电脑录屏工具? 【我工作时,需要经常录制电脑屏幕,而我现在使用的录屏工具不好用,十分影响我的工作效率。我需要一款好用的电脑录屏工具,小伙伴们有没有推荐?】 如…

Java并发编程之AQS

目录 一,什么是AQS二,AQS核心知识1,核心思想2,AQS中的共享状态值-state3, 同步队列为什么称为FIFO4, Condition队列-单向队列 三,具体实现1,独占模式下的AQS2,共享模式下…

RdViewer远控隐蔽利用及钓鱼攻击

本文转载于: https://mp.weixin.qq.com/s?__bizMzg4NzkwMDA5NQ&mid2247484000&idx1&sn56b24135aa0aa77a690ff29566341c4e&chksmcf8210b0f8f599a6eaa7743bc65ad4e79400839c40289a8f5407e9732e22a4ae693c0701d1b0&mpshare1&scene23&srci…

未来城市的无限可能

生命体:Mix ta没有棱角但又泾渭分明 冰冷而又生机勃勃 最近受《环球》杂志记者邀请,对未来城市展开了若干讨论,分享给大家: 《环球》杂志 未来城市是什么样子的?请用几个关键词或几句话描述。 我理想中的未来城市应该具…

蒙特卡洛方法的基本介绍和简单应用(求圆周率和定积分)

目录 一、什么是蒙特卡洛方法 二、蒙特卡洛方法的基本思想 三、用蒙特卡洛方法求圆周率 π 四、用蒙特卡洛方法求定积分 你听说过 "蒙特卡洛法" 吗?哦,那是一种计算不规则图形面积的计算机程序算法,具体做法是在软件中用大量的…

【银河麒麟V10】【服务器】麒麟容器常见问题

一、麒麟容器镜像下载链接 &#xff08;1&#xff09;kylin-V10-SP1-0711-x86_64 docker镜像下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/10WyBYRoOykqgnagjnoxdXw?pwdt4h5 提取码&#xff1a;t4h5 二、容器基础使用 #导入镜像 docker load < k…

6.100ASK_V853-PRO开发板支持MIPI摄像头

0.前言 ​ 100ASK_V853-PRO开发板支持4LINE的MIPI摄像头和2LINE的MIPI摄像头&#xff0c;使用百问网提供的Tina SDK包生成的镜像&#xff0c;系统已经配置好了&#xff0c;可以直接使用。本章介绍如何去适配一个MIPI摄像头&#xff0c;本文所用的2LINE的MIPI摄像头&#xff0c…

什么是应用交付网络(ADN)

从CDN到ADN CDN&#xff08;内容分发网络&#xff09;在90年代末受到麻省理工学院的启发并完成发明&#xff0c;00年代初成立第一家成功的CDN商业企业Akamai。CDN的目标是相对于最终用户在空间上分配服务&#xff0c;以提供高可用性和高性能。随着互联网的发展&#xff0c;CDN…

建筑行业搭建BI数据可视化平台,已成为大势所趋

建筑行业的项目管理是一个系统而复杂的过程&#xff0c;其重点主要是寻求造价、质量、工期等几个方面的平衡点&#xff0c;并且对项目的整个过程必须要有一个清晰和直观的了解。 因此可以通过BI数据可视化分析将各个节点的系统数据、业务数据完整的呈现&#xff0c;将各管理层…

数字孪生园区可视化大屏系统-广州华锐互动

工业园区是现代工业化生产的重要组成部分&#xff0c;也是推动经济发展和提升城市形象的重要载体。而数字孪生园区可视化大屏系统作为一种新兴的技术应用&#xff0c;可以为工业园区的建设、管理和发展带来很大的价值。 首先&#xff0c;数字孪生园区可视化大屏系统可以帮助工业…

[C++]普通二叉搜索树实现

目录 1 二叉搜索树的基本概念 2 二叉搜索树的构建 2.1 二叉搜索树的结点 2.2 搜索树类的结构 3 成员函数 3.1 插入 3.2 查找 3.3 删除&#xff08;重点&#xff09; 3.4 默认成员函数的辅助函数 4 普通的二叉搜索树的效率 1 二叉搜索树的基本概念 二叉搜索树又称二叉…

Java框架学习05(Spring事务详解)

1、什么是事务&#xff1f; 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 我们系统的每个业务方法可能包括了多个原子性的数据库操作&#xff0c;比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的&…

相亲交友app开发上线运营的整个流程是什么

一、相亲交友app开发基本流程 1、需求分析&#xff1a;需求分析是相亲交友app源码开发的第一步&#xff0c;也是最重要的一步。在需求分析阶段&#xff0c;可以了解客户对于系统的需求&#xff0c;确定系统功能实现的大致方向和功能。 2、系统架构&#xff1a;系统架构阶段就是…