播放与推流外部输入音频

ARTC SDK支持将外部音频输入进行本地播放和推流。它兼容多种音频文件格式,包括但不限于MP4、WAVAAC文件,并且也支持PCM格式的流式音频数据输入。能够根据具体的应用场景选择最适合的音频源,无论是预录制好的文件还是实时生成的数据流,都能被高效地集成与传输。

输入音频文件

该功能适用于背景音乐播放及推流等多种场景。通过API调用方式播放背景音乐时,系统仅支持一次同时播放一个音频文件。对于需要同时播放多个音效文件(例如掌声、笑声等)的需求,可以通过使用 preloadAudioEffectplayAudioEffect 等相关API来实现。

实现原理

image

示例代码

设置音量

  • Android示例代码:

    /* 设置为0 意味着不进行推流 */
    mAliRtcEngine.setAudioAccompanyPublishVolume(volumeLevel);
    /* 设置为0 意味着不进行本地播放 */
    mAliRtcEngine.setAudioAccompanyPlayoutVolume(volumeLevel);
  • iOS示例代码:

    /* 设置为0 意味着不进行推流 */
    [self.engine setAudioAccompanyPublishVolume:volume];
    /* 设置为0 意味着不进行本地播放 */
    [self.engine setAudioAccompanyPlayoutVolume:volume];

输入PCM

实现原理

image

示例代码

添加外部输入流

  • Android示例代码:

    /* 根据自己的业务设置对应的参数 */
    AliRtcEngine.AliRtcExternalAudioStreamConfig config = new AliRtcEngine.AliRtcExternalAudioStreamConfig();
    /* 设置播放音量为0 ,意味着不进行本地播放 */
    config.playoutVolume = currentAudioPlayoutVolume;
    /* 设置推流音量为0, 意味着不进行推流 */
    config.publishVolume = currentAudioPublishVolume;
    config.channels = 1;
    config.sampleRate = 48000;
    audioStreamID = mAliRtcEngine.addExternalAudioStream(config);
  • iOS示例代码:

    /* 根据自己的业务设置对应的参数 */
    AliRtcExternalAudioStreamConfig *config = [AliRtcExternalAudioStreamConfig new];
    config.channels = _pcmChannels;
    config.sampleRate = _pcmSampleRate;
    /* 设置播放音量为0 ,意味着不进行本地播放 */
    config.playoutVolume = 0;
    /* 设置推流音量为0, 意味着不进行推流 */
    config.publishVolume = 100;
    _externalPlayoutStreamId = [self.engine addExternalAudioStream:config];

向音频流内送入PCM数据

  • Android示例代码:

    AliRtcEngine.AliRtcAudioFrame rawData = new AliRtcEngine.AliRtcAudioFrame();
    rawData.data = frameInfo.audio_data[0];
    rawData.numSamples = (int) (frameInfo.audio_data[0].length / (2 * frameInfo.audio_channels));
    rawData.bytesPerSample = 2;
    rawData.numChannels = frameInfo.audio_channels;
    rawData.samplesPerSec = frameInfo.audio_sample_rate;
    
    int ret = mAliRtcEngine.pushExternalAudioStreamRawData(audioStreamID, rawData);
    
    if(ret == 0x01070101) {
        sleep(20);
    } else if(ret < 0) {
        /* 异常, 检查参数和推流状态 */
    }
  • iOS示例代码:

    AliRtcAudioFrame *sample = [AliRtcAudioFrame new];
    sample.dataPtr = _pcmLocalData;
    sample.samplesPerSec = _pcmLocalSampleRate;
    sample.bytesPerSample = sizeof(int16_t);
    sample.numOfChannels = _pcmLocalChannels;
    sample.numOfSamples = numOfSamples;
    int rc = [self.engine pushExternalAudioStream:_externalPlayoutStreamId rawData:sample];
    if(rc == 0x01070101) {
        sleep(20);
    } else if(ret < 0) {
        /* 异常, 检查参数和推流状态 */
    }

移除外部音频流

  • Android示例代码:

    mAliRtcEngine.removeExternalAudioStream(audioStreamID);
  • iOS示例代码:

    [self.engine removeExternalAudioStream:_externalPublishStreamId];