💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**1.初始化MHSDK** **找到****ZegoApplication****.java文件,初始化SDK** ```      MHSDK.getInstance().init(this," "); ``` **2.初始化即构滤镜接口** **找到****VideoCommunicationMainUI****.java文件,新增变量如下:** ``` public static VideoFilterFactoryDemo filterFactory; ``` **在****onCreate****初始化ZegoSDK设置自定义滤镜。** ``` filterFactory = new VideoFilterFactoryDemo(FilterType_HybridMem, null); ZegoExternalVideoFilter.setVideoFilterFactory(filterFactory, ZegoConstants.PublishChannelIndex.MAIN); ``` **3.初始化美颜界面** **找到****PublishStreamAndPlayStreamUI****.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.setVisibleListener(visible -> {             if (!visible) {                 beautyViewHolder.show();             }         });         mhBeautyManager = new MHBeautyManager(this,true);         beautyViewHolder.setMhBeautyManager(mhBeautyManager);         VideoCommunicationMainUI.filterFactory.setMHBeautyManager(mhBeautyManager);     }     @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);         }     }     static class DiaLogListener implements DialogInterface.OnClickListener {         WeakReference activityWeakReference;         DiaLogListener(PublishStreamAndPlayStreamUI activity) {             this.activityWeakReference = new WeakReference<>(activity);         }         @Override         public void onClick(DialogInterface dialog, int which) {             PublishStreamAndPlayStreamUI 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(PublishStreamAndPlayStreamUI activity) {             this.activityWeakReference = new WeakReference<>(activity);         }         @Override         public void onClick(DialogInterface dialog, int which) {             PublishStreamAndPlayStreamUI 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(PublishStreamAndPlayStreamUI PublishStreamAndPlayStreamUI) {             this.mainActivityWeakReference = new WeakReference<>(PublishStreamAndPlayStreamUI);         }         @Override         public void run() {             while (mainActivityWeakReference.get()!= null && !MHSDK.getInstance().isVerEnd()) {                 if (isInterrupted()) return;                 try {                     Thread.sleep(200);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }             PublishStreamAndPlayStreamUI 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();     } ``` **在****onCreate****里调用****initBeautyView()****方法** **4.实现滤镜接口** **找到****VideoFilterFactoryDemo****.java文件,添加以下方法** ``` public void setMHBeautyManager(MHBeautyManager mhBeautyManager){     mFunRender = mhBeautyManager;     ((VideoFilterHybridDemo)mFilter).setMHBeautyManager(mhBeautyManager); } ``` **找到****VideoFilterHybridDemo****.java文件,找到****queueInputBuffer****方法,添加以下代码** ``` int textureID = mTextureId; if(mMHBeautyManager!=null){     textureID = mMHBeautyManager.render6(mTextureId, pixelBuffer.width, pixelBuffer.height); } // 此步骤会使用此 textureID 用做本地预览的视图渲染,并将美颜后的 textureID 传给 SDK(拉该条流时是美颜后的视频) mClient.onProcessCallback(textureID, pixelBuffer.width, pixelBuffer.height, pixelBuffer.timestamp_100n); ```