直播软件搭建时如何在视频通话中加入美颜处理

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

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

如图,自采集时获取美颜处理数据前的部分一般建议是自己完成,用户只需要将美颜处理后的视频数据通过自采集接口传给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)花屏现象

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

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,会造成主界面卡住。

直播软件搭建时如何在视频通话中加入美颜处理相关推荐

  1. 视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化

    视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化 最近我们在使用WebRTC进行直播推流的时候,遇到了音乐音质不好的问题,对此进行优化后,音乐音质有很大提升,因此记录下优化过程,分享出来 ...

  2. 直播软件搭建音视频开发中的视频采集

    直播软件搭建音视频开发中的视频采集 前言 在直播和短视频行业日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的 ...

  3. 在直播软件搭建中,如何基于rtmp实现视频直播?

    最近几年直播软件搭建可谓大火,这也就导致了在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等.本文要讲解的是在直播软件搭建中,如何基于rtmp实现视频直 ...

  4. Android直播软件搭建中实用的录制编辑方案有哪些

    Android直播软件搭建中实用的录制编辑方案有哪些 经大量数据显示,直播已经发展成为一种全民参与.共享和生产的文化现象.它的火爆不仅丰富了大众的艺术审美水平和精神文化,而且也影响了一代人的世界观.人 ...

  5. Android直播软件搭建左滑右滑清屏控件

    Android直播软件搭建左滑右滑清屏控件 最近在迭代直播软件搭建功能时,项目中之前的左滑清屏是用ViewPager实现的.这次迭代遇到一个布局层次导致的点击失效问题,继续用ViewPager的话改动 ...

  6. 直播软件搭建技术原理:CDN 与直播

    直播软件搭建技术原理:CDN 与直播 很多直播都是基于 CDN 来实现的.而通过声网的服务,或基于声网SDK与 CDN 结合,还可以实现在直播中的连麦互动.白板同步等强调实时性的场景.本文源自社区投稿 ...

  7. 直播软件搭建直播服务架构

    直播软件搭建直播服务架构 前言 随着移动设备的普及和4G网络建设的全面铺开,短视频和直播行业日益火爆,其代表应用抖音.头条更是火遍大江南北,逐渐成为家喻户晓的国民APP.各大厂商也纷纷入局短视频赛道, ...

  8. 直播软件搭建Android音视频方向进阶路线及资源合集

    直播软件搭建Android音视频方向进阶路线及资源合集 直播软件搭建的音视频从采集到播放都经历了哪些流程呢:: 通过上面的图,我们简单的把音视频方向分为主要的两块: 媒体部分(蓝色+绿色) 传输部分( ...

  9. 优质在线直播源码进行直播间搭建时需要它的“帮助”才行

    在直播间搭建这方面,可能绝大多数人都存在疑惑:是不是找一开发公司购买一套优质的在线直播源码就可以了?其实源码对于开发来说,确确实实是非常重要的,而且也是最基础的一部分.但是在此基础之上,还需要更多技术 ...

  10. 手机直播app制作时怎样在iOS中实现富文本

    我们在观看直播时,经常会看到有的主播房间名字下面带有话题小标签,比如#搞笑的一天##悲伤的瞬间##双十一买了点啥#等,虽然看起来是很小的一个功能,但是在进行手机直播app制作时,在iOS中通过富文本的 ...

最新文章

  1. Linux内核中关于定时器Timer的应用
  2. Hibernate基础学习2
  3. 实践hibernate的应用——struts2+hibernate的简单学生信息管理
  4. VTK:InfoVis之MutableGraphHelper
  5. 同样学软件测试,为什么有些人一面试就拿一堆大厂offer?
  6. Java 多线程 简单实例 (Thread)
  7. numpy的广播机制
  8. VScode+Latex:代码和pdf互相跳转
  9. Spring核心--容器详解
  10. Premiere银色金属玻璃质感logo标志片头AE模板mogrt
  11. SNIFFER(嗅探器)基础知识
  12. java+SpringBoot+HTML+Mysq基于微信小程序的大咖读书系统的设计与实现
  13. app store 注册账号生成证书上传app完整的教程
  14. [已解决]“TypeError: Cannot read property ‘xxx‘ of undefined“报错情况分析
  15. 有效监控的 10 条基本原则
  16. 什么是期权?如何从概念上理解看涨期权/看跌期权?
  17. ORA-01578: ORACLE 数据块损坏 之奇妙处理 DBV
  18. 快速构建后台管理系统-GUNS学习系列之guns-lite-代码生成工具
  19. 3、STM32F103建工程
  20. cad怎么导出为图片?转换渠道选择

热门文章

  1. 以防遗忘001_通过斜率求垂直线段的端点,附Unity(UI image)画线
  2. 一文读懂LiveData 粘性事件
  3. MongoDB数据库重命名
  4. 使用pathogen管理Vim插件并托管到Github 参照文章【1】【2】的办法,将vim打造成一个Python开发环境。文章中使用的是 pathogen + git 来管理 Vim 插件的。对这种
  5. PicoNeo3开发VR项目
  6. Power BI 学习六:报表中视觉对象元素
  7. 【计算机科学速成课】[40集全/文字版] - 17.集成电路摩尔定律
  8. 浪漫七夕—很幸运一路有你
  9. 什么是云中台系统_“生于云中”的优势是真实的,但不是绝对的
  10. oracle delete加并发,并发delete导致oracle***锁问题的解决