如何使HTML视频元素缓冲由AssetManager加载的资产

问题描述

我目前正在使用Ionic创建一个应用程序。由于Google Playstore中的App Bundle大小限制为150 MB,因此我使用Play Asset Delivery来加载较大的资产,例如图像和视频。

我使用Angulars打字稿与HTML进行交互,但是要加载Aasets,我需要使用Java来访问Androids Platform API(例如AssetManager)。为此,我编写了一个Cordova插件

加载并处理一项资产的插件的Java代码

String str = "";
Context contexta = this.cordova.getActivity().getApplicationContext();
AssetManager assetManager = contexta.getAssets();
InputStream is = assetManager.open(path);
byte[] imageBytes = new byte[is.available()];//available() gives the required size for the array
is.read(imageBytes,imageBytes.length);
is.close();
str = Base64.encodetoString(imageBytes,Base64.DEFAULT);
callbackContext.success(str); //str gets passed to the typescript callback function

打字稿中的回调函数如下:

(imgData) => { //parameter str is send by callbackContext.success() in the java code
    imgElement.src = "data:image/png;base64,"+imgData; //HTML img element
}

(HTML元素无法通过路径访问资产,例如需要通过Java加载的src =“ assets / img1.png”)

代码可以正常工作。但是问题在于,甚至更大的资产(如50 MB的视频)也需要完全加载,然后以base64编码的数据字符串形式发送,这将花费大量时间。

Afaik HTML视频和音频元素使用缓冲区仅首先加载重要部分以尽快启动媒体,而不会占用过多内存。

有没有办法做到这一点?也许以某种方式将video元素发送到将其与缓冲区连接绑定的java插件,或者每隔几帧调用一次插件,以调用视频的另一部分(有点像创建自己的缓冲区)。您能帮我解决这个问题吗?

认情况下,AssetsManager打开方法使用access mode ACCESS_STREAMING。还有三个,其中一个称为ACCESS_BUFFER。)

Android SDK Tools : 26.1.1
NodeJS            : v12.18.3
npm               : 6.14.6
OS                : Windows 10
Gradle            : 6.6.1
Ionic Framework   : @ionic/angular 5.3.3
Cordova Platforms : android 9.0.0
@angular-devkit/build-angular : 0.1000.8
@angular-devkit/schematics    : 10.0.8
@angular/cli                  : 10.0.8
@ionic/angular-toolkit        : 2.3.3

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)