HarmonyOS 从底层频繁回调到JS,保存的数据有问题

1、把一包包音频数据从JS传到C层,然后解码,最后返回JS保存成文件。

2、这是一个循环过程,每包数据间隔是10-30ms。

3、结果JS保存的数据是有问题的,而在回调前,在C层保存没问题。

C代码片段:

static int decode_stream_output(void *buf, int size, void *priv) {
    NapiContext *napiContext = (NapiContext *)priv;

    CallbackContext *callbackContext = (CallbackContext *)malloc(sizeof(CallbackContext));
    callbackContext->size = size;
    callbackContext->buf = (unsigned char *)malloc(sizeof(unsigned char) * size);
    memcpy(callbackContext->buf, buf, size);

    fwrite(callbackContext->buf, 1, callbackContext->size, fout);//在这保存的数据没问题

    napi_acquire_threadsafe_function(napiContext->threadSafeFunc);
    napi_call_threadsafe_function(napiContext->threadSafeFunc, callbackContext, napi_tsfn_blocking); 

    return 0;
}

JS代码片段:

let listener: OnStreamDecodeListener = {
  onDecoded: (outData: ArrayBuffer): void => {
    writeStream.write(outData).then((writeSize) => {//保存的数据有问题
      writeStream.flush();
    })
  }
}
nativeAPI.setOnStreamDecodeListener(listener)
HarmonyOS
7天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

如描述,当调用 writeStream.write(outData) 函数时,Node.js 会尝试将数据写入流,但不会等待写入操作完成就继续执行后面的代码。

在异步 write 的情况下,可能在数据完全写入之前就调用了 flush 或其他后续操作,导致保存的数据有误。而在同步 writeSync 的情况下,数据完全写入后才会继续执行后续的代码。

参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fs-V5#writesync

分享
微博
QQ
微信
回复
7天前
相关问题
fileio.write写buffer数据有问题
4688浏览 • 1回复 待解决
HarmonyOS JS和TS底层渲染模式
91浏览 • 1回复 待解决
物联网产生数据有什么特征?
4328浏览 • 1回复 待解决
mysqldump搭建库同步数据问题
3181浏览 • 0回复 待解决
如何解决底层库无法调试问题
1008浏览 • 1回复 待解决
HarmonyOS 框架底层原理相关
82浏览 • 1回复 待解决
PreferenceManager保存数据经常丢失
344浏览 • 1回复 待解决