HarmonyOS AVCapture录音得到数据Arraybuffer 是 640字节,ArrayBuffer写到文件后播放声音会断断续续

AVCapture录音得到数据Arraybuffer 是 640字节,临时存储拼接ArrayBUffer,到3 * 1024 字节后再进行写入文件,播放声音会断断续续,就像是每次写入的数据之间会有断层。

if (this.mp3Buffer === undefined) { 
  this.mp3Buffer = result; 
} else { 
  ///  TODO:这里拼接后

ArrayBuffer写到文件后播放声音会断断续续,就像是每次写入的数据之间会有断层。

 // 存储每次读取的结果 
  let buffers: BufferA.Buffer[] = []; 
  // 存储上一次结果 
  buffers.push(BufferA.from(this.mp3Buffer.slice(0, this.mp3Buffer.byteLength))); 
  // 存储当前读取结果 
  buffers.push(BufferA.from(result.slice(0, result.byteLength))); 
  // 合并内容 
  let finalBuf: ArrayBuffer = BufferA.concat(buffers).buffer; 
  this.mp3Buffer = finalBuf; 
}
HarmonyOS
2024-11-13 10:09:13
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

​默认的buffer 是93ms,可以通过调用 OH_AudioStreamBuilder_SetFrameSizeInCallback 设为20ms,也可尝试写满 bufferLen 数据。另外有一些排查手段,您可以看下。

一、播放无声 无声问题常见原因

1.音量被设置成0 或者 mute。

2.流创建失败。

3.Write数据失败。

自排查动作指导。

1、 搜索日志。

TAG:  ajust mute|mute_FrameCount|SetSystemVolumeLevelInternal。

①如果日志中存在类似“ LottieViewModel --> updateVolumeInfo, ajust mute: true”日志,说明调节了音量为静音。

②如果日志中存在类似 “C02562/asd: asd_out 0->1 mute_FrameCount 157”日志,可以看出播放状态下从静音调节到有声音过程中播放了静音帧数据数量。

③如果日志中存在类似 “[SetSystemVolumeLevelInternal]SetSystemVolumeLevelInternal streamType: 1, volumeLevel: 0, updateUi: 1”日志,可以看出音量调节的具体内容,如前面显示的音量调节成了0。

TAG: “Write: Illegal|Write data error” --- 针对histreamer相关应用。

①如果日志中存在类似“HiStreamer: (audio_server_sink_plugin.cpp, 911): Write data error ret is”日志,说明写数据失败了。

②如果日志中存在类似 “AudioStream: [Write]Write: Illegal  state:5, sessionId:”日志 说明流状态不对 非running状态。

2、dump数据。

必现问题可以dump数据,使用下面链接的方式进行数据dump。

PCM dump指南。

观察客户端送到fwk数据是否无声。

观察fwk送到hal数据是否无声。

二、 播放卡顿 pop音

1.欠载( UnderRun ) ,应用写数据较慢引起pop音。

2.offload问题。

3.音效问题。

4.接口异常卡死。

自排查动作指导。

1. 搜索日志。

TAG:underrun。

①如果日志中存在xx日志,说明xxx。

②如果日志中存在xx日志,说明xxx。

2. dump数据。

必现问题可以dump数据。

1)如果要dump client端数据 先找到应用包名,否则不需要。

2) 执行脚本。

hdc shell mount -o rw,remount /
hdc shell setenforce 0
hdc shell param set sys.audio.dump.writeserver.enable w
hdc shell param set sys.audio.dump.writeclient.enable a
hdc shell chmod 777 /data/local/tmp/

3、复现问题。

4 、拉取dump数据。

hdc file recv /data/app/el2/100/base/应用包名/cache
hdc file recv /data/local/tmp/
hdc file recv /data/data/.pulse_dir/

5、查看数据。

录音机。

包名:com.huawei.hmos.soundrecorder。

dump的fwk->client端信息在 /data/local/tmp/dump_client_capturer_audio.pcm。

文件格式为  48000hz 2声道 32bit。

dump的hdi->fwk端信息在 /data/data/.pulse_dir/dump_capture_audiosource.pcm。

文件格式为  48000hz 2声道 32bit。

相关应用包名。

其他信息。

应用dump数据存放的位置。

普通应用dump的位置存在应用沙箱。

走avplayer的应用,比如华为音乐,存储在/data/local/tmp。

观察客户端送到fwk数据是否无声。

观察fwk送到hal数据是否无声。

3.关闭offload。

必现问题可以通过关闭offload判断是否和offload相关。

① 导出原有配置文件备份。

hdc file recv /vendor/etc/audio/audio_policy_config.xml

② 备份下。

audio_policy_config.xml ->audio_policy_configbak.xml

③ 将offload_enable="1" 修改为 offload_enable="0",代表关闭offload。

④ 执行脚本推包。

hdc shell mount -o rw,remount /vendor
hdc file send .\audio_policy_config.xml /vendor/etc/audio
hdc shell reboot

4. 关闭音效。

① 导出原有配置文件备份。

hdc file recv /system/etc/audio/audio_effect_config.xml

②备份下audio_effect_config.xml ->audio_effect_configbak.xml。

③修改audio_effect_config.xml中的几个音效so名字,比如在后面加个1,为了让音频不在走音效。

④ 推包验证。

hdc shell mount -o rw,remount /
hdc file send audio_effect_config.xml system/etc/audio
hdc shell reboot​
分享
微博
QQ
微信
回复
2024-11-13 15:47:13
相关问题
后台播放声音直接无声
1803浏览 • 1回复 待解决
使用32字节秘钥加解密报错
1671浏览 • 1回复 待解决
HarmonyOS soundpool播放声音的问题
551浏览 • 1回复 待解决
如何对ArrayBuffer字节流进行MD5?
206浏览 • 1回复 待解决
在 string 转成ArrayBuffer报错
1011浏览 • 1回复 待解决
如何将ArrayBuffer转成string
2522浏览 • 1回复 待解决
ArrayBuffer怎么转Uint8Array?
559浏览 • 1回复 待解决
Uint8Array如何转成ArrayBuffer
1573浏览 • 1回复 待解决
HarmonyOS arraybuffer转base64乱码
149浏览 • 1回复 待解决
如何将ArrayBuffer转成string?
596浏览 • 1回复 待解决
ArrayBuffer怎样转字符串
516浏览 • 1回复 待解决
字符串如何转为ArrayBuffer
661浏览 • 1回复 待解决
Native如何通过napi获取ArrayBuffer
3618浏览 • 1回复 待解决