核心类 AVAsset视频资源对象,需要传入本地或网络的URL AVPlayerItem获取视频时长及各种状态,需要传入创建好的AVAsset对象 AVPlayer视频播放类,需要传入创建好的AVPlayerItem对象 AVPlayerLayer视频显示layer,可以替换或插入到视图树中 AVAssetImageGenerator获取视频某一帧的缩略图,可以获取某个时间的,也可以批量获取第一步:初始化1。创建AVAsset asset〔AVAssetassetWithURL:assetURL〕; 2。创建AVPlayerItem,可以传入所需要监听的属性,例如视频时长duration NSArraykeys〔 tracks, duration, commonMetadata, availableMediaCharacteristicsWithMediaSelectionOptions 〕; self。playerItem〔AVPlayerItemplayerItemWithAsset:self。assetautomaticallyLoadedAssetKeys:keys〕; 3。通过KVO给AVPlayerItem添加视频播放状态的监听 〔self。playerItemaddObserver:selfforKeyPath:statusoptions:0context:PlayerItemStatusContext〕; 4。创建AVPlayer self。player〔AVPlayerplayerWithPlayerItem:self。playerItem〕; 5。创建显示视频用的AVPlayerLayer,并设置之前创建好的AVPlayer为视频播放器,插入到当前视图树中 AVPlayerLayerlayer〔AVPlayerLayerplayerLayerWithPlayer:player〕;第二步:首次播放 〔self。playerplay〕; 【更多音视频学习资料,点击下方链接免费领取,先码住不迷路】 点击领取音视频开发基础知识和资料包在第一步的KVO监听中监听到AVPlayerItem的播放状态为AVPlayerItemStatusReadyToPlay,调用AVPlayer的play方法开始播放,这里还写了其它方法,例如监听当前播放时长,批量获取缩略图等,后面会放具体实现 if(contextPlayerItemStatusContext){ dispatchasync(dispatchgetmainqueue(),{ 移除监听 〔self。playerItemremoveObserver:selfforKeyPath:status〕; if(self。playerItem。statusAVPlayerItemStatusReadyToPlay){ 添加视频当前播放时间的监听 〔selfaddPlayerItemTimeOberver〕; 视频总时长 CMTimedurationself。playerItem。 〔self。delegateplayerDidChangeTime:CMTimeGetSeconds(kCMTimeZero)withAssertDuration:CMTimeGetSeconds(duration)〕; 播放 〔self。playerplay〕; 批量获取缩略图 〔selfgenerateThumbnails〕; } }); } 第三步:暂停 〔self。playerpause〕; 第四步:暂停后继续播放,如果设置了倍速,暂停后会重置,这里需要重新设置一下速率,而且一定要放在play方法之后,不然不会生效 〔self。playerplay〕;self。player。rateplayRate 第五步:获取当前播放时间,在初始化的KVO监听中调用AVPlayer的如下方法 (id)addPeriodicTimeObserverForInterval:(CMTime)intervalqueue:(nullabledispatchqueuet)queueusingBlock:(void()(CMTimetime))block(void)addPlayerItemTimeOberver { CMTimeintervalCMTimeMakeWithSeconds(0。5f,NSECPERSEC); dispatchqueuetqueuedispatchgetmainqueue(); weaktypeof(self)weakS self。timeObserver〔self。playeraddPeriodicTimeObserverForInterval:intervalqueue:queueusingBlock:(CMTimetime){ NSTimeIntervalcurrentTimeCMTimeGetSeconds(time); NSTimeIntervaldurationCMTimeGetSeconds(weakSelf。playerItem。duration); 〔weakSelf。delegateplayerDidChangeTime:currentTimewithAssertDuration:duration〕; }〕; } 第六步:速率播放,设置AVPlayer的rate属性 self。player。rateplayRate 第七步:移动到某个时间点进行播放,这里有一个细节,当手指按下的时候,需要停止播放并移除播放时长通知,当手指离开,继续播放与监听当前播放时长 〔self。playerseekToTime:CMTimeMakeWithSeconds(time,NSECPERSEC)〕;手指按下 (void)progressSliderDidStartChange { 〔self。playerpause〕; 〔self。playerremoveTimeObserver:self。timeObserver〕; self。timeO } 开始移动 (void)progressSliderSeekToTime:(NSTimeInterval)time { 〔self。playerItemcancelPendingSeeks〕; 〔self。playerseekToTime:CMTimeMakeWithSeconds(time,NSECPERSEC)〕; } 手指离开 (void)progressSliderDidEnd { 〔selfaddPlayerItemTimeOberver〕; 〔self。playerplay〕; self。player。rateplayR } 第八步:批量获取缩略图,创建可视化进度条 创建AVAssetImageGenerator,传入AVAsset类型 AVAssetImageGeneratorimageGenerator〔AVAssetImageGeneratorassetImageGeneratorWithAsset:self。asset〕; 批量获取缩略图方法 (void)generateCGImagesAsynchronouslyForTimes:(NSArray)requestedTimescompletionHandler:(AVAssetImageGeneratorCompletionHandler)handler 获取某个时间点的缩略图 (nullableCGImageRef)copyCGImageAtTime:(CMTime)requestedTimeactualTime:(nullableCMTime)actualTimeerror:(NSErrorNullableNullable)outError 【更多音视频学习资料,点击下方链接免费领取,先码住不迷路】 点击领取音视频开发基础知识和资料包(void)generateThumbnails { AVAssetImageGeneratorimageGenerator〔AVAssetImageGeneratorassetImageGeneratorWithAsset:self。asset〕; imageGenerator。maximumSizeCGSizeMake(200,0); CMTimedurationself。asset。 NSMutableArraytimes〔NSMutableArrayarray〕; CMTimeValueincrementduration。value20; CMTimeValuecurrentValue2。0duration。 while(currentValueduration。value){ CMTimetimeCMTimeMake(currentValue,duration。timescale); 〔timesaddObject:〔NSValuevalueWithCMTime:time〕〕; currentV } blockNSIntegerimageCounttimes。 blockNSMutableArrayimages〔NSMutableArrayarray〕; 〔imageGeneratorgenerateCGImagesAsynchronouslyForTimes:timescompletionHandler:(CMTimerequestedTime,CGImageRefNullableimageRef,CMTimeactualTime,AVAssetImageGeneratorResultresult,NSErrorNullableerror){ if(resultAVAssetImageGeneratorSucceeded){ UIImageimage〔UIImageimageWithCGImage:imageRef〕; QXThumbnailthumbnail〔QXThumbnailthumbilWithImage:imagetime:actualTime〕; 〔imagesaddObject:thumbnail〕; }else{ NSLog(Error:,error。localizedDescription); } if(imageCount0){ dispatchasync(dispatchgetmainqueue(),{ 〔self。delegateplayerDidGenerateThumbnails:〔imagescopy〕〕; }); } }〕; } 到此,一个简易的视频播放器就完成了,当然了,还有很多的细节需要去处理,这个就需要小伙伴们自己去捉摸了,学习音视频一定是一个漫长又有趣的路,加油! 如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!