SLAvPlayer.m 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //
  2. // SLAvPlayer.m
  3. // DarkMode
  4. //
  5. // Created by wsl on 2019/9/20.
  6. // Copyright © 2019 wsl. All rights reserved.
  7. //
  8. #import "SLAvPlayer.h"
  9. @interface SLAvPlayer () {
  10. id _playerTimeObserver;
  11. }
  12. @property (nonatomic, strong) AVPlayer *avPlayer;
  13. @property (nonatomic, strong) AVPlayerLayer *playerLayer; //视频显示器
  14. @end
  15. @implementation SLAvPlayer
  16. + (instancetype)sharedAVPlayer {
  17. static SLAvPlayer *avPlayer = nil;
  18. static dispatch_once_t onceToken;
  19. dispatch_once(&onceToken, ^{
  20. avPlayer = [[SLAvPlayer alloc] init];
  21. });
  22. return avPlayer;
  23. }
  24. #pragma mark - OverWrite
  25. - (instancetype)init {
  26. self = [super init];
  27. if (self) {
  28. [self configure];
  29. }
  30. return self;
  31. }
  32. - (void)dealloc {
  33. [self stop];
  34. }
  35. #pragma mark - HelpMethods
  36. - (void)configure {
  37. }
  38. #pragma mark - Setter
  39. - (void)setUrl:(nonnull NSURL *)url {
  40. _url = url;
  41. if (_url == nil) {
  42. return;
  43. }
  44. [self.avPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:self.url]];
  45. }
  46. - (void)setMonitor:(nullable UIView *)monitor {
  47. _monitor = monitor;
  48. if (monitor == nil) {
  49. [self.playerLayer removeFromSuperlayer];
  50. }else {
  51. self.playerLayer.frame = monitor.bounds;
  52. [monitor.layer insertSublayer:self.playerLayer atIndex:0];
  53. }
  54. }
  55. #pragma mark - Getter
  56. - (AVPlayer *)avPlayer {
  57. if (_avPlayer == nil) {
  58. _avPlayer = [[AVPlayer alloc] init];
  59. //播放进度观察者 设置每0.1秒执行一次
  60. __weak typeof(self) weakSelf = self;
  61. _playerTimeObserver = [_avPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 10) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
  62. CGFloat current = CMTimeGetSeconds(time);
  63. CMTime totalTime = weakSelf.avPlayer.currentItem.duration;
  64. CGFloat total = CMTimeGetSeconds(totalTime);
  65. if([weakSelf.delegate respondsToSelector:@selector(avPlayer:playingToCurrentTime:totalTime:)]) {
  66. [weakSelf.delegate avPlayer:weakSelf playingToCurrentTime:time totalTime:totalTime];
  67. }
  68. if (current >= total) {
  69. //播放完毕
  70. if([weakSelf.delegate respondsToSelector:@selector(playDidEndOnAvplyer:)]) {
  71. [weakSelf pause];
  72. [weakSelf.delegate playDidEndOnAvplyer:weakSelf];
  73. }
  74. }
  75. }];
  76. }
  77. return _avPlayer;
  78. }
  79. - (AVPlayerLayer *)playerLayer {
  80. if (_playerLayer == nil) {
  81. _playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
  82. _playerLayer.backgroundColor = [UIColor blackColor].CGColor;
  83. _playerLayer.frame = [UIScreen mainScreen].bounds;
  84. _playerLayer.videoGravity =AVLayerVideoGravityResizeAspect;
  85. }
  86. return _playerLayer;
  87. }
  88. - (CMTime)duration {
  89. return self.avPlayer.currentItem.duration;
  90. }
  91. - (CGSize)naturalSize {
  92. AVAsset *asset = [AVAsset assetWithURL:self.url];
  93. //资源文件的视频轨道
  94. AVAssetTrack *assetVideoTrack = nil;
  95. if ([[asset tracksWithMediaType:AVMediaTypeVideo] count] != 0) {
  96. assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];
  97. }else {
  98. return CGSizeZero;
  99. }
  100. CGSize renderSize = assetVideoTrack.naturalSize;
  101. renderSize = CGSizeApplyAffineTransform(assetVideoTrack.naturalSize, assetVideoTrack.preferredTransform);
  102. return CGSizeMake(fabs(renderSize.width), fabs(renderSize.height));
  103. }
  104. #pragma mark - EventsHandle
  105. - (void)play {
  106. [self.avPlayer play];
  107. }
  108. - (void)pause {
  109. [self.avPlayer pause];
  110. }
  111. - (void)stop {
  112. [_avPlayer pause];
  113. _avPlayer = nil;
  114. [_playerLayer removeFromSuperlayer];
  115. _playerLayer = nil;
  116. _playerTimeObserver = nil;
  117. _delegate = nil;
  118. }
  119. - (void)seekToTime:(CMTime)time completionHandler:(void (^_Nullable)(BOOL finished))completionHandler {
  120. [self.avPlayer.currentItem seekToTime:time completionHandler:completionHandler];
  121. }
  122. @end