RQExplainVideoViewController.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //
  2. // RQExplainVideoViewController.m
  3. // SDJK
  4. //
  5. // Created by 张嵘 on 2022/7/5.
  6. //
  7. #import "RQExplainVideoViewController.h"
  8. #import <ZFPlayer/ZFAVPlayerManager.h>
  9. @interface RQExplainVideoViewController ()
  10. /// viewModel
  11. @property (nonatomic, readonly, strong) RQExplainVideoViewModel *viewModel;
  12. @property (nonatomic, readwrite, strong) UIImageView *containerView;
  13. @property (nonatomic, readwrite, strong) ZFPlayerController *player;
  14. @property (nonatomic, readwrite, strong) ZFPlayerControlView *controlView;
  15. @end
  16. @implementation RQExplainVideoViewController
  17. @dynamic viewModel;
  18. #pragma mark - SystemMethod
  19. - (void)viewDidLoad {
  20. [super viewDidLoad];
  21. /// 初始化
  22. [self rq_setup];
  23. if (RQ_USER_MANAGER.tryLookCount > 0) {
  24. RQ_USER_MANAGER.tryLookCount = RQ_USER_MANAGER.tryLookCount - 1;
  25. }
  26. }
  27. - (void)viewWillLayoutSubviews {
  28. [super viewWillLayoutSubviews];
  29. 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);
  30. }
  31. - (void)viewWillAppear:(BOOL)animated {
  32. [super viewWillAppear:animated];
  33. self.player.viewControllerDisappear = NO;
  34. }
  35. - (void)viewWillDisappear:(BOOL)animated {
  36. [super viewWillDisappear:animated];
  37. self.player.viewControllerDisappear = YES;
  38. }
  39. #pragma mark - PrivateMethods
  40. /// 初始化
  41. - (void)rq_setup {
  42. [self.view addSubview:self.containerView];
  43. [self setupPlayer];
  44. }
  45. - (UIImage*)videoImageWithvideoURL:(NSURL *)videoURL {
  46. NSString *cacheKeyStr = [[YYWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:videoURL.absoluteString]];
  47. UIImage *memoryImage = [[YYImageCache sharedCache] getImageForKey:cacheKeyStr];
  48. if (memoryImage) {
  49. return memoryImage;
  50. } else {
  51. 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)];
  52. dispatch_async(dispatch_get_main_queue(), ^{
  53. YYImageCache * cache = [YYImageCache sharedCache];
  54. [cache setImage:thumbnailImage forKey:videoURL.absoluteString];
  55. });
  56. return thumbnailImage;
  57. }
  58. }
  59. // 获取视频第一帧
  60. - (UIImage*)firstFrameWithVideoURL:(NSURL*)url size:(CGSize)size {
  61. NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
  62. AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:url options:opts];
  63. AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
  64. generator.appliesPreferredTrackTransform = YES;
  65. generator.maximumSize = CGSizeMake(size.width, size.height);
  66. NSError*error =nil;
  67. CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(0, 10) actualTime:NULL error:&error];
  68. {
  69. return [UIImage imageWithCGImage:img];
  70. }
  71. return nil;
  72. }
  73. - (void)setupPlayer {
  74. ZFAVPlayerManager *playerManager = [[ZFAVPlayerManager alloc] init];
  75. // ZFIJKPlayerManager *playerManager = [[ZFIJKPlayerManager alloc] init];
  76. playerManager.shouldAutoPlay = YES;
  77. /// 播放器相关
  78. self.player = [ZFPlayerController playerWithPlayerManager:playerManager containerView:self.containerView];
  79. self.player.controlView = self.controlView;
  80. /// 设置退到后台继续播放
  81. self.player.pauseWhenAppResignActive = NO;
  82. // self.player.resumePlayRecord = YES;
  83. @weakify(self)
  84. self.player.orientationWillChange = ^(ZFPlayerController * _Nonnull player, BOOL isFullScreen) {
  85. RQ_APPDELEGATE.allowOrentitaionRotation = isFullScreen;
  86. };
  87. /// 播放完成
  88. self.player.playerDidToEnd = ^(id _Nonnull asset) {
  89. @strongify(self)
  90. [self.player stop];
  91. [RQ_APPDELEGATE.services popViewModelAnimated:YES];
  92. };
  93. self.player.assetURLs = @[[NSURL URLWithString:self.viewModel.explainModel.short_video_url],
  94. [NSURL URLWithString:self.viewModel.explainModel.short_video_url]];
  95. [self.player playTheNext];
  96. [self.controlView showTitle:self.viewModel.title coverImage:[self videoImageWithvideoURL:[NSURL URLWithString:self.viewModel.explainModel.short_video_url]] fullScreenMode:ZFFullScreenModeAutomatic];
  97. }
  98. #pragma mark - LazyLoad
  99. - (ZFPlayerControlView *)controlView {
  100. @weakify(self)
  101. if (!_controlView) {
  102. _controlView = [ZFPlayerControlView new];
  103. _controlView.fastViewAnimated = YES;
  104. _controlView.autoHiddenTimeInterval = 5;
  105. _controlView.autoFadeTimeInterval = 0.5;
  106. _controlView.prepareShowLoading = YES;
  107. _controlView.prepareShowControlView = NO;
  108. [_controlView.portraitControlView.backBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  109. @strongify(self)
  110. [self.player stop];
  111. [RQ_APPDELEGATE.services popViewModelAnimated:YES];
  112. }];
  113. }
  114. return _controlView;
  115. }
  116. - (UIImageView *)containerView {
  117. if (!_containerView) {
  118. _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)];
  119. }
  120. return _containerView;
  121. }
  122. @end