IOS 视屏开发之AVPlayer的基本使用
生活随笔
收集整理的這篇文章主要介紹了
IOS 视屏开发之AVPlayer的基本使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 名詞解釋:(1)AVPlayer 負責控制播放(管理和調控)
使用 AVPlayer 時需要注意,AVPlayer 本身并不能顯示視頻, 顯示視頻的是 AVPlayerLayer。 AVPlayerLayer 繼承自 CALayer,添加到 view.layer 上就可以使用了。
? - (void)play;? ——? 播放
? - (void)pause; ——? 暫停
?(2)AVPlayerLayer 畫面顯示播放 —- View
?(3)AVPlayerItem 提供數據 —- 數據源
?? ? AVPlayItem 相當于 Model 層,包含Media的信息和播放狀態,并提供這些數據給視頻觀察者。
?? ? status: 播放器狀態變化
?? ? loadedTimeRange :緩存大小
2. 整個播放視頻的步驟。
? (1)首先,得到視頻的URL
? (2)根據URL創建AVPlayerItem
? (3)把AVPlayerItem 提供給 AVPlayer
? (4)AVPlayerLayer 顯示視頻。
? (5)AVPlayer 控制視頻, 播放, 暫停, 跳轉 等等。
? (6)播放過程中獲取緩沖進度,獲取播放進度。
? (7)視頻播放完成后做些什么,是暫停還是循環播放,還是停留在最后一幀圖像。
3. 初始化一個AVPlayer用來播放
#pragma mark -- life cycle - (void)createAVPlay {// 監測設備方向[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];//旋轉屏幕通知[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(onDeviceOrientationChange)name:UIDeviceOrientationDidChangeNotificationobject:nil];//播放完成通知[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(avPlayDidEnd)name:AVPlayerItemDidPlayToEndTimeNotificationobject:nil];/* 1. 初始化一個View,是用來放置播放器用的,此處是self2. 初始化播放器AVPlayerItem,用來設置播放視屏的URL或者本地視屏資源3. 初始化一個AVPlayer對象,來接收AVPlayerItem傳過來的資源4. 初始化一個AVPlayerLayer對象,將AVPlayer對象疊加在其上面5. 將AVPlayerLayer對象添加到self的layer層上*/// 初始化播放器itemself.playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:self.movieUrlString]];// 監聽播放器狀態變化[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// 監聽緩存大小[self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];// 初始化一個AVPlayerself.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];// 初始化播放器的Layerself.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];//此處為默認視頻填充模式self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;// 添加playerLayer到self.layer[self.layer insertSublayer:self.playerLayer atIndex:0];/* layer的填充屬性AVLayerVideoGravityResizeAspect 等比例拉伸,會留白AVLayerVideoGravityResizeAspectFill // 等比例拉伸,會裁剪AVLayerVideoGravityResize // 保持原有大小拉伸*/ }
// 監聽播放器的變化屬性 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {if ([keyPath isEqualToString:@"status"]){AVPlayerItemStatus statues = [change[NSKeyValueChangeNewKey] integerValue];switch (statues){case AVPlayerItemStatusReadyToPlay:{[self hiddenLoading];[self setNeedsLayout];[self layoutIfNeeded];// 5. 添加playerLayer到self.layer//[self.layer insertSublayer:self.playerLayer atIndex:0];// 最大值直接用sec,以前都是// CMTimeMake(幀數(slider.value * timeScale), 幀/sec)[self.avPlayControlView setSliderMaxValue:CMTimeGetSeconds(self.playerItem.duration)];[self initTimer];// 啟動定時器 5秒自動隱藏if (!self.autoDismissTimer){self.autoDismissTimer = [NSTimer timerWithTimeInterval:8.0 target:self selector:@selector(autoHiddenControlView) userInfo:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:self.autoDismissTimer forMode:NSDefaultRunLoopMode];}}break;case AVPlayerItemStatusUnknown:NSLog(@"--AVPlayerItemStatusUnknown");break;case AVPlayerItemStatusFailed:NSLog(@"--AVPlayerItemStatusFailed");break;default:break;}}else if ([keyPath isEqualToString:@"loadedTimeRanges"]) // 監聽緩存進度的屬性{// 計算緩存進度NSTimeInterval timeInterval = [self availableDuration];// 獲取總長度CMTime duration = self.playerItem.duration;CGFloat durationTime = CMTimeGetSeconds(duration);// 監聽到了給進度條賦值[self.avPlayControlView setProgress:timeInterval / durationTime];} }
?本工程的演示demo地址? 點擊打開鏈接
總結
以上是生活随笔為你收集整理的IOS 视屏开发之AVPlayer的基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AVPlayer设置从哪儿开始播放
- 下一篇: 图解WinHex使用入门