rockchip rk3368(px5)车载开发之路6,系统开机bootanimation播放视频需求

2023-11-03

本系列记载作者来到一个新的车载后装市场小公司,负责从新开始维护一套代码的心路过程。系统使用瑞芯微的rk3368芯片,版本是PX5_Android_8.0_release_20180726,从无到有的每个patch修改以及思考。其中着重点是驱动和系统相关,由于涉及到公司保密,所以APP部分暂时不贴过多的代码,只是针对系统bug进行记录。

2020_02_14
android系统默认支持bootanimation,但是原生的是播放bootan.zip.并且多个图片肯定没有视频播放的流畅,而且多个图片占用系统存储资源较大,于是瑞芯微在android6.0上面做了开机bootanimation程序里面播放视频的功能,在此将其移植到android8.0上面
1.编译系统中增加视频文件,利用copyfiles机制进行简化内置bootvideo.mp4到/oem/media/文件夹下

diff --git a/copyfiles/oem/media/bootvideo.mp4 b/copyfiles/oem/media/bootvideo.mp4
new file mode 100644
index 0000000..01efd46
Binary files /dev/null and b/copyfiles/oem/media/bootvideo.mp4 differ
diff --git a/px5.mk b/px5.mk
index a076337..04350d4 100755
--- a/px5.mk
+++ b/px5.mk
@@ -46,3 +46,7 @@ PRODUCT_PROPERTY_OVERRIDES += \
     ro.product.ota.host = www.rockchip.com:2300

 #PRODUCT_HAVE_OPTEE := true
+
+COPY_FILES = $(shell cd $(LOCAL_PATH)/copyfiles/ && find -type f)
+PRODUCT_COPY_FILES += $(foreach f, $(COPY_FILES), $(LOCAL_PATH)/copyfiles/$(f):$(f))
+

2.修改Bootanimation.cpp等代码

diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 0e2c13e..c9b3633 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -27,6 +27,7 @@ LOCAL_SHARED_LIBRARIES := \
     libgui \
     libOpenSLES \
     libtinyalsa \
+    libmedia \
     libbase
 
 LOCAL_MODULE:= bootanimation
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 7394490..4e912e2 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -64,6 +64,10 @@
 #include "BootAnimation.h"
 #include "audioplay.h"
 
+#include <media/mediaplayer.h>
+#include <media/AudioSystem.h>
+#include <media/IMediaHTTPService.h>
+
 namespace android {
 
 static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
@@ -71,6 +75,7 @@ static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip
 static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
 static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip";
 static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";
+static const char SYSTEM_BOOTVIDEO_FILE[] = "/oem/media/bootvideo.ts";
 
 static const char SYSTEM_DATA_DIR_PATH[] = "/data/system";
 static const char SYSTEM_TIME_DIR_NAME[] = "time";
@@ -343,6 +348,12 @@ status_t BootAnimation::readyToRun() {
             return NO_ERROR;
         }
     }
+
+    if(access(SYSTEM_BOOTVIDEO_FILE,R_OK) == 0)
+	mVideo=true;
+    else
+	mVideo=false;
+
     return NO_ERROR;
 }
 
@@ -351,10 +362,14 @@ bool BootAnimation::threadLoop()
     bool r;
     // We have no bootanimation file, so we use the stock android logo
     // animation.
-    if (mZipFileName.isEmpty()) {
-        r = android();
-    } else {
-        r = movie();
+    if(mVideo)
+	r = video();
+    else {
+    	if (mZipFileName.isEmpty()) {
+            r = android();
+    	} else {
+            r = movie();
+        }
     }
 
     eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
@@ -368,6 +383,31 @@ bool BootAnimation::threadLoop()
     return r;
 }
 
