HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩

发布于 1周前 作者 gougou168 来自 鸿蒙OS

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

1 回复

更多关于HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题“HarmonyOS 鸿蒙Next Native子线程回调MJPEG流到Arkts显示闪崩”的问题,以下是专业回答:

在HarmonyOS中,当Native子线程回调MJPEG流到ArkTS进行显示时遇到闪崩问题,可能是由于线程间通信或资源同步不当导致的。要解决这个问题,可以检查以下几个方面:

  1. 线程安全性:确保MJPEG流数据的读取和传递在线程间是安全的,避免数据竞争和访问冲突。

  2. 资源同步:确保ArkTS界面在更新时,相关的UI资源(如图片流)已被正确同步,并且没有因多线程操作而导致资源状态不一致。

  3. 内存管理:检查Native子线程和ArkTS之间的内存传递是否存在内存泄漏或非法访问,确保内存管理的正确性。

  4. 回调机制:确认回调机制是否稳定可靠,避免回调过程中出现异常导致程序崩溃。

  5. 错误处理:增强错误处理能力,对可能出现的异常情况进行捕获和处理,避免程序因未处理的异常而崩溃。

如果经过上述检查后问题依旧存在,可能是由于特定场景下的Bug或系统限制。此时,建议详细记录问题复现步骤和相关信息,以便进一步分析。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部