// // RQExplainVideoViewController.m // SDJK // // Created by 张嵘 on 2022/7/5. // #import "RQExplainVideoViewController.h" #import @interface RQExplainVideoViewController () /// viewModel @property (nonatomic, readonly, strong) RQExplainVideoViewModel *viewModel; @property (nonatomic, readwrite, strong) UIImageView *containerView; @property (nonatomic, readwrite, strong) ZFPlayerController *player; @property (nonatomic, readwrite, strong) ZFPlayerControlView *controlView; @end @implementation RQExplainVideoViewController @dynamic viewModel; #pragma mark - SystemMethod - (void)viewDidLoad { [super viewDidLoad]; /// 初始化 [self rq_setup]; if (RQ_USER_MANAGER.tryLookCount > 0) { RQ_USER_MANAGER.tryLookCount = RQ_USER_MANAGER.tryLookCount - 1; } } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; self.containerView.frame = CGRectMake(0, RQ_APPLICATION_STATUS_BAR_HEIGHT, RQ_SCREEN_WIDTH, RQ_SCREEN_HEIGHT - RQ_APPLICATION_STATUS_BAR_HEIGHT - RQ_APPLICATION_SAFEAREA_BOTTOM_HEIGHT); } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.player.viewControllerDisappear = NO; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.player.viewControllerDisappear = YES; } #pragma mark - PrivateMethods /// 初始化 - (void)rq_setup { [self.view addSubview:self.containerView]; [self setupPlayer]; } - (UIImage*)videoImageWithvideoURL:(NSURL *)videoURL { NSString *cacheKeyStr = [[YYWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:videoURL.absoluteString]]; UIImage *memoryImage = [[YYImageCache sharedCache] getImageForKey:cacheKeyStr]; if (memoryImage) { return memoryImage; } else { UIImage *thumbnailImage = [self firstFrameWithVideoURL:videoURL size:CGSizeMake(RQ_SCREEN_WIDTH - 32.f, RQ_SCREEN_HEIGHT - RQ_APPLICATION_TOP_BAR_HEIGHT - RQ_APPLICATION_SAFEAREA_BOTTOM_HEIGHT)]; dispatch_async(dispatch_get_main_queue(), ^{ YYImageCache * cache = [YYImageCache sharedCache]; [cache setImage:thumbnailImage forKey:videoURL.absoluteString]; }); return thumbnailImage; } } // 获取视频第一帧 - (UIImage*)firstFrameWithVideoURL:(NSURL*)url size:(CGSize)size { NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:url options:opts]; AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset]; generator.appliesPreferredTrackTransform = YES; generator.maximumSize = CGSizeMake(size.width, size.height); NSError*error =nil; CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(0, 10) actualTime:NULL error:&error]; { return [UIImage imageWithCGImage:img]; } return nil; } - (void)setupPlayer { ZFAVPlayerManager *playerManager = [[ZFAVPlayerManager alloc] init]; // ZFIJKPlayerManager *playerManager = [[ZFIJKPlayerManager alloc] init]; playerManager.shouldAutoPlay = YES; /// 播放器相关 self.player = [ZFPlayerController playerWithPlayerManager:playerManager containerView:self.containerView]; self.player.controlView = self.controlView; /// 设置退到后台继续播放 self.player.pauseWhenAppResignActive = NO; // self.player.resumePlayRecord = YES; @weakify(self) self.player.orientationWillChange = ^(ZFPlayerController * _Nonnull player, BOOL isFullScreen) { RQ_APPDELEGATE.allowOrentitaionRotation = isFullScreen; }; /// 播放完成 self.player.playerDidToEnd = ^(id _Nonnull asset) { @strongify(self) [self.player stop]; [RQ_APPDELEGATE.services popViewModelAnimated:YES]; }; self.player.assetURLs = @[[NSURL URLWithString:self.viewModel.explainModel.short_video_url], [NSURL URLWithString:self.viewModel.explainModel.short_video_url]]; [self.player playTheNext]; [self.controlView showTitle:self.viewModel.title coverImage:[self videoImageWithvideoURL:[NSURL URLWithString:self.viewModel.explainModel.short_video_url]] fullScreenMode:ZFFullScreenModeAutomatic]; } #pragma mark - LazyLoad - (ZFPlayerControlView *)controlView { @weakify(self) if (!_controlView) { _controlView = [ZFPlayerControlView new]; _controlView.fastViewAnimated = YES; _controlView.autoHiddenTimeInterval = 5; _controlView.autoFadeTimeInterval = 0.5; _controlView.prepareShowLoading = YES; _controlView.prepareShowControlView = NO; [_controlView.portraitControlView.backBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) { @strongify(self) [self.player stop]; [RQ_APPDELEGATE.services popViewModelAnimated:YES]; }]; } return _controlView; } - (UIImageView *)containerView { if (!_containerView) { _containerView = [[UIImageView alloc] initWithFrame:CGRectMake(0, RQ_APPLICATION_STATUS_BAR_HEIGHT, RQ_SCREEN_WIDTH, RQ_SCREEN_HEIGHT - RQ_APPLICATION_STATUS_BAR_HEIGHT - RQ_APPLICATION_SAFEAREA_BOTTOM_HEIGHT)]; } return _containerView; } @end