想要快速搭建直播平台,最快的办法就是使用成品直播源码直接搭建直播平台,而在搭建过程中,美颜功能是必不可少的。

如上图所示,直播平台中使用的美颜主要有四大功能,分别是贴纸、美颜、特效和哈哈镜:
1.贴纸是给人脸上添加一些面具等装饰效果,分为基础和高级大类
2.美颜是调整人脸的美白,磨皮,红润,大眼,瘦脸,瘦鼻,额头等形状位置,从而美化面部特征,以及添加多种滤镜
3.特效里面包括一些动态特效,例如各种抖动效果,以及添加水印的功能。
4.哈哈镜则是让人脸像哈哈镜一样进行各种夸张的变化,增加趣味性。这个功能是依托于人脸识别来实现的。

快速搭建直播平台,接入美颜功能的部分代码如下:

public class MhDataManager {private static MhDataManager sInstance;
private MHBeautyManager mMhManager;
private MeiYanValueBean mInputValue;
private MeiYanValueBean mUseValue;
private MeiYanValueBean mMeiYanValue;
private MeiYanValueBean mOneKeyValue;
private IBeautyEffectListener mMeiYanChangedListener;
private String mStickerName;//贴纸
private int mSpeciallyName = MHSDK.SPECIAL_NONE;//特效
private int mFilterId = MHSDK.FILTER_NONE;//滤镜
private int mWaterBitmapRes;//水印图片
private int mWaterAlignEnum = MHSDK.WATER_NONE;//水印位置
private int mDistortionName = MHSDK.HAHA_NONE;//哈哈镜private MhDataManager() {}public static MhDataManager getInstance() {if (sInstance == null) {synchronized (MhDataManager.class) {if (sInstance == null) {sInstance = new MhDataManager();}}}return sInstance;
}public MhDataManager init() {mInputValue = new MeiYanValueBean();mUseValue = null;mMeiYanValue = null;mOneKeyValue = null;mStickerName = null;mSpeciallyName = MHSDK.SPECIAL_NONE;mFilterId = MHSDK.FILTER_NONE;mWaterBitmapRes = 0;mWaterAlignEnum = MHSDK.WATER_NONE;mDistortionName = MHSDK.HAHA_NONE;releaseBeautyManager();return this;
}public void createBeautyManager() {if (mInputValue != null) {mInputValue.reset();} else {mInputValue = new MeiYanValueBean();}try {mMhManager = new MHBeautyManager(CommonAppContext.getInstance());} catch (Exception e) {mMhManager = null;e.printStackTrace();}
}public void setMeiYanChangedListener(IBeautyEffectListener meiYanChangedListener) {mMeiYanChangedListener = meiYanChangedListener;
}public void release() {mMeiYanChangedListener = null;mInputValue = null;mUseValue = null;mMeiYanValue = null;mOneKeyValue = null;mStickerName = null;mSpeciallyName = MHSDK.SPECIAL_NONE;mFilterId = MHSDK.FILTER_NONE;mWaterBitmapRes = 0;mWaterAlignEnum = MHSDK.WATER_NONE;mDistortionName = MHSDK.HAHA_NONE;releaseBeautyManager();
}public void releaseBeautyManager() {if (mMhManager != null) {try {mMhManager.destroy();} catch (Exception e) {e.printStackTrace();}}mMhManager = null;
}public int render(int texture, int width, int height) {if (mMhManager != null) {try {//    mMhSDKManager.setAsync(true); int faceScale = 4; int textureScale = 2; int align = 128; int newWidth = ((width * 4 + (align - 1)) & ~(align - 1)) / 4;int newHeight = ((height * 4 + (align - 1)) & ~(align - 1)) / 4;texture = mMhManager.render12(texture, newWidth, newHeight, faceScale, textureScale);} catch (Exception e) {e.printStackTrace();}}return texture;
}public void restoreBeautyValue() {notifyMeiYanChanged();notifyLiangDuChanged();if (!TextUtils.isEmpty(mStickerName)) {setTieZhi(mStickerName);}if (mFilterId != MHSDK.FILTER_NONE) {if (isUseMhFilter() && mMhManager != null) {mMhManager.setFilter(mFilterId);}}if (mSpeciallyName != MHSDK.SPECIAL_NONE) {setTeXiao(mSpeciallyName);}if (mWaterBitmapRes != 0 && mWaterAlignEnum != MHSDK.WATER_NONE) {setWater(mWaterBitmapRes, mWaterAlignEnum);}if (mDistortionName != MHSDK.HAHA_NONE) {setHaHa(mDistortionName);}
}public void saveBeautyValue() {if (mMeiYanValue != null) {CommonHttpUtil.setBeautyValue(JSON.toJSONString(mMeiYanValue));}
}public MeiYanValueBean getMeiYanValue() {return mMeiYanValue;
}public MeiYanValueBean getOneKeyValue() {return mOneKeyValue;
}public MhDataManager setMeiYanValue(MeiYanValueBean meiYanValue) {mMeiYanValue = meiYanValue;return this;
}public MhDataManager setOneKeyValue(MeiYanValueBean oneKeyValue) {mOneKeyValue = oneKeyValue;return this;
}public MhDataManager useMeiYan() {mUseValue = mMeiYanValue;return this;
}public MhDataManager useOneKey() {mUseValue = mOneKeyValue;return this;
}public void setMeiBai(int meiBai) {if (mMeiYanValue != null) {mMeiYanValue.setMeiBai(meiBai);}useMeiYan().notifyMeiYanChanged();
}public void setMoPi(int moPi) {if (mMeiYanValue != null) {mMeiYanValue.setMoPi(moPi);}useMeiYan().notifyMeiYanChanged();
}public void setHongRun(int hongRun) {if (mMeiYanValue != null) {mMeiYanValue.setHongRun(hongRun);}useMeiYan().notifyMeiYanChanged();
}public void setLiangDu(int liangDu) {if (mMeiYanValue != null) {mMeiYanValue.setLiangDu(liangDu);}useMeiYan().notifyLiangDuChanged();
}public void setDaYan(int daYan) {if (mMeiYanValue != null) {mMeiYanValue.setDaYan(daYan);}useMeiYan().notifyMeiYanChanged();
}public void setMeiMao(int meiMao) {if (mMeiYanValue != null) {mMeiYanValue.setMeiMao(meiMao);}useMeiYan().notifyMeiYanChanged();
}public void setYanJu(int yanJu) {if (mMeiYanValue != null) {mMeiYanValue.setYanJu(yanJu);}useMeiYan().notifyMeiYanChanged();
}public void setYanJiao(int yanJiao) {if (mMeiYanValue != null) {mMeiYanValue.setYanJiao(yanJiao);}useMeiYan().notifyMeiYanChanged();
}public void setShouLian(int shouLian) {if (mMeiYanValue != null) {mMeiYanValue.setShouLian(shouLian);}useMeiYan().notifyMeiYanChanged();
}public void setZuiXing(int zuiXing) {if (mMeiYanValue != null) {mMeiYanValue.setZuiXing(zuiXing);}useMeiYan().notifyMeiYanChanged();
}public void setShouBi(int shouBi) {if (mMeiYanValue != null) {mMeiYanValue.setShouBi(shouBi);}useMeiYan().notifyMeiYanChanged();
}public void setXiaBa(int xiaBa) {if (mMeiYanValue != null) {mMeiYanValue.setXiaBa(xiaBa);}useMeiYan().notifyMeiYanChanged();
}public void setETou(int ETou) {if (mMeiYanValue != null) {mMeiYanValue.setETou(ETou);}useMeiYan().notifyMeiYanChanged();
}public void setChangBi(int changBi) {if (mMeiYanValue != null) {mMeiYanValue.setChangBi(changBi);}useMeiYan().notifyMeiYanChanged();
}public void setXueLian(int xueLian) {if (mMeiYanValue != null) {mMeiYanValue.setXueLian(xueLian);}useMeiYan().notifyMeiYanChanged();
}public void setKaiYanJiao(int kaiYanJiao) {if (mMeiYanValue != null) {mMeiYanValue.setKaiYanJiao(kaiYanJiao);}useMeiYan().notifyMeiYanChanged();
}/*** 哈哈镜*/
public void setHaHa(int hahaName) {mDistortionName = hahaName;if (mMhManager != null) {mMhManager.setDistortionEffect(hahaName);}
}/*** 贴纸是否可用*/
public boolean isTieZhiEnable() {return mMeiYanChangedListener == null || mMeiYanChangedListener.isTieZhiEnable();
}/*** 贴纸*/
public void setTieZhi(String tieZhiName) {mStickerName = tieZhiName;if (mMhManager != null) {mMhManager.setSticker(tieZhiName);}
}/*** 水印*/
public void setWater(int bitmapRes, int position) {mWaterBitmapRes = bitmapRes;mWaterAlignEnum = position;if (mMhManager != null) {Bitmap bitmap = null;if (bitmapRes == 0) {bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8);} else {bitmap = BitmapFactory.decodeResource(CommonAppContext.getInstance().getResources(), bitmapRes);}mMhManager.setWaterMark(bitmap, position);}
}/*** 特效*/
public void setTeXiao(int teXiaoId) {mSpeciallyName = teXiaoId;if (mMhManager != null) {mMhManager.setSpeciallyEffect(teXiaoId);}
}/*** 是否使用用美狐的滤镜 true使用美狐滤镜,false不使用*/
public boolean isUseMhFilter() {return mMeiYanChangedListener == null || mMeiYanChangedListener.isUseMhFilter();
}/*** 滤镜*/
public void setFilter(MeiYanFilterBean bean) {if (isUseMhFilter()) {mFilterId = bean.getFilterRes();if (mMhManager != null) {mMhManager.setFilter(bean.getFilterRes());}} else {if (mMeiYanChangedListener != null) {mMeiYanChangedListener.onFilterChanged(bean.getName());}}}/*** 亮度数值发生变化*/
private void notifyLiangDuChanged() {if (mMhManager == null || mInputValue == null || mUseValue == null) {return;}if (mInputValue.getLiangDu() != mUseValue.getLiangDu()) {mInputValue.setLiangDu(mUseValue.getLiangDu());mMhManager.setBrightness(mUseValue.getLiangDu());}
}/*** 美颜美型数值发生变化*/
public void notifyMeiYanChanged() {if (mMhManager == null || mInputValue == null || mUseValue == null) {return;}MeiYanValueBean input = mInputValue;MeiYanValueBean use = mUseValue;if (mMeiYanChangedListener != null) {boolean meiBaiChanged = false;boolean moPiChanged = false;boolean hongRunChanged = false;if (input.getMeiBai() != use.getMeiBai()) {input.setMeiBai(use.getMeiBai());meiBaiChanged = true;}if (input.getMoPi() != use.getMoPi()) {input.setMoPi(use.getMoPi());moPiChanged = true;}if (input.getHongRun() != use.getHongRun()) {input.setHongRun(use.getHongRun());hongRunChanged = true;}mMeiYanChangedListener.onMeiYanChanged(input.getMeiBai(), meiBaiChanged, input.getMoPi(), moPiChanged, input.getHongRun(), hongRunChanged);} else {//美白if (input.getMeiBai() != use.getMeiBai()) {input.setMeiBai(use.getMeiBai());mMhManager.setSkinWhiting(input.getMeiBai());}//磨皮if (input.getMoPi() != use.getMoPi()) {input.setMoPi(use.getMoPi());mMhManager.setSkinSmooth(input.getMoPi());}//红润if (input.getHongRun() != use.getHongRun()) {input.setHongRun(use.getHongRun());mMhManager.setSkinTenderness(input.getHongRun());}}//大眼if (input.getDaYan() != use.getDaYan()) {input.setDaYan(use.getDaYan());mMhManager.setBigEye(input.getDaYan());}//眉毛if (input.getMeiMao() != use.getMeiMao()) {input.setMeiMao(use.getMeiMao());mMhManager.setEyeBrow(input.getMeiMao());}//眼距if (input.getYanJu() != use.getYanJu()) {input.setYanJu(use.getYanJu());mMhManager.setEyeLength(input.getYanJu());}//眼角if (input.getYanJiao() != use.getYanJiao()) {input.setYanJiao(use.getYanJiao());mMhManager.setEyeCorner(input.getYanJiao());}//瘦脸if (input.getShouLian() != use.getShouLian()) {input.setShouLian(use.getShouLian());mMhManager.setFaceLift(input.getShouLian());}//嘴型if (input.getZuiXing() != use.getZuiXing()) {input.setZuiXing(use.getZuiXing());mMhManager.setMouseLift(input.getZuiXing());}//瘦鼻if (input.getShouBi() != use.getShouBi()) {input.setShouBi(use.getShouBi());mMhManager.setNoseLift(input.getShouBi());}//下巴if (input.getXiaBa() != use.getXiaBa()) {input.setXiaBa(use.getXiaBa());mMhManager.setChinLift(input.getXiaBa());}//额头if (input.getETou() != use.getETou()) {input.setETou(use.getETou());mMhManager.setForeheadLift(input.getETou());}//长鼻if (input.getChangBi() != use.getChangBi()) {input.setChangBi(use.getChangBi());mMhManager.setLengthenNoseLift(input.getChangBi());}//削脸if (input.getXueLian() != use.getXueLian()) {input.setXueLian(use.getXueLian());mMhManager.setFaceShave(input.getXueLian());}//开眼角if (input.getKaiYanJiao() != use.getKaiYanJiao()) {input.setKaiYanJiao(use.getKaiYanJiao());mMhManager.setEyeAlat(input.getKaiYanJiao());}
}/*** 获取贴纸列表*/
public static void getTieZhiList(int id, final CommonCallback<String> commonCallback) {MHSDK.getTieZhiList(id, new MHSDK.TieZhiListCallback() {@Overridepublic void getTieZhiList(String data) {if (commonCallback != null) {commonCallback.callback(data);}}});
}/*** 下载贴纸*/
public static void downloadTieZhi(String tieZhiName, final CommonCallback<Boolean> commonCallback) {MHSDK.downloadSticker(tieZhiName, new MHSDK.TieZhiDownloadCallback() {@Overridepublic void tieZhiDownload(String tieZhiName, boolean success) {if (success) {if (commonCallback != null) {commonCallback.callback(true);}} else {if (commonCallback != null) {commonCallback.callback(false);}}}});}/*** 贴纸是否下载了*/
public static boolean isTieZhiDownloaded(String name) {return MHSDK.isTieZhiDownloaded(name);
}

这样就实现了美颜的功能,一般来说,在快速搭建直播平台的过程中,美颜功能是直接使用美颜SDK实现。

快速搭建直播平台教程,美颜SDK接入实现多种美颜特效相关推荐

  1. rmtp+nginx+ffmpeg快速搭建直播平台

    文章目录 快速搭建基于rmtp协议的直播平台 环境 准备 client端 server端 安装 server端 配置 Server端 运行 Server端 Client端 参考 快速搭建基于rmtp协 ...

  2. 如何从零开始搭建直播平台,从flash时代的rtmp到过渡期的flv和webrtc的未来以及简单聊聊webassmbly

    前言 在2020年12月flash正式落幕之后,流媒体领域是否有新的技术替代?有没有较为成熟的整体方案?市面上的直播/流媒体平台都在使用哪些方案?有没有通用又简单快速的搭建方案?不同的方案在行业内部也 ...

  3. 搭建直播平台中的美颜效果开源实现,从AI到美颜全流程讲解

    搭建直播平台中的美颜效果开源实现,从AI到美颜全流程讲解 美颜和短视频 美颜相关APP可以说是现在手机上的必备的软件,例如抖音,快手,拍出的"照骗"和视频不加美颜效果,估计没有人敢 ...

  4. 如何搭建直播平台?低延时连麦+人工智能让互动升级

    摘要: 通过集成阿里云直播SDK,用户可以轻松实现移动端.PC端的直播流推送.直播服务器接收到直播流,对流进行处理(转封装.转码等),并通过CDN进行分发.支持10万+路流输出,1000万+观众同时在 ...

  5. android美颜功能吗,Android美颜sdk接入之前需要知道这些知识吗

    原标题:Android美颜sdk接入之前需要知道这些知识吗 既然是美颜sdk,那么肯定会涉及到图像方面的技术或算法.像是直播或短视频这类应用场景,他们在接入Android美颜sdk之前都会根据各自情况 ...

  6. 怎么搭建直播平台,直播环境搭建该怎样做?

    怎么搭建直播平台,直播环境搭建该怎样做? 目录 环境准备 ●Centos系统安装:请查看我的另一篇博客Java后端之路(六)安装Linux系统 ●git安装(系统如果没有的话):www.cnblogs ...

  7. 搭建直播平台,你需要先知道这些

    搭建直播平台,你需要先知道这些 一.直播知识小科普 一个典型的直播流程:录制->编码->网络传输(推流->服务器处理->CDN分发)->解码->播放 IPB:一种常 ...

  8. 如何搭建直播平台?直播平台搭建需要注意什么?...

    过去的一年成为了直播行业的分水岭,头部直播平台已然占有了市场上绝大多数的用户流量,直播行业进入了真正意义上的平稳发展时期.而面对垂直细分领域的用户流量,很多人还是想要尝试搭建直播平台进行运营的.那么, ...

  9. 搭建直播平台中主播pk,如何实现无缝切换?

    搭建直播平台中主播pk,如何实现无缝切换? 今天要介绍的就是主播连麦PK方案,通过这篇文章,我们将一起来了解什么是主播连麦PK?以及怎么快速实现主播间的连麦PK? 什么是连麦PK? 连麦PK就是正在直 ...

最新文章

  1. alpine linux 简介(面向安全应用的发行版)apk
  2. 4kyu N linear
  3. CSS中display:block、inline、inline-block
  4. 使用SpringMVC 的MultipartFile文件上传时参数获取的一个坑
  5. JVM之类加载器ClassLoader
  6. 使用了SAP Spartacus的一个在线网站:乐高Storefront
  7. Java中的策略设计模式-示例教程
  8. LeetCode 2055. 蜡烛之间的盘子(前缀和)
  9. php_steam,Steam 帐户使用 - Steam Support
  10. 防范ARP网关欺骗, ip mac双向绑定脚本
  11. 如何安装biopython_Biopython安装
  12. 记录一下idea启动显示If you already have a 64-bit JDK installed ,defined a JAVA_HOME...的错误
  13. Javascript 入门级 编写简单的音乐播放器
  14. Win10系统下如何有效的关闭易升(系统自动更新)
  15. 计算三维空间中直线和三角形的交点
  16. Scratch滚动的天空(1)
  17. matlab光学原理仿真应用衍射,基于Matlab的光学衍射仿真【参考】.doc
  18. Eigen 对矩阵的每个元素取绝对值
  19. 网 络 世 界 的 黑 暗 面
  20. 【无标题】西门子S7-200SMART四种密码解密软件

热门文章

  1. API对接网关 code review
  2. 情理之中 - Macs do Windows
  3. SE5004L-R 功率检测器的5 GHz,26dBm功率放大器
  4. 计算机网络总是正在识别网络,win7系统连接宽带一直显示“正在识别”的解决方法...
  5. TensorFlow入门教程(1)安装、基础、Tensorboard
  6. 测试未来老公的样子软件,你的未来老公是哪一型?
  7. 各大网站软件提交入口 |软件发布
  8. Post-doc positions 新年的一波优质职位
  9. arcgis中如何导出奥维可识别的图_如何将地图及奥维对象导出成图片 | 奥维互动地图浏览器...
  10. 如何成为一名合格的数据架构师?