自定义音频播放是用户在具有一定的研发能力的情况,希望自己控制播放来实现某些需求,因此ARTC提供了相关的功能,以方便用户实现这些需求。
功能介绍
ARTC 默认集成了经过市场验证的音频播放模块,能够满足大多数场景下的播放需求。但在某些特殊场景下,用户可能已有成熟的自定义音频播放模块,或需要对音频数据进行二次处理后再播放。为此,ARTC 提供了自定义音频播放能力,允许用户关闭内部播放逻辑,接管音频数据的接收与播放过程。
该功能的核心是通过开启音频帧回调,获取远端或本地的 PCM 音频数据,交由用户实现的播放设备进行处理和回放。
前提条件
在使用自定义音频播放前,请确保满足以下条件:
用户已具备完整的音频播放模块开发能力,或已有成熟的第三方/自研音频播放器;
了解基本的音频处理流程,包括 PCM 数据格式、采样率、声道数等概念;
已集成 ARTC SDK 并完成基础音视频通话功能的接入;
明确业务需求必须绕过 ARTC 内部播放模块,否则建议继续使用默认播放方案以保证稳定性与兼容性。
功能实现
因为iOS端和Android端的具体实现细节存在差异,接下来我们分别介绍iOS端和Android端的自定义音频播放的实现方案。
iOS端实现方案
1.开启/关闭外部播放选项
设置字段,"enable_system_audio_device_play"="TRUE"。
/* 动态关闭阿里内部采集 */
[_engine setParameter:@"{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}"];
/* 动态打开阿里内部采集 */
[_engine setParameter:@"{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}"];
2.监听音频回调
通过调用enableAudioFrameObserver 注册音频回调。
AliRtcAudioFrameObserverConfig* config = [[AliRtcAudioFrameObserverConfig alloc] init];
config.sampleRate = AliRtcAudioSampleRate_Unknown ;
/* AudioDeviceIos 是需要用户自己实现的播放模块,这里是做个示范代码 */
audio_device_ = new AudioDeviceIos() ;
audio_device_->StartPlayout() ;
[_engine enableAudioFrameObserver:is_on audioSource:AliRtcAudioSourcePlayback config:config];
3.在回调用处理收到的PCM数据给系统音频设备
在回调用处理接收到的PCM数据,同时提交给音频设备。
- (BOOL)onPlaybackAudioFrame:(AliRtcAudioFrame* _Nonnull)frame {
audio_device_->SyncWriteToBuffer(frame) ;
return true;
}
4.离开频道,关闭监听
[_engine enableAudioFrameObserver:false audioSource:AliRtcAudioSourcePlayback config:config];
audio_device_->StopPlayout();
Android实现方案
1.开启/关闭 外部播放选项
设置字段,"enable_system_audio_device_play"="TRUE"。
/* 动态关闭阿里内部播放 */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine.setParameter(parameter);
/* 动态打开阿里内部播放 */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}";
mAliRtcEngine.setParameter(parameter);
2.监听音频回调
通过调用enableAudioFrameObserver 注册音频回调。
/*
设置回调
*/
AliRtcEngine.AliRtcAudioFrameObserverConfig config = new AliRtcEngine.AliRtcAudioFrameObserverConfig();
config.sampleRate = AliRtcAudioSampleRate_Unknown ;
/* AudioDeviceAndroid 需要用户自己去实现 */
audio_device_ = new AudioDeviceAndroid() ;
audio_device_.StartPlayout() ;
mAliRtcEngine.enableAudioFrameObserver(true, AliRtcAudioSourcePlayback, config);
3.在回调用处理收到的PCM数据给系统音频设备
在回调用处理接收到的PCM数据,同时提交给音频设备。
/*
写入系统音频驱动
*/
@Override
public boolean onPlaybackAudioFrame(AliRtcEngine.AliRtcAudioFrame aliAudioSample) {
audio_device_.SyncWriteToBuffer(aliAudioSample) ;
return true ;
}
4.离开频道,关闭监听
mAliRtcEngine.enableAudioFrameObserver(false , AliRtcAudioSourcePlayback , config);
audio_device_.StopPlayout();
该文章对您有帮助吗?