<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## **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; ????} ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看