【经验分享】简述自采集+美颜+案例分析

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

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

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

一、自采集接口

1、 MediaIO 接口

setVideoSource(IVideoSource source)

实时通讯过程中,Agora SDK 通常会启动默认的视频输入设备,即内置的摄像头,进行视频推流。当需要自定义视频设备时,App 可以先通过 IVideoSource 接口自定义视频源,然后调用该方法将自定义的视频源加入到 SDK 中。

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

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

consumer的传输方法:

consumeByteBufferFrame、consumeByteArrayFrame、consumeTextureFrame

调用示例:

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

2、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); 

这里需要特别注意两点,

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

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

两个自采集接口对比:

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

二、本地视图渲染显示

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

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

三、案例分析

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

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

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

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

(1)花屏现象

image2019-3-26_18-52-36

花屏问题一般是视频格式的问题。

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

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

3、如果上面方式排除了还存在问题,可收集下信息,比如是否是单机出现、SDK本身影响的问题、出现的条件以及dump。

(2)绿屏

image2019-3-27_10-40-12

绿屏问题一般是分辨率出现问题。

可检查下,

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

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

3、如还存在问题,可收集下信息,比如是否是单机出现、SDK本身影响的问题、出现的条件以及dump。

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

用户网络正常,所以 connection lost 是因为App卡住10s以上导致和服务端之间连接超时,根本原因是界面卡住。

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

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

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

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

结论:使用FaceUnity自采集和预览的情况下,用户不需要调用setupLocalVideo。如果用户通过这个API把Faceunity创建的本地预览视图设给SDK,会造成主界面卡住。

8赞