## **1****.腾讯移动直播**
注:以下文档针对腾讯6.5版本,如果需要适配6.5以上版本详细看本节结尾说明。
1.初始化MHSDK
**找到LpApplication.java文件,初始化SDK**
MHSDK.getInstance().init(this," ");
2.初始化美颜界面
注意添加自定义渲染的监听
mLivePusher.setVideoProcessListener(this);
**找到TxMainActivity.java文件****,****实现****DefaultBeautyEffectListener****接口****,****添加以下变量****:**
```
private Handler mHandler;
private AlertDialog dialog;
private RelativeLayout beautyContainer;
private MHBeautyManager mhBeautyManager;
private BaseBeautyViewHolder beautyViewHolder;
private boolean isResume;
private int retryCount;
private Thread beautyThread;
```
**添加以下方法**
```
private void initBeautyView() {
beautyContainer = findViewById(R.id.beauty_view_container);
mHandler = new Handler(getMainLooper());
if (MHSDK.getInstance().isVerEnd()){
setBeautyView();
}else {
if (beautyThread != null) {
beautyThread.interrupt();
beautyThread = null;
}
beautyThread = new BeautyThread(this);
beautyThread.start();
}
}
private void setBeautyView(){
LogManager.getInstance().writeData("MainActivity_setBeautyView_SDKVersion=" + MHSDK.getInstance().getVer());
if (!MHSDK.getInstance().isVerifyAccess()){
if (retryCount < 10) {
showRetryDialog();
}else {
showExitDialog();
return;
}
}
if (beautyViewHolder != null) {
beautyViewHolder.release();
beautyViewHolder = null;
}
beautyViewHolder = BeautyViewHolderFactory.getBeautyViewHolder(getApplicationContext(), beautyContainer);
beautyViewHolder.show();
beautyViewHolder.setEffectListener(this);
beautyViewHolder.setCameraClickListener(this);
beautyViewHolder.setVisibleListener(visible -> {
if (!visible) {
beautyViewHolder.show();
}
});
}
private void initMHBeautyManager(){
if (mhBeautyManager == null) {
mhBeautyManager = new MHBeautyManager(this,true); mhBeautyManager.setBeautyDataModel(BeautyDataModel.getInstance());
if (beautyViewHolder != null) {
beautyViewHolder.setMhBeautyManager(mhBeautyManager);
}
}
}
@Override
protected void onResume() {
super.onResume();
initMHBeautyManager();
Log.d("meihu_beauty", "TxMainActivity--onResume");
}
static class DiaLogListener implements DialogInterface.OnClickListener {
WeakReference activityWeakReference;
DiaLogListener(TxMainActivity activity) {
this.activityWeakReference = new WeakReference<>(activity);
}
@Override
public void onClick(DialogInterface dialog, int which) {
TxMainActivity activity = activityWeakReference.get();
if (activity == null)return;
switch (which){
case -1:
dialog.cancel();
activity.finish();
break;
case -2:
dialog.cancel();
break;
}
}
}
static class SDKDialogListener implements DialogInterface.OnClickListener {
WeakReference activityWeakReference;
SDKDialogListener(TxMainActivity activity) {
this.activityWeakReference = new WeakReference<>(activity);
}
@Override
public void onClick(DialogInterface dialog, int which) {
TxMainActivity activity = activityWeakReference.get();
if (activity == null)return;
switch (which){
case -1:
activity.retryCount ++;
MHSDK.getInstance().clearVerNote();
MHSDK.getInstance().verify("");
activity.initBeautyView();
dialog.cancel();
// System.exit(0);
break;
case -2:
dialog.cancel();
break;
}
}
}
//由于demo进入应用直接进入美颜界面,为了防止授权校验未完成而一直显示标准版界面,需要等授权校验完成后初始化对应的美颜界面(延迟1秒或者按下面处理)
static class BeautyThread extends Thread {
WeakReference mainActivityWeakReference;
BeautyThread(TxMainActivity txMainActivity) {
this.mainActivityWeakReference = new WeakReference<>(txMainActivity);
}
@Override
public void run() {
while (mainActivityWeakReference.get()!= null && !MHSDK.getInstance().isVerEnd()) {
if (isInterrupted()) return;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
TxMainActivity activity = mainActivityWeakReference.get();
if (activity != null){
activity.mHandler.post(activity::setBeautyView);
}
}
}
private void showRetryDialog() {
if (dialog != null) {
dialog.cancel();
}
SDKDialogListener diaLogListener = new SDKDialogListener(this);
dialog = new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("资源获取失败,请检查网络")
.setCancelable(false)
.setPositiveButton("确定", diaLogListener)
.create();
dialog.show();
}
private void showExitDialog() {
if (dialog != null) {
dialog.cancel();
}
DiaLogListener diaLogListener = new DiaLogListener(this);
dialog = new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("资源获取失败,请检查网络并退出重试")
.setCancelable(false)
.setPositiveButton("确定", diaLogListener)
.create();
dialog.show();
}
@Override
public void onFilterChanged(FilterBean filterBean) {
if (mhBeautyManager == null) {
return;
}
FilterEnum filterEnum = filterBean.getFilterEnum();
if (filterEnum == FilterEnum.PRO_FILTER) {
mhBeautyManager.changeDynamicFilter(filterBean.getmFilterName());
} else {
Bitmap lookupBitmap = BitmapUtil.getFilterBitmap(this,filterEnum);
mhBeautyManager.setFilter(lookupBitmap);
}
}
@Override
public void onMeiBaiChanged(int progress) {
if (mhBeautyManager != null) {
mhBeautyManager.setSkinWhiting(progress);
}
}
@Override
public void onMoPiChanged(int progress) {
if (mhBeautyManager != null) {
mhBeautyManager.setSkinSmooth(progress);
}
}
@Override
public void onFengNenChanged(int progress) {
if (mhBeautyManager != null) {
mhBeautyManager.setSkinTenderness(progress);
}
}
@Override
public void onBeautyOrigin() {
if (mhBeautyManager != null) {
mhBeautyManager.setSkinWhiting(0);
mhBeautyManager.setSkinSmooth(0);
mhBeautyManager.setSkinTenderness(0);
}
}
```
**在****onCreate****里调用****initBeautyView()****方法**
**在布局文件中添加美颜UI**
```
<RelativeLayout
android:id="@+id/beauty_view_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
```
3.自定义渲染
实现TXLivePusher.VideoCustomProcessListener接口,利用livePusher.setVideoProcessListener(this);//设置回调。
```
@Override
public int onTextureCustomProcess(int texture, int width, int height) {
int textureId = texture;
try {
if (mhBeautyManager == null) {
return textureId;
}
long st = System.currentTimeMillis();
int faceScale = 4; //人脸识别对纹理的缩小倍数
int textureScale = 2;//图像渲染对纹理的缩小倍数
if (mDeviceLevel == DEVICE_LEVEL_HIGH) {
textureScale = 1;
}
int align = 128;
int newWidth = ((width * 4 + (align - 1)) & ~(align - 1))/4;
int newHeight = ((height * 4 + (align - 1)) & ~(align - 1))/4;
textureId = mhBeautyManager.render12(texture, newWidth, newHeight,faceScale,textureScale);
long et = System.currentTimeMillis();
// Log.e(TAG, "onTextureCustomProcess: ---->" + (et - st));
} catch (Exception e) {
e.printStackTrace();
}
return textureId;
}
@Override
public void onDetectFacePoints(float[] floats) {
}
@Override
public void onTextureDestoryed() {
if (mhBeautyManager != null) {
mhBeautyManager.destroy();
mhBeautyManager = null;
}
}
```
说明:
1.如果出现贴纸资源不能下载的情况, 请在AndroidManifest.xml文件的application节点添加 android:usesCleartextTraffic="true"属性。
2.如果使用腾讯SDK6.5(不包含6.5)以上的版本,需要更改纹理的缩小参数,修改方式如下
```
textureId = mhBeautyManager.render12(texture, width, height,faceScale,textureScale);
```
其中第4个参数为人脸识别输入对纹理的缩小倍数,第5个参数为自定义渲染图像的缩小倍数。
如:当腾讯SDK返回的纹理大小为1080x1905,第4个参数为4时,人脸识别输入的纹理大小为原来的1/4, 大小为270x476。第5个参数为2时,自定义渲染的图像为原来的1/2,即540x952。具体还可以根据卡顿和清晰度情况来设置第4个和第5个参数。
3. 如果使用腾讯SDK6.5(不包含6.5)以上的版本,还可以根据手机性能来实现对纹理的缩小和适配。相关代码如下:
重写onTextureCustomProcess方法:
```
@Override
public int onTextureCustomProcess(int texture, int width, int height) {
int textureId = texture;
try {
if (mhBeautyManager == null) {
return textureId;
}
long st = System.currentTimeMillis();
int faceScale = 4; //人脸识别对纹理的缩小倍数
int textureScale = 2;//图像渲染对纹理的缩小倍数
if (mDeviceLevel == DEVICE_LEVEL_HIGH) {
textureScale = 1;
}
int align = 128;
int newWidth = ((width * 4 + (align - 1)) & ~(align - 1))/4;
int newHeight = ((height * 4 + (align - 1)) & ~(align - 1))/4;
textureId = mhBeautyManager.render12(texture, newWidth, newHeight,faceScale,textureScale);
long et = System.currentTimeMillis();
// Log.e(TAG, "onTextureCustomProcess: ---->" + (et - st));
} catch (Exception e) {
e.printStackTrace();
}
return textureId;
}
```
- 一、产品简介
- 1.功能说明
- 2.平台支持
- 3.官方链接
- 二、集成指引
- android集成指引
- 1.概述
- 2.接入说明
- 3.详细步骤
- 4.使用步骤
- 1.腾讯移动直播
- 2.金山云直播
- 3.三体云直播
- 4.阿里云直播
- 5.七牛云直播
- 6.七牛短视频
- 7.Movieous短视频
- 8.即构直播
- 9.腾讯实时音视频
- 10.网易视频云
- 11.即构实时视频
- 12.融云视频通话
- 13.声网视频互动直播
- 14.声网视频通话
- 15.即构新版实时音视频
- 16.不同直播SDK设置基础美颜方式
- 5.新版美狐集成
- iOS集成指引
- 1.申请MH授权Key
- 2.检查SDK资源
- 3.配置工程
- 4.使用MHUI
- 5. 腾讯直播SDK美颜
- 6.TTT 直播SDK美颜
- 7.TTT 实时互动直播
- 8.金山直播SDK 美颜
- 9.七牛直播SDK 美颜
- 10.七牛短视频SDK 美颜
- 11.Movieous短视频
- 12.Zego(即构)直播SDK 美颜
- 13. Zego(即构)实时音视频SDK 美颜
- 14. 网易直播SDK美颜
- 15. 腾讯互动直播SDK美颜
- 16. 腾讯实时音视频
- 17.融云实时音视频
- 18.声网视频通话
- 19.声网直播
- 20. 腾讯短视频录制
- 21.阿里直播 SDK 美颜
- 22.阿里音视频
- 2.4.X版本安卓集成指引
- 1.详细步骤
- 2.云直播平台具体接入
- 1.腾讯移动直播
- 2.阿里云音视频
- 三、MHSDK美颜相关接口部分
- andorid美颜相关接口文档说明
- 美颜相关接口说明文档
- 设置滤镜
- 设置贴纸
- iOS美颜相关接口说明文档
- 1.初始化
- 2.美颜相关接口说明文档
- 3.美颜功能说明
- 四、常见问题
- android常见问题
- 1.认证失败原因
- 2.调用美型、贴纸、特效、哈哈镜没有效果
- 3.MHBeautyManager的特别声明
- 4.使用MHUI的注意事项
- 5.卡顿问题
- 6.闪退问题
- 7. 贴纸无法下载
- 8.andriodX(腾讯云)环境集成问题:
- 9.导入新的sdk出现乱码
- 10.弹出的UI有阴影效果
- 11.安卓10出现获取网络资源失败请检查网络
- 12.美狐可以记录设置的各种参数吗?
- 13.(七牛云)替换sdk画面上下颠倒
- 14.贴纸可以自定义吗
- 15.您这边可以短视频录制吗
- 16.MHSDK必须本地依赖吗
- 17.找不到某个方法
- 18.环信不显示自己的头像框
- 19.如何取消特效
- 20.水印没有找到
- 21.声网视频通话大小屏切换问题
- iOS常见问题
- 1.iOS认证失败原因
- 2.美颜无效果
- 3.贴纸下载失败
- 4.贴纸可下载,无效果
- 5. IPA processing failed/上架打包失败
- 6.存储美颜默认数据
- 7.如果遇到了Failed to create IOSurface image (texture)
- 8.opencv.framework冲突
- 五、联系方式