直播间源码在开发中如何在视频通话中加入美颜处理
自采集+美颜的处理流程如下:
如图,自采集时获取美颜处理数据前的部分一般建议是自己完成,用户只需要将美颜处理后的视频数据通过自采集接口传给Agora SDK。
本地视图显示,不做具体要求,可用户自己实现;也可使用MediaIO 中的 IVideoSink 接口来自定义渲染器,通过 setLocalVideoRenderer来显示 。
1、 MediaIO 接口
setVideoSource(IVideoSource source)
实时通讯过程中,Agora SDK 通常会启动默认的视频输入设备,即内置的摄像头,进行视频推流。当需要自定义视频设备时,App 可以先通过 IVideoSource 接口自定义视频源,然后调用该方法将自定义的视频源加入到 SDK 中。
即通过IVideoSource中
的onInitiali获取一个IVideoFrameConsumer
的consumer
对象;然后通过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)花屏现象
直播间源码
花屏问题一般是视频格式的问题。
1、若本地预览正常,远端花屏。一般出在传给Mediaio/push
的数据格式处,传给我们的数据与采集处理后数据格式不一致导致的,这里可以在Mediaio/push
处将视频数据dump下来看是否正常;
2、若本地预览花屏,远端正常。如自采集流程图所示,一般是采集数据格式和本地视图渲染的数据不一致导致的;
3、如果上面方式排除了还存在问题,可收集下信息,比如是否是单机出现、SDK本身影响的问题、出现的条件以及dump。
(2)绿屏
直播间源码
绿屏问题一般是分辨率出现问题。
可检查下,
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,会造成主界面卡住。
直播间源码
本文转载自网络,感谢(声网Agora)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理