HarmonyOS 鸿蒙Next:在 OH_AVScreenCapture 的 OnBufferAvailable 回调中,如何将采集到的图片和声音,持续的传递到 ArkTS 侧?

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

HarmonyOS 鸿蒙Next:在 OH_AVScreenCapture 的 OnBufferAvailable 回调中,如何将采集到的图片和声音,持续的传递到 ArkTS 侧?

在 OH_AVScreenCapture 的 OnBufferAvailable 回调中,如何将采集到的图片和声音,持续的传递到 ArkTS 侧?  烦请大佬帮忙看看,提供一下demo或文档。 谢谢!

2 回复
1.文件传输:在Native层将采集到的图片和音频文件保存到本地存储,然后在ArkTS侧通过文件读取的方式获取这些文件。

a.使用OH_ImageSourceNative_CreatePixelmap接口通过图片解码参数创建OH_PixelmapNative指针 。该接口需要指定解码参数和图像源数据,并返回一个指向创建的Pixelmap对象的指针;

b. 将编码后的图片数据保存到本地存储。可以使用鸿蒙系统提供的文件存储API,将数据写入到指定的文件路径

2数据流传输:在Native层实时读取图片和音频数据,通过网络或其他方式将数据流传输到ArkTS侧,ArkTS侧负责接收和处理这些数据流。

可以使用C++读写函数读写文件:https://www.runoob.com/cplusplus/cpp-files-streams.html

也可以在native侧直接调用Arkts的函数,把读取到的值作为参数传过去:

在ArkTS中声明一个类,在Student中包含两个属性以及成员函数getStudentInfo,分别会需要string,number作为入参:

export class Student {
private name: string
private age: number

constructor(name: string, age: number) {
this.name = name;
this.age = age;
}

public getStudentInfo(): string {
console.log("This student is " + this.name + "and is " + this.age);
return 'This student is ${this.name} and is${this.age}';
}
}

在index.d.ts中链接C++侧函数与ArkTS侧函数:

export const sendStudentInfo:(a: Object) => void;

在C++测调用ArkTS侧函数:

static napi_value PrintStudentInfo(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value args[1];
//获取TS侧传入的参数   
napi_get_cb_info(env, info, &argc, &args[0], nullptr, nullptr);
napi_value getStudentInfo, stuInfo;
napi_get_named_property(env, args[0], "getStudentInfo", &getStudentInfo);
napi_value result = nullptr;
napi_call_function(env, args[0], getStudentInfo, 1, &stuInfo, &result);
return result;
}

将NativeCallArkTS接口导出:

EXTERN_C_START

static napi_value Init(napi_env env, napi_value exports)
{
OH_LOG_INFO(LOG_APP, "KQM enter Native Init");
napi_property_descriptor desc[] = {
{ "sendStudentInfo", nullptr, PrintStudentInfo, nullptr, nullptr, nullptr, napi_default, nullptr},
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}

EXTERN_C_END

在ArkTS中调用函数:

stu1: Student = new Student("张三", 18);

build() {
Row() {
Column() {
Button("Send student's message")
.fontSize(30)
.fontWeight(FontWeight.Bold)
.onClick(() => {
testNapi.sendStudentInfo(this.stu1)
})

在HarmonyOS 鸿蒙Next中,若要在OH_AVScreenCaptureOnBufferAvailable回调中,将采集到的图片和声音持续地传递到ArkTS侧,可以通过以下步骤实现:

  1. 数据封装:在OnBufferAvailable回调中,首先需要将采集到的图片数据(如YUV或RGB格式)和音频数据(如PCM格式)进行封装。这通常涉及将原始数据转换为适合传输的格式,如Base64编码或直接以二进制流形式封装。

  2. 数据传递:利用HarmonyOS提供的跨语言通信机制,如IPC(进程间通信)或DataAbility(数据访问能力),将封装好的数据从Java/Kotlin侧(原生侧)传递到ArkTS侧。

  3. 数据解析与展示:在ArkTS侧,接收到数据后,需要对其进行解析,还原为图片和音频的原始格式,并利用ArkTS的UI组件进行展示和播放。

  4. 持续传递:为了实现持续传递,可以在OnBufferAvailable回调中设置一个循环或定时器,不断地采集、封装、传递和解析数据。

请注意,上述步骤中的具体实现细节(如数据封装格式、跨语言通信机制的选择等)可能因具体需求和HarmonyOS版本而异。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部