部分开发者在基于 Agora SDK 作视频聊天应用时,但愿能够在视频流发出前能够加入美颜处理。基于这样的需求,咱们在 SDK 中提供了自采集视频源接口。在本文中,咱们将讲解该接口的使用方法,并经过案例来分析一些常见问题。本文首发于由声网创建的RTC 开发者社区,若有疑问,请点击连接直接与做者询问。html
自采集+美颜的处理流程以下:java
本地视图显示,不作具体要求,可用户本身实现;也可以使用MediaIO 中的 IVideoSink 接口来自定义渲染器,经过 setLocalVideoRenderer来显示 。canvas
一、 MediaIO 接口
setVideoSource(IVideoSource source)
网络
实时通信过程当中,Agora SDK 一般会启动默认的视频输入设备,即内置的摄像头,进行视频推流。当须要自定义视频设备时,App 能够先经过 IVideoSource 接口自定义视频源,而后调用该方法将自定义的视频源加入到 SDK 中。ide
即经过IVideoSource中
的onInitiali获取一个IVideoFrameConsumer
的consumer
对象;而后经过consumer
给SDK传送视频数据。布局
其中,consumer支持接收三种 Buffer 类型的视频帧数据:ByteBuffer、ByteArray 和 Texture。请调用 getBufferType 方法指定 Buffer 类型。spa
consumer
的传输方法:3d
consumeByteBufferFrame、consumeByteArrayFrame、consumeTextureFrame
code
调用示例: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());)。
如上流程图,自采集时本地视图显示不在咱们SDK传输的范围内的。所以本地视图显示,不作具体要求,可本身实现;也可以使用MediaIO
中的 IVideoSink
接口来自定义渲染器,经过setLocalVideoRenderer
来显示
注:自采集须要自渲染,这里不要使用setupLocalVideo
(SDK采集时的)去作本地视图显示。
对于接入美颜时出现的问题,总的排查思路是:看出问题的是本地仍是远端。
一、若本地正常远端异常,排查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,会形成主界面卡住。