我有一个UIView包含一个AVPlayer来显示video。 改变方向时,我需要改变video的大小和位置。 我对调整层次不是很有经验,所以我在调整video时遇到了问题。 我开始创buildAVPlayer并将其播放器添加到我的videoHolderView图层: NSURL *videoURL = [NSURL fileURLWithPath:videoPath]; self.avPlayer = [AVPlayer playerWithURL:videoURL]; AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer]; playerLayer.frame = videoHolderView.bounds; playerLayer.videoGravity = AVLayerVideoGravityResizeAspect; playerLayer.needsDisplayOnBoundsChange = YES; [videoHolderView.layer addSublayer:playerLayer]; videoHolderView.layer.needsDisplayOnBoundsChange = YES; 然后,稍后,我更改videoHolderView框架的大小和位置: [videoHolderView setFrame:CGRectMake(0, 0, 768, 502)]; 在这一点上,我需要avPlayer调整到这些相同的尺寸。 这不会自动发生 – avPlayer停留在videoHolderView内的小尺寸。 如果有人可以帮忙,我真的很感激任何意见。 多谢你们。
我有一个UITableView包含滚动时播放的video数量。 当tableView中的单元格被重新使用时,我只为每一行实例化一个AVPlayer 。 当一个单元格被重新使用时,我只需通过调用[self.player replaceCurrentItemWithPlayerItem:newItem];来更改单元格玩家的[self.player replaceCurrentItemWithPlayerItem:newItem]; 。 这是目前正在间接调用tableView:cellForRowAtIndexPath 。 当向下滚动时,重新使用时会有明显的滞后。 通过一个消除的过程,我已经得出结论,滞后是由replaceCurrentItemWithPlayerItem ,甚至开始播放之前造成的。 当删除这一行代码(防止玩家获得一个新的video),滞后消失。 我试图解决它: 我有一个自定义的UITableViewCell播放这些video,我已经创build了一个方法来初始化来自对象的新信息。 IE,在cellForRowAtIndexPath:我调用[cell initializeNewObject:newObject]; 执行以下方法: //In CustomCell.m -(void)initializeNewObject:(CustomObject*)newObject { /*…*/ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ AVPlayerItem *xPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:newObject.url]]; AVPlayer *dummy = self.player; [dummy replaceCurrentItemWithPlayerItem:xPlayerItem]; dispatch_async(dispatch_get_main_queue(), ^{ self.player = dummy; playerItem = xPlayerItem; } }/*…*/ } 当运行这个,我得到了相同的结果,如果我完全删除了更换项目的呼叫。 显然,这个函数不能被线程化。 我并不完全确定我对此的期望。 我会想象我需要一个干净的AVPlayer这个工作copy ,但search了一下之后,我发现了几个意见,指出replaceCurrentItemWithPlayerItem: […]
我正在处理有收集视图的应用程序,并且收集视图的单元格可以包含video。 现在我正在使用AVPlayer和AVPlayerLayer来显示video。 不幸的是,滚动性能是可怕的。 AVPlayer , AVPlayerItem和AVPlayerLayer似乎在主线程上做了很多工作。 他们不断地取出锁,等待信号等,这是阻塞主线,造成严重的帧丢失。 有什么方法可以告诉AVPlayer停止在主线程上做很多事情吗? 到目前为止,我没有尝试过解决了这个问题。 我也尝试使用AVSampleBufferDisplayLayer构build一个简单的video播放器。 使用这个function,我可以确保所有的事情都是在主线程中发生的,在滚动和播放video的同时我可以达到60fps。 不幸的是,这种方法要低得多,并且不提供audio播放和时间清理等function。 有什么方法可以与AVPlayer获得类似的性能? 我宁愿使用它。 编辑:进一步调查之后,使用AVPlayer时看起来不太可能实现良好的滚动性能。 创build一个AVPlayer并与一个AVPlayerItem实例关联起来,这些工作就会蹦蹦跳进主线程,然后等待信号并尝试获取一堆锁。 随着滚动视图中video的数量的增加,主线程停顿的时间也相应增加。 AVPlayer dealloc也似乎是一个巨大的问题。 释放一个AVPlayer也试图同步一堆东西。 同样,当你创造更多的球员时,这会变得非常糟糕。 这是非常令人沮丧的,这使得AVPlayer几乎无法用于我正在做的事情。 阻止这样的主线是这样一个业余的事情,很难相信苹果的工程师会犯这样的错误。 无论如何,希望他们能尽快解决这个问题。
昨天我更新了Xcode到版本5.1(5B130a); 模拟器的版本现在读取版本7.1(463.9.41)。 今天我开始使用AVPlayer开始播放时出现这些奇怪的错误。 我从来没有见过这样的错误,找不到任何有关他们的信息,也不知道他们的意思。 他们不是致命的,我没有注意到他们的任何不良影响。 但… 什么是RTCReporting,它是如何进入我的项目? pancake.apple.com与什么有什么关系? 等谢谢。 2014-03-21 16:16:34.129 0.1[3330:5403] RTCReporting: resolve from http://pancake.apple.com/bags/hls?version=4.12 2014-03-21 16:17:17.201 0.1[3330:5403] RTCReporting(getSvrConfig): error resolving with lookup server http://pancake.apple.com/bags/hls?version=4.12 2014-03-21 16:17:17.201 0.1[3330:5403] RTCReporting(getSvrConfig): sendSynchronousRequest error Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x10f110d60 {NSUnderlyingError=0x11230ed80 "The request timed out.", NSErrorFailingURLStringKey=http://pancake.apple.com/bags/hls?version=4.12, NSErrorFailingURLKey=http://pancake.apple.com/bags/hls?version=4.12, NSLocalizedDescription=The request timed out.} 2014-03-21 16:17:17.202 0.1[3330:5403] RTCReporting: […]
我正在尝试让MPNowPlayingInfoCenter在暂停播放时正常工作。 (我有一个使用AVPlayer进行播放的stream媒体音乐应用程序,而我正在通过Airplay在Apple TV中播放。)除了暂停以外,其他所有内容似乎均已在Apple TV用户界面中正确反映出来。 我正在像这样初始化它: MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSDictionary *songInfo = @{ MPMediaItemPropertyTitle: title, MPMediaItemPropertyArtist: artist }; center.nowPlayingInfo = songInfo; 由于我是stream媒体,我没有开始播放的持续时间信息。 当我从stream中获得“就绪”信号时,我更新Apple TV上正确显示的时间: MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo]; [playingInfo setObject:[NSNumber numberWithFloat:length] forKey:MPMediaItemPropertyPlaybackDuration]; center.nowPlayingInfo = playingInfo; 当用户寻找曲目时,我也可以用这种技术来寻找: [playingInfo setObject:[NSNumber numberWithFloat:length * targetProgress] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; 我无法弄清的一件事是,如何暂停Apple TV上的播放头。 当用户在我的用户界面中点击暂停时,我正在尝试执行如下操作: MPNowPlayingInfoCenter *center = […]
在AVPlayer中可以播放时间和总播放时间吗? 如果是,我该怎么做?
我正在使用AVPlayer进行使用HTTP实况stream的电台应用程序。 现在我想为audiostream实现一个电平表。 最好的方法是用电平表显示不同的频率,但是简单的左/右解决scheme将是一个很好的起点。 我发现了几个使用AVAudioPlayer例子。 但是我找不到一个解决scheme来获取AVPlayer所需的信息。 有人能为我的问题想出一个解决scheme吗? 编辑我想创build这样的东西(但更好) 编辑II 一个build议是使用MTAudioProcessingTap来获取原始audio数据。 使用[[[_player currentItem] asset] tracks]数组可以find这个例子,在我的例子中,它是一个空数组。 另一个build议是使用[[_player currentItem] audioMix]对我来说是null的。 编辑三 已经有好几年了,似乎还没有解决办法。 我确实取得了进展,所以我分享了。 在安装过程中,我将一个键值观察者添加到playerItem中: [[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL]; ////////////////////////////////////////////////////// – (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) { for (AVPlayerItemTrack *itemTrack in [object tracks]) { AVAssetTrack *track = […]
我试图播放一个MP3文件,从以前的UIView (存储在一个NSURL *fileURLvariables)传递给UIView 。 我正在初始化一个AVPlayer : player = [AVPlayer playerWithURL:fileURL]; NSLog(@"Player created:%d",player.status); NSLog打印Player created:0,我想这意味着它还没有准备好播放呢。 当我点击播放UIButton ,我运行的代码是: -(IBAction)playButtonClicked { NSLog(@"Clicked Play. MP3:%@",[fileURL absoluteString]); if(([player status] == AVPlayerStatusReadyToPlay) && !isPlaying) // if(!isPlaying) { [player play]; NSLog(@"Playing:%@ with %d",[fileURL absoluteString], player.status); isPlaying = YES; } else if(isPlaying) { [player pause]; NSLog(@"Pausing:%@",[fileURL absoluteString]); isPlaying = NO; } else { […]
我有一个简短的mp4video文件,我已经添加到我当前的Xcode6testing版项目。 我想在我的应用程序中播放video。 经过几个小时的search,我找不到任何远程帮助。 有什么办法可以用Swift来完成吗?还是你必须使用Objective-C? 我能指出正确的方向吗? 我不能是唯一想知道的人。
我环顾四周,但我找不到AVPlayer class的委托协议。 是什么赋予了? 我使用它的子类AVQueuePlayer来播放一个AVPlayerItems数组,每个AVPlayerItems都从一个URL加载。 当歌曲结束播放时,有什么办法可以调用方法吗? 值得注意的是在队列的末尾? 如果这是不可能的,有什么办法,当歌曲开始播放,缓冲后,我可以调用一种方法? 我试图在那里得到一个加载图标,但是在音乐实际开始之前,即使它在[audioPlayer play]动作之后,它也会closures图标。