下面把上面说的各个类分别说一下: 1、AVPlayerItem 在我们使用AVPlayer播放视频的时候,提供视频信息的就是AVPlayerItem,一个AVPlayerItem 对应着你提供的一个视频Url资源,这个理解它的时候可以把它比作一个Model, 你初始化了AVPlayerItem之后,并不是马上就可以使用它了,因为凡是和Url网络扯上关系的,都需要时间,等AVPlayerItem * avplayeritem = (AVPlayerItem *)object; if ([keyPath isEqualToString:@"status"]) { float currentPlayTime = (double)self.avPlayerItem.currentTime.value/ self.avPlayerItem.currentTime.timescale 2、AVPlayerItem 视频播放结束通知 /* Note that NSNotifications posted by AVPlayerItem may be posted on a different
发现有一个问题出现了400多次了 , An AVPlayerItem cannot be associated with more than one instance of AVPlayer 这个引起了崩溃 至于其他的回答的都比较扯的远点 就不一一细数了 参考网址:http://stackoverflow.com/questions/16213611/crash-in-avplayeritem-attachtoplayer-an-avplayeritem-cannot-be-associated-w avfoundation-attachtoplayer-or-attachtofigplayer-crash-an-avplayerit http://stackoverflow.com/questions/31337858/an-avplayeritem-cannot-be-associated-with-more-than-one-instance-of-avplayer-in
:一个媒体资源管理对象,用于管理视频的基本信息和状态,一个AVPlayerItem对应一个视频资源 AVPlayer:负责视频播放、暂停、时间控制等操作 AVPlayerLayer:负责显示视频的图层, 添加属性观察 一个AVPlayerItem对象对应着一个视频,我们需要通过AVPlayerItem来获取视频属性。 但是AVPlayerItem必须是在视频资源加载到可以播放的时候才能使用,这是受限于网络的原因。 解决这一问题,我们需要使用KVO监测AVPlayerItem的status属性,当其为AVPlayerItemStatusReadyToPlay的时候我们才能获取视频相关属性。 *playerItem = (AVPlayerItem *)object; if ([keyPath isEqualToString:@"status"]) { //获取playerItem
\_player) { AVPlayerItem \*playerItem=[self getPlayItem:0]; \_player=[AVPlayer playerWithPlayerItem :playerItem]; } return \_player; } -(AVPlayerItem \*)getPlayItem:(int)videoIndex{ pathForResource:@"movie.MP4" ofType:nil]; NSURL \*url=[NSURL fileURLWithPath:urlStr]; AVPlayerItem \*playerItem=[AVPlayerItem playerItemWithURL:url]; return playerItem; } - (SCNNode \*)showNode
AVPlayerItem:管理视频的基本信息和状态。 AVPlayer:用来读取本地或者远程的多媒体文件。 AVPlayer的使用实例 AVAsset *movieAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil]; AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:movieAsset]; AVPlayer *player = [AVPlayer playerWithPlayerItem 在demo中,还用到一个AVPlayerItemVideoOutput类,用于协调输出的CoreVideo像素缓存,配置AVPlayerItem。
这是我们就需要为去注册一个通知,用这个通知去实现监听avplayer.currentItem 代码如下 //给AVPlayerItem添加播放完成通知 [[NSNotificationCenter self.player.currentItem]; //播放完成之后会执行这个函数 -(void)playbackFinished:(NSNotification *)notification{ MyLog(@”视频播放完成“); AVPlayerItem [self.delegate playNextMusic]; } } //监听当前资源的状态属性,监听网络加载情况属性,监控缓存区大小此时我们都需要监听AVPlayerItem, //监控状态属性
地址 NSURL *url = [[NSBundle mainBundle] URLForResource:@"mySong1.mp3" withExtension:nil]; //2 创建播放器曲目 AVPlayerItem *playItem = [[AVPlayerItem alloc] initWithURL:url]; //3 创建播放器 self.player = [[AVPlayer alloc] initWithPlayerItem init]; 2.播放音乐 //播放 NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil]; AVPlayerItem *playItem = [[AVPlayerItem alloc] initWithURL:url]; [self.player replaceCurrentItemWithPlayerItem:playItem
另外它需要配合AVPlayerItem使用,AVPlayerItem类似于MVC里的Model层,负责资源加载、视频播放设置及播放状态管理(通过KVO方式来观察状态)。它们关系如下: ? 首先创建一个AVPlayerItem对象: NSURL* videoUrl = [NSURL fileURLWithPath:m_path isDirectory:NO]; m_playItem = [AVPlayerItem playerItemWithURL:videoUrl]; // 监听playItem的status属性 [m_playItem addObserver:self forKeyPath selector:@selector(itemPlayEnded:) name:AVPlayerItemDidPlayToEndTimeNotification object:m_playItem]; AVPlayerItem 还有AVPlayer释放时最好先把AVPlayerItem置空,否则会有解码线程残留着。最后是性能问题,如果聊天窗口连续播放几个小视频,列表滑动时会非常卡。
duration); [composition scaleTimeRange:timeRange toDuration:CMTimeMake(1, 1)]; // 将时间范围加速到 1 秒 // 创建 AVPlayerItem 对象并将组合后的视频添加到其中 AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:composition]; // 创建 AVPlayer 对象并将 AVPlayerItem 对象添加到其中 AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 2、如何高效获取一个视频的关键帧序列
selector(orientationChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; //添加AVPlayerItem playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.avPlayer.currentItem]; //添加AVPlayerItem AVPlayerItemPlaybackStalledNotification object:self.avPlayer.currentItem]; //KOV监控 播放器进度更新 - (void)addObserverForAVPlayer { AVPlayerItem
它一次只能播放一个AVPlayerItem,如果需要切换媒体源,需要使用replaceCurrentItem(with:)函数。如果需要播放多个视频,可以考虑使用AVQueuePlayer。 AVPlayerItem).status { case .readyToPlay: // 只有在这个状态下才能播放 //准备就绪 func replaceCurrentItem(with item: AVPlayerItem?) 当要切换播放源时,需要指定新的AVPlayerItem,这时候又会面临状态问题,之前说过只有在AVPlayerItemStatus变成readyToPlay的时候才可以调用play和seek等函数,可以使用 loaded: // Sucessfully loaded, continue processing //在这里替换播放源,并且直接开始播放 let playerItem = AVPlayerItem.init
NSKeyValueChangeKey,id> *)change context:(void *)context { if ([keyPath isEqualToString:kItemStatus]) { AVPlayerItem //同上 } } else if ([keyPath isEqualToString:kItemLoadedTimeRanges]) { AVPlayerItem self.playerlayer.bounds = CGRectMake(0, 0, size.width, size.height); } //准备播放 - (void)readyToplayWithItem:(AVPlayerItem playCurrentVideo) forControlEvents:UIControlEventValueChanged]; } //获得缓存 - (void)getLoadedTimeRanges:(AVPlayerItem
可以使用 AVPlayerItem 的 preferredForwardBufferDuration 或 automaticallyWaitsToMinimizeStalling 来控制缓冲行为。 networkURL)") } else { print("无有效视频路径") return } let playerItem = AVPlayerItem saveTo: cachedURL) } /// 设置播放器 private func setupPlayer(url: URL) { let playerItem = AVPlayerItem
[[PHImageManager defaultManager] requestPlayerItemForVideo:_videoAsset options:nil resultHandler:^(AVPlayerItem
,需创建一个AVPlayerLayer层,添加到视图 AVAssetTrack 资源轨道,包括音频轨道和视频轨道 AVAsset 媒体信息 AVURLAsset 根据URL路径创建的媒体信息 AVPlayerItem trackMixArray addObject:trackMix2]; 总结 AVPlayer通过KVO监听rate属性,status属性,用notification来监听播放完成; AVPlayer和AVPlayerItem
本地视频URL都可以) NSURL * url = [NSURL URLWithString:self.vedioURL]; //根据URL创建播放曲目 AVPlayerItem * item = [AVPlayerItem playerItemWithURL:url]; //创建一个视频播放器 AVPlayer * player = [AVPlayer
播放器对象 @property (nonatomic,strong) AVPlayerLayer* playerLayer; @property (nonatomic,strong) AVPlayerItem AVAsset* movieAsset = [AVURLAsset URLAssetWithURL:movieURL options:nil]; self.playerItem = [AVPlayerItem :播放"); return true; } return false; } -(void)addNotification{ //给AVPlayerItem
AVFoundation.AVMovieTrack import AVFoundation.AVOutputSettingsAssistant import AVFoundation.AVPlayer import AVFoundation.AVPlayerItem AVCaptureVideoPreviewLayer捕获的视频数据的预览图层 AVMetadataObject音视频元数据是一个基类里面包含面部检测的元数据和二维码的元数据 AVPlayer音视频播放器 AVPlayerItem
// 2.3 根据url初始化播放内容,然后开始进行播放 let asset = AVAsset.init(url: audioURL) let item = AVPlayerItem.init invalidate() // 2.5 监测播放状态 keyVakueObservation = item.observe(\AVPlayerItem.status) { return } let asset = AVAsset.init(url: audioURL) let item = AVPlayerItem.init invalidate() keyVakueObservation = item.observe(\AVPlayerItem.status) { [weak self] (playerItem
同时记录一个时间轴,表明一个时间点,应该有哪些音频轨道和视频轨道; 3、新建AVMutableVideoComposition类,并且设定自定义的视频合并类; 4、用AVMutableComposition新建AVPlayerItem 类,并设定videoComposition为第三步创建的AVMutableVideoComposition类; 5、用AVPlayerItem创建AVPlayer; 6、开始播放后,如果有视频需要显示