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

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

回答:

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

      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默认在此回调里绘制一个十字架,具体参考callkit的源码;


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)





    

我对此仍有疑问!继续追问