自定义音频播放

更新时间:2025-03-25 01:43:57

自定义音频播放是用户在具有一定的研发能力的情况,希望自己控制播放来实现某些需求,因此ARTC提供了相关的功能,以方便用户实现这些需求。

前提条件

ARTC内置了经过市场检验的音频播放模块,因此一般情况下建议客户使用ARTC内置的音频播放模块,如果有特殊需求,客户有自己完善的音频播放模块或者特殊需求,可以使用自己的播放模块处理和回放音频。

技术原理

image

因为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.开启/关闭 外部播放选项

设置字段,"user_specified_use_external_audio_player"="TRUE"

/* 动态关闭阿里内部播放 */
String parameter = "{\"audio\":{\"user_specified_use_external_audio_player\":\"FALSE\"}}";
mAliRtcEngine.setParameter(parameter);

/* 动态打开阿里内部播放 */
String parameter = "{\"audio\":{\"user_specified_use_external_audio_player\":\"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();
  • 本页导读 (1)
  • 前提条件
  • 技术原理
  • iOS端实现方案
  • 1.开启/关闭外部播放选项
  • 2.监听音频回调
  • 3.在回调用处理收到的PCM数据给系统音频设备
  • 4.离开频道,关闭监听
  • Android端实现方案
  • 1.开启/关闭 外部播放选项
  • 2.监听音频回调
  • 3.在回调用处理收到的PCM数据给系统音频设备
  • 4.离开频道,关闭监听