直播软件搭建时如何在视频通话中加入美颜处理
直播软件搭建时如何在视频通话中加入美颜处理
部分开发者在基于 Agora SDK 做视频聊天应用时,希望可以在视频流发出前可以加入美颜处理。基于这样的需求,我们在 SDK 中提供了自采集视频源接口。在本文中,我们将讲解该接口的使用方法,并通过案例来分析一些常见问题。本文首发于由声网建立的RTC 开发者社区,如有疑问,请点击链接直接与作者询问。
自采集+美颜的处理流程如下:
如图,自采集时获取美颜处理数据前的部分一般建议是自己完成,用户只需要将美颜处理后的视频数据通过自采集接口传给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,会造成主界面卡住。
直播软件搭建时如何在视频通话中加入美颜处理相关推荐
- 视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化
视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化 最近我们在使用WebRTC进行直播推流的时候,遇到了音乐音质不好的问题,对此进行优化后,音乐音质有很大提升,因此记录下优化过程,分享出来 ...
- 直播软件搭建音视频开发中的视频采集
直播软件搭建音视频开发中的视频采集 前言 在直播和短视频行业日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的 ...
- 在直播软件搭建中,如何基于rtmp实现视频直播?
最近几年直播软件搭建可谓大火,这也就导致了在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等.本文要讲解的是在直播软件搭建中,如何基于rtmp实现视频直 ...
- Android直播软件搭建中实用的录制编辑方案有哪些
Android直播软件搭建中实用的录制编辑方案有哪些 经大量数据显示,直播已经发展成为一种全民参与.共享和生产的文化现象.它的火爆不仅丰富了大众的艺术审美水平和精神文化,而且也影响了一代人的世界观.人 ...
- Android直播软件搭建左滑右滑清屏控件
Android直播软件搭建左滑右滑清屏控件 最近在迭代直播软件搭建功能时,项目中之前的左滑清屏是用ViewPager实现的.这次迭代遇到一个布局层次导致的点击失效问题,继续用ViewPager的话改动 ...
- 直播软件搭建技术原理:CDN 与直播
直播软件搭建技术原理:CDN 与直播 很多直播都是基于 CDN 来实现的.而通过声网的服务,或基于声网SDK与 CDN 结合,还可以实现在直播中的连麦互动.白板同步等强调实时性的场景.本文源自社区投稿 ...
- 直播软件搭建直播服务架构
直播软件搭建直播服务架构 前言 随着移动设备的普及和4G网络建设的全面铺开,短视频和直播行业日益火爆,其代表应用抖音.头条更是火遍大江南北,逐渐成为家喻户晓的国民APP.各大厂商也纷纷入局短视频赛道, ...
- 直播软件搭建Android音视频方向进阶路线及资源合集
直播软件搭建Android音视频方向进阶路线及资源合集 直播软件搭建的音视频从采集到播放都经历了哪些流程呢:: 通过上面的图,我们简单的把音视频方向分为主要的两块: 媒体部分(蓝色+绿色) 传输部分( ...
- 优质在线直播源码进行直播间搭建时需要它的“帮助”才行
在直播间搭建这方面,可能绝大多数人都存在疑惑:是不是找一开发公司购买一套优质的在线直播源码就可以了?其实源码对于开发来说,确确实实是非常重要的,而且也是最基础的一部分.但是在此基础之上,还需要更多技术 ...
- 手机直播app制作时怎样在iOS中实现富文本
我们在观看直播时,经常会看到有的主播房间名字下面带有话题小标签,比如#搞笑的一天##悲伤的瞬间##双十一买了点啥#等,虽然看起来是很小的一个功能,但是在进行手机直播app制作时,在iOS中通过富文本的 ...
最新文章
- Linux内核中关于定时器Timer的应用
- Hibernate基础学习2
- 实践hibernate的应用——struts2+hibernate的简单学生信息管理
- VTK:InfoVis之MutableGraphHelper
- 同样学软件测试,为什么有些人一面试就拿一堆大厂offer?
- Java 多线程 简单实例 (Thread)
- numpy的广播机制
- VScode+Latex:代码和pdf互相跳转
- Spring核心--容器详解
- Premiere银色金属玻璃质感logo标志片头AE模板mogrt
- SNIFFER(嗅探器)基础知识
- java+SpringBoot+HTML+Mysq基于微信小程序的大咖读书系统的设计与实现
- app store 注册账号生成证书上传app完整的教程
- [已解决]“TypeError: Cannot read property ‘xxx‘ of undefined“报错情况分析
- 有效监控的 10 条基本原则
- 什么是期权?如何从概念上理解看涨期权/看跌期权?
- ORA-01578: ORACLE 数据块损坏 之奇妙处理 DBV
- 快速构建后台管理系统-GUNS学习系列之guns-lite-代码生成工具
- 3、STM32F103建工程
- cad怎么导出为图片?转换渠道选择
热门文章
- 以防遗忘001_通过斜率求垂直线段的端点,附Unity(UI image)画线
- 一文读懂LiveData 粘性事件
- MongoDB数据库重命名
- 使用pathogen管理Vim插件并托管到Github 参照文章【1】【2】的办法,将vim打造成一个Python开发环境。文章中使用的是 pathogen + git 来管理 Vim 插件的。对这种
- PicoNeo3开发VR项目
- Power BI 学习六:报表中视觉对象元素
- 【计算机科学速成课】[40集全/文字版] - 17.集成电路摩尔定律
- 浪漫七夕—很幸运一路有你
- 什么是云中台系统_“生于云中”的优势是真实的,但不是绝对的
- oracle delete加并发,并发delete导致oracle***锁问题的解决