OH\_Audio中音频播放初始化时如果添加,如下设置后,在连接蓝牙耳机播放时,只能听到’叮’一声,之后声音还是从手机播放出来,如果不添加这行设置, 播放声音时可以从蓝牙耳机听到正常声音。
OH_AudioStreamBuilder_SetRendererInfo(rendererBuilder, AUDIOSTREAM_USAGE_VOICE_COMMUNICATION);
Renderer完整的初始化代码如下:
static napi_value AudioRendererInit(napi_env env, napi_callback_info info) {
if (audioRenderer) {
OH_AudioRenderer_Release(audioRenderer);
OH_AudioStreamBuilder_Destroy(rendererBuilder);
audioRenderer = nullptr;
rendererBuilder = nullptr;
}
if (g_file) {
fclose(g_file);
g_file = nullptr;
}
g_file = fopen(g_filePath.c_str(), "rb");
if (g_file == nullptr) {
return 0;
}
// create builder
OH_AudioStreamBuilder_Create(&rendererBuilder, AUDIOSTREAM_TYPE_RENDERER);
// set params and callbacks
OH_AudioStreamBuilder_SetSamplingRate(rendererBuilder, g_samplingRate);
OH_AudioStreamBuilder_SetChannelCount(rendererBuilder, g_channelCount);
OH_AudioStreamBuilder_SetLatencyMode(rendererBuilder, AUDIOSTREAM_LATENCY_MODE_NORMAL);
OH_AudioStreamBuilder_SetFrameSizeInCallback(rendererBuilder, 2500);
OH_AudioStreamBuilder_SetRendererInfo(rendererBuilder, AUDIOSTREAM_USAGE_VOICE_COMMUNICATION); // 打开后蓝牙无法正常播放声音, 只能听到'叮'一声
OH_AudioStreamBuilder_SetRendererPrivacy(rendererBuilder, AUDIO_STREAM_PRIVACY_TYPE_PUBLIC);
OH_AudioRenderer_Callbacks rendererCallbacks;
rendererCallbacks.OH_AudioRenderer_OnWriteData = AudioRendererOnWriteData;
rendererCallbacks.OH_AudioRenderer_OnStreamEvent = AudioRendererOnStreamEvent;
rendererCallbacks.OH_AudioRenderer_OnInterruptEvent = AudioRendererOnInterruptEvent;
rendererCallbacks.OH_AudioRenderer_OnError = AudioRendererOnError;
OH_AudioStreamBuilder_SetRendererCallback(rendererBuilder, rendererCallbacks, nullptr);
OH_AudioStreamBuilder_SetRendererOutputDeviceChangeCallback(rendererBuilder, AudioRendererDeviceChangeCallback, nullptr);
OH_AudioStreamBuilder_SetRendererInterruptMode(rendererBuilder, AUDIOSTREAM_INTERRUPT_MODE_INDEPENDENT);
// create OH_AudioRenderer
OH_AudioStream_Result result = OH_AudioStreamBuilder_GenerateRenderer(rendererBuilder, &audioRenderer);
g_readEnd = false;
g_rendererLowLatency = false;
OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_DOMAIN, "AudioOHAudio", "AudioRendererLowLatencyInit result:%{public}d", result);
return nullptr;
}
操作步骤:
1、连接蓝牙耳机后,打开app。
2、播放声音,如果设置了SetRendererInfo,播放的声音异常,如果不设置SetRendererInfo,可以正常播放。
当设AUDIOSTREAM\_USAGE\_VOICE\_COMMUNICATION,会导致cn.rongcloud.rtc调用的SetDeviceActive中的设备选择(speaker)生效,所以声音从speaker播放。当不设AUDIOSTREAM\_USAGE\_VOICE\_COMMUNICATION(默认是Music),那么系统会自动选择设备,用蓝牙耳机播放。代码中调用了setCommunicationDevice选择了设备(RCRTCAudioRenderer.ets),注释掉就正常从蓝牙播放,此接口也不再推荐开发者调用,系统会自动选择最佳设备,应用无需关注。https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-audio-V5\#setcommunicationdevice9