<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                MHBeautyManager 參數要始終保持一致,也就是傳入MHMeiyanMenusView和Zego的濾鏡類的參數是一樣的。 需要在下面的類中作如下修改。黑框中的部分為新加的,可以與即構的demo對比參考。(MHBeautyManager parameters should always be consistent, that is, the parameters of the filter class passed into MHMeiyanMenusView and Zego are the same.The following modifications need to be made in the following classes. The part in the black box is newly added, which can be compared with the instant demo for reference.) - ZGVideoFilterAsyncDemo.h ``` @property (nonatomic, strong) MHBeautyManager *beautyManager; ``` - ZGVideoFilterAsyncDemo.m ``` \- (void)queueInputBuffer:(CVPixelBufferRef)pixel\_buffer timestamp:(unsigned long long)timestamp\_100n { // \* 采集到的圖像數據通過這個傳進來,這個點需要異步處理 dispatch\_async(queue\_, ^ { int imageWidth = (int)CVPixelBufferGetWidth(pixel\_buffer); int imageHeight = (int)CVPixelBufferGetHeight(pixel\_buffer); int imageStride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixel\_buffer, 0); CVPixelBufferRef dst = \[self->buffer\_pool\_ dequeueInputBuffer:imageWidth height:imageHeight stride:imageStride\]; if (dst) { if(self.beautyManager){ \[self.beautyManager processZGWithPixelBuffer:pixel\_buffer\]; } CVPixelBufferRef output = pixel\_buffer; if (\[ZGImageUtils copyPixelBufferFrom:output to:dst\]) { // \* 把從 buffer pool 中得到的 CVPixelBuffer 實例傳進來 \[self->buffer\_pool\_ queueInputBuffer:dst timestamp:timestamp\_100n\]; } } self.pendingCount = self.pendingCount - 1; CVPixelBufferRelease(pixel\_buffer); }); } - ZGVideoFilterAsyncDemo.h @property (nonatomic, strong) MHBeautyManager \*beautyManager; - ZGVideoFilterFactoryDemo.m // 創建外部濾鏡實例 - (id<ZegoVideoFilter>)zego_create { if (g_filter_ == nil) { // 此處的 bufferType 對應四種濾鏡類型,以創建不同的外部濾鏡實例 switch (self.bufferType) { case ZegoVideoBufferTypeAsyncPixelBuffer: { g_filter_ = [[ZGVideoFilterAsyncDemo alloc] init]; ZGVideoFilterAsyncDemo* g_filter = (ZGVideoFilterAsyncDemo*)g_filter_; [g_filter setMHBeautyManager:self.beautyManager]; } break; case ZegoVideoBufferTypeSyncPixelBuffer: g_filter_ = [[ZGVideoFilterSyncDemo alloc] init]; break; case ZegoVideoBufferTypeAsyncI420PixelBuffer: g_filter_ = [[ZGVideoFilterI420Demo alloc] init]; break; case ZegoVideoBufferTypeAsyncNV12PixelBuffer: g_filter_ = [[ZGVideoFilterNV12Demo alloc] init]; break; default: break; } } return g_filter_; } ``` - ZGExternalVideoFilterDemo.h add method: ``` - (void)initFilterFactoryType:(ZegoVideoBufferType)type beautyManager:(MHBeautyManager*)beautyManager; ``` - ZGExternalVideoFilterDemo.m : ``` - (void)initFilterFactoryType:(ZegoVideoBufferType)type beautyManager:(MHBeautyManager*)beautyManager{ if (self.g_filterFactory == nil) { self.g_filterFactory = [[ZGVideoFilterFactoryDemo alloc] init]; self.g_filterFactory.bufferType = type; self.g_filterFactory.beautyManager = beautyManager; } [ZGApiManager releaseApi]; [ZegoExternalVideoFilter setVideoFilterFactory:self.g_filterFactory channelIndex:ZEGOAPI_CHN_MAIN]; } ``` - ZGVideoTalkLoginViewController - ViewDidLoad (Initial method) ZGExternalVideoFilterDemo: ``` self.demo = [[ZGExternalVideoFilterDemo alloc] init]; self.demo.delegate = self; [self.demo initFilterFactoryType:ZegoVideoBufferTypeAsyncPixelBuffer beautyManager:self.beautyManager]; ``` - ZGVideoTalkViewController是實現視頻通話的功能,將ZGVideoTalkLoginViewControlle初始化的beautyManager作為參數傳入(ZGVideoTalkViewController is to realize the function of video call. Pass in the initialized beautyManager in the previous step as a parameter)。 ``` ZGVideoTalkViewController *vc = [sb instantiateViewControllerWithIdentifier:NSStringFromClass([ZGVideoTalkViewController class])]; vc.roomID = roomID; vc.videoTalkDemo = self.videoTalkDemo; vc.beautyManager = self.beautyManager; ``` ZGVideoTalkViewController.h ``` @property (nonatomic, strong) MHBeautyManager *beautyManager; ``` ZGVideoTalkViewController .m ,并將傳入的beautyManager傳入MHMeiyanMenusView (And pass in the beautyManager to MHMeiyanMenusView) ``` - (MHMeiyanMenusView *)menusView { if (!_menusView) { _menusView = [[MHMeiyanMenusView alloc] initWithFrame:CGRectMake(0, window_height - MHMeiyanMenuHeight - BottomIndicatorHeight, window_width, MHMeiyanMenuHeight) superView:self.view beautyManager:self.beautyManager ]; } return _menusView; } ```
                  <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>

                              哎呀哎呀视频在线观看