ARTC SDK支持将外部音频输入进行本地播放和推流。它兼容多种音频文件格式,包括但不限于MP4、WAV和AAC文件,并且也支持PCM格式的流式音频数据输入。能够根据具体的应用场景选择最适合的音频源,无论是预录制好的文件还是实时生成的数据流,都能被高效地集成与传输。
输入音频文件
该功能适用于背景音乐播放及推流等多种场景。通过API调用方式播放背景音乐时,系统仅支持一次同时播放一个音频文件。对于需要同时播放多个音效文件(例如掌声、笑声等)的需求,可以通过使用 preloadAudioEffect
和 playAudioEffect
等相关API来实现。
实现原理
示例代码
设置音量
Android示例代码:
/* 设置为0 意味着不进行推流 */ mAliRtcEngine.setAudioAccompanyPublishVolume(volumeLevel); /* 设置为0 意味着不进行本地播放 */ mAliRtcEngine.setAudioAccompanyPlayoutVolume(volumeLevel);
iOS示例代码:
/* 设置为0 意味着不进行推流 */ [self.engine setAudioAccompanyPublishVolume:volume]; /* 设置为0 意味着不进行本地播放 */ [self.engine setAudioAccompanyPlayoutVolume:volume];
输入PCM
实现原理
示例代码
添加外部输入流
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];
该文章对您有帮助吗?