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;
}
```
- 美狐SDK接入文檔
- Meihu SDK Access Document
- (Untitled)
- 一、基礎描述(Basic description)
- 1. 最新特性 (Latest features)
- 2. 支持平臺 (Support platform)
- 二、集成步驟 (Integration steps)
- 3. 配置工程(Configuration Engineering)
- 4. 使用 MHUI (Use MHUI)
- 5. 騰訊直播 SDK/短視頻SDK (Tencent live SDK / short video SDK)
- 6. 金山直播SDK (Jinshan)
- 7. 七牛直播SDK (Qiniu Live)
- 8. 七牛短視頻SDK (Qiniu ShortVideo)
- 9. Movieous短視頻 (Movieous short Video)
- 10. 即構直播SDK (Zego live)
- 11. 即構實時音視頻SDK(Zego Real time audio and video)
- 12. 新版Zego(即構)實時音視頻(New Zego Real time audio and video)
- 13. 網易直播 (NetEase live)
- 14. 騰訊互動直播 (Tencent interactive live broadcast)
- 15. 騰訊實時音視頻(Tencent real-time audio and video)
- 16. 融云實時音視頻 (SealRTC)
- 17. 聲網視頻通話 (Agora video call)
- 18. 聲網直播 (Agora Live)
- 19. 阿里直播 (Ali Live)
- 20. 阿里音視頻 SDK美顏
- 三、對接說明 (Docking instructions)
- 四、常見問題(common problem)
- 2. 美顏無效果(Beauty has no effect)
- 3. 貼紙下載失敗(Sticker download failed)
- 4. 點擊無法出現美顏菜單頁(The beauty menu page cannot appear after clicking)
- 5. 英文版顯示中文(The beauty menu page cannot appear after clicking)
- 6. 語言切換功能(Language switching function)