+bool BootAnimation::video()
+{
+    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+    eglDestroyContext(mDisplay, mContext);
+    eglDestroySurface(mDisplay, mSurface);
+    
+    sp<MediaPlayer> mp = new MediaPlayer();
+    mp->reset();
+    mp->setDataSource(NULL,SYSTEM_BOOTVIDEO_FILE,NULL);
+    mp->setLooping(false);
+    mp->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
+    mp->prepare();
+    mp->start();
+    
+    while(true)
+    {
+	if(exitPending())
+	    break;
+	usleep(100);
+	if(!mp->isPlaying())
+	    checkExit();
+    }
+    mp->stop();
+    return false;
+}
 bool BootAnimation::android()
 {
     ALOGD("%sAnimationShownTiming start time: %" PRId64 "ms", mShuttingDown ? "Shutdown" : "Boot",
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 181ef1c..68f92af 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -168,6 +168,9 @@ private:
     SortedVector<String8> mLoadedFiles;
     sp<TimeCheckThread> mTimeCheckThread = nullptr;
     sp<InitAudioThread> mInitAudioThread = nullptr;
+
+    bool video();
+    bool mVideo;
 };

代码加入后,在播放视频的时候,中间会有卡顿,获得信息得知,rk3399和px5的android6.0都没有此问题。
分析的过程如下:
1.视频时长格式问题,找到了其他的视频,还是有问题。
2.播放过久,因为看到了大约16s时候,sdcardfs挂载时候出现卡顿(将bootvideo放入到root根目录下面测试,问题没有改善,将系统的cpu governor设定成performance,问题也没有改善)。
3.rk3399的bootanimation进程支持调整动画播放时间,将动画播放时间调整后,虽然动画没有播完,但是看似卡顿不存在了,所以后面对客户的要求就是,动画不要超过3s,或者前几秒的动画是静止的,后面再持续播放,但是总长不能超过15s。
4.总结问题可能的根本原因是因为使用了mediaplayer,在系统启动过程中mediaplayer可能经历了reset,导致了资源(mediaplayer)出现了互斥。

总之,问题还是有卡顿,如果使用标准的bootanimation.zip方式,则不会有卡顿

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rockchip rk3368(px5)车载开发之路6,系统开机bootanimation播放视频需求 的相关文章

  • 文档翻译软件哪个好?来一起探讨一下吧

    有近十个文档需要翻译 小问题 我有秘笈可以快速搞定它 作为打工人的你 还在自己辛辛苦苦地翻译文档中的外语内容吗 这样多费时啊 这种吃力不讨好的行为可不推荐 来跟我学学文档翻译技巧吧 那就是借助文档翻译软件来进行翻译操作 如果不清楚文档翻译软
  • 接口还在吗?

    突然感觉自己老了 连程序也写不动的惰性 但是 人不能被惰性打倒 人是被自己打倒的 如果一个人不能response自己的行为 那么他将什么都不能request到 人们现在已经把编程的经历都转义到接口上来了 但是 我们作为一个程序员 应该是能适
  • PyCharm单独安装PyKDL

    用于在Ubuntu下Pycharm独立使用PyKDL 不需要ros 使用Pycharm的安装器安装的PyKDL是不能使用的 引用会报错 1 把安装器安装的给卸载掉 2 去GitHub下载代码 Git下载 还有一个类似的代码hrl kdl 不
  • 服务器任务管理器详细信息,服务器任务管理器数字进程

    服务器任务管理器数字进程 内容精选 换一换 针对Windows 2012操作系统 由于安装应用系统会用到 net framework 3 5 而2012自带的 net framework 4 5版本需要卸载 但是卸载之后可能会遇到黑屏 无法
  • mysql按照一个字段分组查询_SQL如何查询一张表的所有字段并按其中一个字段进行分组...

    展开全部 1 创建测试表 create table test group cols id number value varchar2 20 remark varchar2 20 2 插入测试数据 insert into test group
  • java命令大全

    转载地址 http www cnblogs com langtianya p 4208135 html JAVA命令大全 1 java exe 运行java程序 这个相信每一位用Java的人知道了 2 javac exe 编译的Java程序
  • QT-如何使用智能指针

    QT框架提供了三种智能指针 QSharedPointer QWeakPointer和QScopedPointer 这些智能指针可以有效地管理QT对象的内存 避免内存泄漏的问题 同时还能提高代码的可读性和可维护性 QSharedPointer
  • stata的一些操作命令

    一 面板数据填充 面板数据填充 设置好第一年和最后一年 然后用如下命令 sort id year 然后按照id和year排序 xtset id year 设定面板样本和时间变量 ssc install tsfill replace 安装时间
  • 时下火热的 NFT 究竟有什么用?

    如今 NFT 正在以一股十分火热的趋势开始席卷全球 无论是个人还是企业 都开始关注起了这个由区块链技术所衍生出来的全新数字生态 我国为了防止 NFT出现投机 炒作等风险 对于 NFT 二级市场有着严格的监管和限制 使得整个市场并不如国外那般
  • AndroidKiller介绍与使用

    往期推荐 什么是虚拟机 虚拟机有那几种 APK安装流程及详细步骤 APK打包流程 APK文件结构 Android开发之数据储存 APK属于压缩文件 不可以通过直接解压的方式来获取明文内容 需要借助AndroidKiller这类的第三方的工具
  • 关卡9-面向对象三大特征

    封装概述 是面向对象三大特征之一 封装 继承 多态 是面向对象编程语言对客观世界的模拟 客观世界里成员变量都是隐藏在对象内部的 外界是无法直接操作的 封装原则 将类的某些信息隐藏在类内部 不允许外部程序直接访问 而是通过该类提供的方法来实现
  • 毫米波与太赫兹:使用matlab RF propagation进行电波仿真可视化

    使用Matlab RF propagation 工具箱进行电波传播的仿真和可视化显示 并对结果进行分析 仿真场景自定义 天线参数自定义 频率选择移动通信典型频段 或未来移动通信规划频段 课程设计报告参考标准学术期刊论文格式 设计代码1如下
  • 宽带服务器盒信号灯红色闪烁,宽带出现光信号灯是红色是怎么回事

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 如光信号灯变红色或者闪烁 说明接收不到光纤信号 通常是由于存在以下几种情况导致 1 光猫光接口有问题 需要更换光猫 2 室内尾纤连接光猫接头松脱 把接头插好即可恢复 3 室
  • 使用 Ccrypt 在 Linux 中加密/解密文件

    Ccrypt 是一个用于数据加密和解密的命令行工具 Ccrypt 基于 Rijndael 密码 与 AES 标准中使用的密码相同 另一方面 在 AES 标准中 使用 128 位块大小 而 ccrypt 使用 256 位块大小 Ccrypt
  • new运算符

    define CRT SECURE ND WARNINGS include
  • 第4章 BP神经网络

    BP神经网络 1 BP神经网络介绍及发展背景 从前面介绍的感知器学习规则来看 其权值的调整 取决于期望输出与实际输出之差 Delta w i eta t y x i 但是对于各个隐藏层的节点来说 不存在已知的期望输出 因而该学习规则不能用于
  • 打印3的倍数的数

    写一个代码打印1 100之间所有3的倍数的数字 解题思路 1 3的倍数一定能够被3整除 因此i 3 0表达式成立时 则i一定是3的倍数 2 要输出1 100之间的3的倍数 那只需要从1 100循环100次即可 每次拿到i之后 用i 3 0检
  • ECharts可视化图标库 (事件与行为)

    ECharts中的事件与行为 日常开发中用到echarts 一般是用来展示数据 很少在图表上添加一些事件监听函数 但是没用过不代表没有 比如鼠标悬浮之后的高亮样式和鼠标悬浮后显示的tootip 这都属于默认的鼠标悬浮事件 除此之外 如果想要
  • 国王骑士金币问题

    本文以模拟算法的两种方式解题 同时附录递归算法 不建议使用 国王发放金币给骑士 按天数发 天数n 1 2 3 4 5 6 7 8 每天的金币k 1 2 2 3 3 3 4 4 分组模拟 IO 输入天数n 输出金币总数res 循环 按天数执行
  • js详细笔记

    第一天 1 SSR Setver side Render ASP JSP PHP CSR Client side Render2016年 2 js的引入

随机推荐

  • PT100温度采集电路设计

    PT100是正温度系数的热敏电阻 顾名思义 随着温度的升高 电阻的阻值变大 相反 如果随着温度的升高 电阻的阻值变小 就是负温度系数的热敏电阻 之所以叫做PT100 是因为在0度时其阻值为100欧姆 PT100之所以应用很广泛 不仅仅是因为
  • springboot实现简单的单点登录

    思路 用户登录去校验用户信息 校验成功后将登录后的信息持久化 并返回一个系统可识别的信息串 用户每次访问接口将参数和信息串一起访问 然后通过拦截进行对信息串统一识别认证 实践 用户登录 通过用户名和密码验证是否登录成功 我这里是用acces
  • 使用itertools.permutations(),找出三队选手的名单

    itertools permutations 返回可迭代对象的所有数学全排列方式 题目 两个乒乓球队进行比赛 各出3人 甲队为a b c三人 乙队为x y z三人 已抽签决定比赛名单 有人向队员打听比赛的名单 a说他不和x比 c说他不和x
  • 【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(01-13)——BTC篇

    学习视频来自 北京大学计算机系肖臻区块链学习视频 还有一些参考了一些博客的记录 其他博客1 文章目录 01 简介 02 BTC密码学原理 03BTC数据结构 04 BTC协议 05 BTC实现 06 BTC网络 07 BTC挖矿难度 08
  • 管网数据模型与数据结构

    空间数据模型是关于现实世界中空间实体及其相互问联系的概念 它为描述空 间数据的组织和设计空间数据库模式提供基本方法 管网空间数据模型是空间数据 模型的一种 在管网数据的表达和管网空间分析等方面起着极其关键的作用 1 1 城市地下管网数据特点
  • IDEA插件Free Mybatis Plugin使用心得

    目录 问题现象 问题分析 问题现象 今天在项目组长的推荐下 我在IDEA上安装了Free Mybatis Plugin插件 怎么安装我就不说了 很简单的 网上也有很多资料 这里我提一下我的一些使用心得 首先看它的介绍 其实里面唯一吸引到我的
  • 部署无线覆盖,安装无线网桥设备要注意的问题

    互联网产品和设备不断更新和迭代 以适应实际的发展 随着无线覆盖范围的发展 无线网桥产品也在升级以满足更好的需求 显然 新的无线网桥设备对安装的要求也越来越高 虽然无线网桥安装看起来很简单 但您只需将设备安装到正确的位置即可 但是 要使无线网
  • 分布式调度 Elastic-job

    分布式调度 Elastic job 1 概述 1 1什么是任务调度 我们可以思考一下下面业务场景的解决方案 某电商平台需要每天上午10点 下午3点 晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统需要
  • Cookie的简单使用

    在JSP中 使用cookie 有以下几个步骤 1 使用page指令导入类javax servlet http cookie 2 创建Cookie对象 Cookie newCookie new Cookie String key Object
  • vue html实体空格无效

    空格类型 当第一列空格不能用时试试第二列 空格分为 两种 普通文本空格和html实体空格 普通文本空格 unicode 正则 描述 全角 中文空格键 u3000 中文网页上常会出现 半角 英文空格键 u0020 s 最常见 写代码 html
  • liquibase报错 waiting for changelog lock

    今天项目启动控制台突然卡住 liquibase一直在打印 waiting for changelog lock 这可能是由于一个被杀死的liquibase进程未在DATABASECHANGELOGLOCK表上释放其锁定 通过以下方法解决 查
  • Essential Google Cloud Infrastructure: Foundation

    最后更新2022 03 08 有点事情 中断了几天 继续GCP GCP Fundamental看完了 但是lab还没做 翻墙越脊的 太麻烦 过些时候方便了一起练习 继续学习下一课 essential系列其实是再走一遍fundamentals
  • python21天打卡Day10-string和bytes互转

    a 21 python b a encode utf 8 string转为bytes print format b type b c b 21 python d c decode utf 8 print format d type d D
  • Gstreamer推送摄像头数据到RTMP服务器的方法(SRS成功示例)

    最近在研究如何将Linux中的视频数据推送到流媒体服务器 看到gstreamer还比较不错 于是试了一下 服务端用的SRS RTMP推流 搭建非常简单 教程可参考 https blog csdn net qq 52514123 articl
  • sort根据结构体中某一元素进行排序

    先看一下简单的sort全排序 int a 100 for int i 1 i lt 10 i scanf d a i sort a a 10 OK 排完了 但是 想根据结构体的一个元素 对结构体数组排序 看完下面例题 多思考 例题 FatM
  • CoordinatorLayout 的滑动监听--自定义

    public abstract static class AppBarStateChangeListener implements AppBarLayout OnOffsetChangedListener public enum State
  • Nginx实战练习

    1 Nginx安装 以centos7为例 详解博文 Nginx安装搭建之源码方式 Centos7 centos7源码安装nginx IT之一小佬的博客 CSDN博客 2 简单搭建站点 2 1 单个站点搭建 正常开放情况下 开发代码防止网站的
  • require() of ES modules is not supported.

    问题 如图所示 看了一些答案是版本问题 解决办法其其实提示已经有了 use import 找到提示的文件 require改为import 问题即可解决
  • 前端如何接接口

    前端一般静态页面写完后 就要从后端获取数据了 就要进行接接口 接接口其实说白了就是发送网络请求 从后端获取数据 然后再将数据渲染到页面上 今天就以一个简单的uniapp项目为例 介绍一下接口怎么写 首先 是封装一个request js文件
  • rockchip rk3368(px5)车载开发之路6,系统开机bootanimation播放视频需求

    本系列记载作者来到一个新的车载后装市场小公司 负责从新开始维护一套代码的心路过程 系统使用瑞芯微的rk3368芯片 版本是PX5 Android 8 0 release 20180726 从无到有的每个patch修改以及思考 其中着重点是驱