原始音频数据
本文介绍如何对采集到的原始音频数据进行前处理和后处理。
技术原理
在实时音视频互动过程中,你可以对音视频数据进行前处理和后处理,并对它们进行修改,获取想要的播放效果。
对于有自行处理音频数据需求的场景,声网提供原始数据功能。 你可以在将数据发送给编码器前进行前处理,对捕捉到的音频信号进行修改;也可以在将数据发送给解码器后进行后处理,对接收到的音频信号进行修改。
原始音频数据功能的 CPU 占用率高,可能会影响性能。
数据传输
下图展示原始音频数据前处理和后处理过程中的数据传输:
通过 onRecordAudioFrame
,onPlaybackAudioFrame
,onPlaybackAudioFrameBeforeMixing
或者 onMixedAudioFrame
回调,你可以:
- 获取原始音频帧。
- 处理原始数据,并返回至 SDK。
API 调用时序
下图展示使用原始音频数据的调用时序:
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
参考如下步骤,在你的项目中实现原始音频数据功能:
- 加入频道前,调用
setAudioFrameDelegate
设置音频帧 delegate。 - 调用
set
为前缀的方法设置音频帧格式。 - 实现
onRecordAudioFrame
,onPlaybackAudioFrame
,onPlaybackAudioFrameBeforeMixing
和onMixedAudioFrame
回调。以上回调会对音频帧进行采集和处理。如果以上回调的返回值是false
,则说明对音频帧的处理无效。
示例代码
Swift
// swift
class RawAudioDataMain: BaseViewController {
var localVideo = Bundle.loadVideoView(type: .local, audioOnly: true)
var remoteVideo = Bundle.loadVideoView(type: .remote, audioOnly: true)
@IBOutlet weak var container: AGEVideoContainer!
// 定义 agoraKit 变量
var agoraKit: AgoraRtcEngineKit!
...
// 初始化 agoraKit,并注册相应回调
agoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
// 调用 setAudioFrameDelegate 设置音频帧 delegate。你需要在该方法中实现 AgoraAudioFrameDelegate 协议
agoraKit.setAudioFrameDelegate (self)
// 调用 set 为前缀的方法,配置每个回调采集到的音频帧
agoraKit.setRecordingAudioFrameParametersWithSampleRate(44100, channel: 1, mode: .readWrite, samplesPerCall: 4410)
agoraKit.setMixedAudioFrameParametersWithSampleRate (44100, samplesPerCall: 4410)
agoraKit.setPlaybackAudioFrameParametersWithSampleRate(44100, channel: 1, mode: .readWrite, samplesPerCall: 4410)
...
// 在当前类下,实现 AgoraAudioFrameDelegat 协议的 extension
extension RawAudioDataMain: AgoraAudioFrameDelegate {
// 实现 onRecordAudioFrame 回调
func onRecordAudioFrame(_ frame: AgoraAudioFrame, channelId: String) -> Bool {
return true;
}
// 实现 onPlaybackAudioFrame 回调
onPlaybackAudioFrame(_ frame: AgoraAudioFrame, channelId: String) -> Bool {
return true;
}
// 实现 onMixedAudioFrame 回调
func onMixedAudioFrame(_ frame: AgoraAudioFrame, channelId: String) -> Bool {
return true;
}
// 实现 onPlaybackAudioFrameBeforeMixing 回调
func onPlaybackAudioFrame(beforeMixing frame: AgoraAudioFrame, channelId: String, uid: UInt) -> Bool {
return true;
}
}
参考信息
本节介绍本文中使用方法的更多信息以及相关页面的链接。
示例项目
声网在 GitHub 上提供一个开源的示例项目:RawAudioData