
# 原始音频数据（音频前后处理）
#### 功能描述
音视频传输过程中，我们可以对采集到的音视频数据进行前处理和后处理，获取想要的播放效果。
对于有自行处理音视频数据需求的场景，HWRtcEngine SDK 提供原始数据功能，您可以在将数据发送给编码器前进行前处理，对捕捉到的音频信号或视频帧进行修改，也可以在将数据发送给解码器后进行后处理，对接收到的音频信号或视频帧进行修改。
原始音频数据可以进行音频前处理，然后发送给远端。也可以进行音频后处理。
 #### 接口调用流程
![](https://support.huaweicloud.com/bestpractice-rtc/zh-cn_image_0000001227213157.png)
#### 注册音频前后处理
获取HWRtcEngie的HWRtcMediaEngie对象。
```
IHRTCMediaEngine * mediaEngine = m_pRtcEngine->getMediaEngine();
```
注册音频前后处理
```
mediaEngine->setAudioFrameObserver(&g_AudioObser);
```
每次入会都需要重新注册。取消注册，则传nil。
HRTCAudioFrameObserver g_AudioObser要继承IHRTCAudioFrameObserver。
和实现
```
requireRecordAudioFrame:
```
```
requirePlaybackAudioFrame：
```
```
requireMixedAudioFrame:
```
回调，通过回调的返回值来决定对应音频帧的处理是否生效。
实现
```
onAudioFramePlayback：
```
```
onAudioFrameMixed：
```
```
onAudioFrameRecord：
```
回调，从回调中获取音频帧并进行处理。
**注意**：所有回调的返回值为false，说明对音频帧的处理无效。
示例代码如下：
```
class HRTCAudioFrameObserver : public IHRTCAudioFrameObserver {
public:
    HRTCAudioFrameObserver() {
        RTCReadPcmFile();
    }
    virtual bool onAudioFramePlayback(HRTCAudioFrame& auidoFrame);
    virtual bool onAudioFrameMixed(HRTCAudioFrame& audioFrame);
    virtual bool onAudioFrameRecord(HRTCAudioFrame& audioFrame);
    virtual bool requireRecordAudioFrame() override;
    virtual bool requirePlaybackAudioFrame() override;
    virtual bool requireMixedAudioFrame() override;
};
/// 音频前后处理
bool HRTCAudioFrameObserver::onAudioFramePlayback(HRTCAudioFrame& audioFrame) {
    //远端音频数据
    return true;
}
bool HRTCAudioFrameObserver::onAudioFrameMixed(HRTCAudioFrame & audioFrame) {
    //混音数据
    return true;
}
bool HRTCAudioFrameObserver::onAudioFrameRecord(HRTCAudioFrame& audioFrame) {
    //本地音频数据
    return true;
}
bool HRTCAudioFrameObserver::requireRecordAudioFrame() {
    return true;
}
bool HRTCAudioFrameObserver::requirePlaybackAudioFrame() {
    return true;
}
bool HRTCAudioFrameObserver::requireMixedAudioFrame() {
    return true;
}
HRTCAudioFrameObserver g_AudioObser;
IHRTCMediaEngine * mediaEngine = m_pRtcEngine->getMediaEngine();
mediaEngine->setAudioFrameObserver(&g_AudioObser);
```
#### 加入房间
参考[接口调用流程]中加入房间的时序图步骤加入房间。
#### API参考
[setAudioFrameObserver](https://support.huaweicloud.com/csdk-rtc/rtc_05_0120.html#section1)
[requireRecordAudioFrame](https://support.huaweicloud.com/csdk-rtc/rtc_05_0122.html#section4)
[requirePlaybackAudioFrame](https://support.huaweicloud.com/csdk-rtc/rtc_05_0122.html#section5)
[requireMixedAudioFrame](https://support.huaweicloud.com/csdk-rtc/rtc_05_0122.html#section6)
[onAudioFramePlayback](https://support.huaweicloud.com/csdk-rtc/rtc_05_0122.html#section0)
[onAudioFrameRecord](https://support.huaweicloud.com/csdk-rtc/rtc_05_0122.html#section2)
[onAudioFrameMixed](https://support.huaweicloud.com/csdk-rtc/rtc_05_0122.html#section1)
