音视频获取原始数据(自定义美颜)

如何通过 Callkit 和 Calllib 获取音视频的原始数据;
发布时间: 2017-10-16 18:30

回答:

1 注册观察者:RCCall.mm 中单列初始化方法s haredRCCall 已经实现注册功能(默认代码是注释掉的)

agoraRegisterVideoFrameObserver(RCDVideoFrameObserver::sharedObserver(), true, true);
agoraRegisterAudioFrameObserver(RCDAudioFrameObserver::sharedObserver());

    在注册视频观察者时,注意对参数对理解; 参数解释参考 IVideoFrameObserver.h 文件,也可参考 2.1.1 中的解释;

    源码中 RCCall 中是在 sharedRCCall 方法中注册的 observer。实际使用的时候在这里注册不会生效,请在发起视频通话 (startSingleCall/startMultiCall) 和接收通话 (didReceiveCall) 的时候注册。

2 在回调中操作音视频的原始数据

 2.1 视频,RCDVideoFrameObserver:     

    2.1.1获取原始视频:

bool RCDVideoFrameObserver::onCaptureVideoFrame(agora::media::IVideoFrameObserver::VideoFrame& videoFrame);

    对于注册观察者的api:

int agoraRegisterVideoFrameObserver(agora::media::IVideoFrameObserver *observer,
bool useExternalResource = false, bool localPreview = true);

如果使用外部视频源,useExternalResource 设置为 true,在此回调中将你的视频源传入即可;

如果需要获取设备摄像头数据,useExternalResource 设置为 false,在此回调中获取到每帧的数据做处理(美颜);

Callkit 默认在此回调里绘制一个十字架,具体参考 Callki t的源码;


    2.1.2 在 VoIP 中获取其他用户的视频数据:

bool RCDVideoFrameObserver::onRenderVideoFrame(unsigned int uid, agora::media::IVideoFrameObserver::VideoFrame& videoFrame);

    2.1.3 设置图像格式(可忽略):

void RCDVideoFrameObserver::setYUV(unsigned char *yBuffer,
                                   unsigned char *uBuffer,
                                   unsigned char *vBuffer, int width,
                                   int height);


2.2 音频,RCDAudioFrameObserver:

    2.2.1 获得录制的声音:

bool RCDAudioFrameObserver::onRecordAudioFrame(agora::media::IAudioFrameObserver::AudioFrame& audioFrame):

    2.2.2 获得播放的声音:

bool RCDAudioFrameObserver::onPlaybackAudioFrame(agora::media::IAudioFrameObserver::AudioFrame& audioFrame)

    2.2.3 获取录制和播放语音混音后的数据:

bool RCDAudioFrameObserver::onMixedAudioFrame(agora::media::IAudioFrameObserver::AudioFrame &audioFrame)

    2.2.4 获得单个用户播放的声音:

bool RCDAudioFrameObserver::onPlaybackAudioFrameBeforeMixing(unsigned int uid, agora::media::IAudioFrameObserver::AudioFrame& audioFrame)