HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩
HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩 Native子线程不停回调数据到arkts进行UI更新, 有什么好的实现demo ?
还有个问题,native的jpeg流,回调上层的形式是array Buffer ,arkts如何将这份arry buffer显示在image控件上?
这是我的部分代码:
@Entry
@Component
struct Index {
@State selectFilePath: string = "";
@State buttonEnabled: boolean = true;
@State isPlaying: boolean = false;
@State image: PixelMap | undefined = undefined;
build() {
Row() {
Stack() {
Image(this.image)
.height(100).width(100)
Button('PLAY')
.fontSize(12)
.width($r('app.float.model_size_width'))
.height($r('app.float.model_size_width'))
.margin({ top: $r('app.float.button_margin_2') })
.margin({ left: $r('app.float.button_margin_2') })
.onClick(() => {
hilog.isLoggable(0xFF00, TAG, hilog.LogLevel.INFO);
hilog.info(0xFF00, 'TZH', "===>start camera");
player.ICameraInit();
player.ICameraStart((nativeResult: ArrayBuffer) => {
hilog.info(0xFF00, TAG, "ICameraStart callBack:" + nativeResult.byteLength);
let imageData: ArrayBuffer = nativeResult as ArrayBuffer;
let imageSource: image.ImageSource = image.createImageSource(imageData);
class tmp {
height: number = 100
width: number = 100
}
let si: tmp = new tmp()
let options: Record<string, number | boolean | tmp> = {
'alphaType': 0, // 透明度
'editable': false, // 是否可编辑
'pixelFormat': 3, // 像素格式
'scaleMode': 1, // 缩略值
'size': { height: 100, width: 100 }
} // 创建图片大小
class imagetmp {
image: PixelMap | undefined = undefined
set(val: PixelMap) {
this.image = val
}
}
imageSource.createPixelMap(options).then((pixelMap: PixelMap) => {
let im = new imagetmp()
im.set(pixelMap)
})
});
})
.enabled(this.buttonEnabled)
}
.width(CommonConstants.FULL_SIZE)
}
.height(CommonConstants.FULL_SIZE)
}
}
我的native回调函数如下:
static void callTS(napi_env env, napi_value jsCb, void *context, void *data) {
CallbackContext *arg = (CallbackContext *)data;
napi_value ret;
napi_create_arraybuffer(arg->env, sizeof(arg->buffer), reinterpret_cast<void **>(&arg->buffer), &ret);
napi_call_function(arg->env, nullptr, jsCb, 1, &ret, nullptr);
}
int C_Method::onNotifyRecvState(int resolution, uint8_t *data, int length, int imgType, CallbackContext *context) {
if (context) {
context->buffer = data;
napi_value workName;
napi_create_string_utf8(context->env, "mjpeg display", NAPI_AUTO_LENGTH, &workName);
napi_value jsCb;
napi_get_reference_value(context->env, context->callbackRef, &jsCb);
napi_threadsafe_function tsFn;
napi_create_threadsafe_function(context->env, jsCb, nullptr, workName, 0, 1, nullptr, nullptr, nullptr, callTS, &tsFn);
napi_acquire_threadsafe_function(tsFn);
if(length > 0) {
napi_call_threadsafe_function(tsFn, (void *)context, napi_tsfn_blocking);
return 0;
}
}
else {
return -1;
}
}
疑惑的是,native层打印frame,十六进制格式是符合jpeg标准的,但是arkts打印arrayBuffer,居然都是0 。
更多关于HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对帖子标题“HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩”的问题,以下是专业回答:
在HarmonyOS中,当Native子线程回调MJPEG流到ArkTS进行显示时遇到闪崩问题,可能是由于线程间通信或资源同步不当导致的。要解决这个问题,可以检查以下几个方面:
-
线程安全性:确保MJPEG流数据的读取和传递在线程间是安全的,避免数据竞争和访问冲突。
-
资源同步:确保ArkTS界面在更新时,相关的UI资源(如图片流)已被正确同步,并且没有因多线程操作而导致资源状态不一致。
-
内存管理:检查Native子线程和ArkTS之间的内存传递是否存在内存泄漏或非法访问,确保内存管理的正确性。
-
回调机制:确认回调机制是否稳定可靠,避免回调过程中出现异常导致程序崩溃。
-
错误处理:增强错误处理能力,对可能出现的异常情况进行捕获和处理,避免程序因未处理的异常而崩溃。
如果经过上述检查后问题依旧存在,可能是由于特定场景下的Bug或系统限制。此时,建议详细记录问题复现步骤和相关信息,以便进一步分析。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。