使用声网 Agora SDK时,如何在视频通话中加入美颜处理

部分开发者在基于 Agora SDK 作视频聊天应用时,但愿能够在视频流发出前能够加入美颜处理。基于这样的需求,咱们在 SDK 中提供了自采集视频源接口。在本文中,咱们将讲解该接口的使用方法,并经过案例来分析一些常见问题。本文首发于由声网创建的RTC 开发者社区,若有疑问,请点击连接直接与做者询问。html

自采集+美颜的处理流程以下:java

如图,自采集时获取美颜处理数据前的部分通常建议是本身完成,用户只须要将美颜处理后的视频数据经过自采集接口传给Agora SDK。

本地视图显示,不作具体要求,可用户本身实现;也可以使用MediaIO 中的 IVideoSink 接口来自定义渲染器,经过 setLocalVideoRenderer来显示 canvas

1、自采集接口

一、 MediaIO 接口

setVideoSource(IVideoSource source)网络

实时通信过程当中,Agora SDK 一般会启动默认的视频输入设备,即内置的摄像头,进行视频推流。当须要自定义视频设备时,App 能够先经过 IVideoSource 接口自定义视频源,而后调用该方法将自定义的视频源加入到 SDK 中。ide

即经过IVideoSource中的onInitiali获取一个IVideoFrameConsumerconsumer对象;而后经过consumer给SDK传送视频数据。布局

其中,consumer支持接收三种 Buffer 类型的视频帧数据:ByteBuffer、ByteArray 和 Texture。请调用 getBufferType 方法指定 Buffer 类型。spa

consumer的传输方法:3d

consumeByteBufferFrame、consumeByteArrayFrame、consumeTextureFramecode

调用示例:orm

mConsumer.consumeByteArrayFrame(data, AgoraVideoFrame.NV21, width, height, rotation, timestamp);

二、push接口

pushExternalVideoFrame( AgoraVideoFrame frame )

该方法主动将视频帧数据用 AgoraVideoFrame 类封装后传递给 SDK。请确保在你调用本方法前已调用 setExternalVideoSource,并将参数 pushMode 设为 true,否则调用本方法后会一直报错。

这里是直接将视频数据经过pushExternalVideoFrame直接传给SDK。

调用示例:

vf.format = AgoraVideoFrame.FORMAT_TEXTURE_2D;
  vf.timeStamp = System.currentTimeMillis();
  vf.stride = 480;
  vf.height = 640;
  vf.textureID = fuTexId;
  vf.syncMode = true;
  vf.eglContext11 = eglContext;
  vf.transform = matrix;
  boolean result = mRtcEngine.pushExternalVideoFrame(vf); 
复制代码

这里须要特别注意两点,

一、timeStamp必须传当前系统的时间戳System.currentTimeMillis()

二、通讯模式下,push不支持texture;如使用了,远端会显示黑屏。

两个自采集接口对比:

推荐使用MediaIo接口。相对于push接口,MediaIo配置灵活,支持的视频格式更全,支持频道内动态切换自采集/sdk采集(setVideoSource(new AgoraDefaultSource());)。

2、本地视图渲染显示

如上流程图,自采集时本地视图显示不在咱们SDK传输的范围内的。所以本地视图显示,不作具体要求,可本身实现;也可以使用MediaIO 中的 IVideoSink 接口来自定义渲染器,经过setLocalVideoRenderer来显示

注:自采集须要自渲染,这里不要使用setupLocalVideo(SDK采集时的)去作本地视图显示。

3、案例分析

对于接入美颜时出现的问题,总的排查思路是:看出问题的是本地仍是远端。

一、若本地正常远端异常,排查Mediaio/push的数据格式处;

二、若本地异常远端正常,排查本地渲染;

三、若是本地远端都异常,先排查本地预览和第三方美颜的渲染处理,而后排查Mediaio/push的处理。

(1)花屏现象

花屏问题通常是视频格式的问题。

一、若本地预览正常,远端花屏。通常出在传给Mediaio/push的数据格式处,传给咱们的数据与采集处理后数据格式不一致致使的,这里能够在Mediaio/push处将视频数据dump下来看是否正常;

二、若本地预览花屏,远端正常。如自采集流程图所示,通常是采集数据格式和本地视图渲染的数据不一致致使的;

三、若是上面方式排除了还存在问题,可收集下信息,好比是不是单机出现、SDK自己影响的问题、出现的条件以及dump。

(2)绿屏

绿屏问题通常是分辨率出现问题。

可检查下,

一、采集视频数据的分辨率和Mediaio/push处的宽高是否一致;

二、传给Mediaio/push处的视频数据是正常,不为空;

三、如还存在问题,可收集下信息,好比是不是单机出现、SDK自己影响的问题、出现的条件以及dump。

(3)加频道后界面卡住,最后收到SDK connection lost 事件(注:该案例为gongyuhua 分享 )

用户网络正常,因此 connection lost 是由于App卡住10s以上致使和服务端之间链接超时,根本缘由是界面卡住。

用户表示注释掉一个方法后就没这个现象,检查发现这个方法里大部分是声网SDK的初始化、设置和加频道。

检查其中非声网的调用,发现有开启自采集和布局界面的方法。

引导用户只注释开启自采集的方法,现象消失。继续调查这个自采集方法,发现是使用FaceUnity自带的采集和渲染。

继续注释关键代码,定位到关键调用是把一个glView设给canvas。调查这个glView发现是FaceUnity建立的本地预览视图。

结论:使用FaceUnity自采集和预览的状况下,用户不须要调用setupLocalVideo。若是用户经过这个API把Faceunity建立的本地预览视图设给SDK,会形成主界面卡住。

相关文章
相关标签/搜索