标签: avplayer

如何检测AVPlayer视频何时结束播放?

我正在使用AVPlayer在Swift中播放本地视频文件(mp4).有没有人知道如何检测视频完成播放?谢谢

iphone ios avplayer swift

56
推荐指数
8
解决办法
5万
查看次数

使用AVPlayer时保持良好的滚动性能

我正在开发一个有集合视图的应用程序,集合视图的单元格可以包含视频.现在我正在用AVPlayer和显示视频AVPlayerLayer.不幸的是,滚动性能很糟糕.看起来AVPlayer,AVPlayerItemAVPlayerLayer做了很多工作的主线上.他们不断拿出锁,等待信号量等,这阻碍了主线程并导致严重的帧丢失.

有没有办法告诉AVPlayer停止在主线程上做这么多事情?到目前为止,我所尝试的一切都没有解决问题.

我也试过使用构建一个简单的视频播放器AVSampleBufferDisplayLayer.使用它我可以确保一切都发生在主线程之外,我可以在滚动和播放视频时达到~60fps.不幸的是,这种方法的级别要低得多,而且它不提供开箱即用的音频播放和时间擦除等功能.有没有办法获得类似的表现AVPlayer?我更愿意使用它.

编辑: 在进一步研究之后,看起来在使用时可能无法实现良好的滚动性能AVPlayer.创建一个AVPlayer并与一个AVPlayerItem实例关联开始了一大堆蹦床到主线程的工作,然后它在信号量上等待并尝试获取一堆锁.随着滚动视图中视频数量的增加,停止主线程的时间量会急剧增加.

AVPlayerdealloc似乎也是一个巨大的问题.Dealloc'ing an AVPlayer也尝试同步一堆东西.再次,当你创造更多的球员时,这会非常糟糕.

这非常令人沮丧,它AVPlayer几乎无法用于我正在尝试的事情.阻止像这样的主线程这样做是一件非常业余的事情,很难相信苹果工程师会犯这种错误.无论如何,希望他们能尽快解决这个问题.

video avfoundation ios avplayer

56
推荐指数
3
解决办法
1万
查看次数

当UIView帧更改时,视图内的AVPlayer图层不会调整大小

我有一个UIView包含AVPlayer显示视频的内容.更改方向时,我需要更改视频的大小和位置.

我对调整图层大小没有经验,所以我在调整视频大小时遇到​​了问题.

我首先创建AVPlayer并将其播放器添加到我的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;
Run Code Online (Sandbox Code Playgroud)

然后,稍后,我将更改videoHolderView框架的大小和位置:

[videoHolderView setFrame:CGRectMake(0, 0, 768, 502)];
Run Code Online (Sandbox Code Playgroud)

此时,我需要avPlayer调整大小到这些相同的维度.这不会自动发生 - avPlayer在videoHolderView中保持小尺寸.

如果有人可以提供帮助,我真的很感激任何建议.

多谢你们.

objective-c calayer uiview avplayer

52
推荐指数
7
解决办法
6万
查看次数

AVPlayer和视频的屏幕截图

我试图AVPlayer在一个更大的视图内截取屏幕截图.我想只构建一个测试框架,所以私有APIs或任何方法都是好的,因为在发布到AppStore时不会包含框架.

我试过用

  • UIGetScreenImage() :在模拟器上运行良好但在设备上运行不正常
  • snapshotviewafterscreenupdates:它显示视图,但我不能创建一个UIImage.
  • drawViewInHierarchy并且renderInContext不会合作AVPlayer
  • 我不想AVAssetGenerator用于从视频中获取图像,很难获得良好的坐标或视频播放器作为其他视图的子视图

testing objective-c avfoundation ios avplayer

48
推荐指数
2
解决办法
4931
查看次数

AVPlayer在缓冲音频流的开始时"冻结"应用程序

我正在使用一个子类,AVQueuePlayer当我添加新AVPlayerItem的流媒体URL时,应用程序会冻结大约一两秒钟.通过冻结我的意思是它不响应UI上的触摸.此外,如果我已经播放了一首歌曲,然后将另一首歌曲添加到队列中,AVQueuePlayer则会自动开始预加载该歌曲,同时它仍在播放第一首歌曲.这使得应用程序不会响应UI上的触摸两秒钟,就像添加第一首歌但歌曲仍在播放时一样.所以这意味着AVQueuePlayer在主线程中做了一些导致明显"冻结"的事情.

insertItem:afterItem:用来添加我的AVPlayerItem.我测试并确保这是造成延迟的方法.也许它可能是在将它添加到队列AVPlayerItem时被激活的东西AVQueuePlayer.

必须指出我使用Dropbox API v1 beta通过使用此方法调用来获取流式URL:

[[self restClient] loadStreamableURLForFile:metadata.path];
Run Code Online (Sandbox Code Playgroud)

然后,当我收到流URL时,我将其发送到AVQueuePlayer如下:

[self.player insertItem:[AVPlayerItem playerItemWithURL:url] afterItem:nil];
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:我该如何避免这种情况?我应该在没有帮助的情况下自己预加载音频流AVPlayer吗?如果是这样,我该怎么做?

谢谢.

dropbox audio-streaming ios avplayer avqueueplayer

46
推荐指数
3
解决办法
1万
查看次数

暂停播放时,MPNowPlayingInfoCenter无法正常响应

我正在尝试让MPNowPlayingInfoCenter在暂停播放时正常工作.(我有一个使用AVPlayer播放的流媒体音乐应用程序,我正在通过Airplay播放我的Apple TV.)除了暂停之外的所有内容似乎都在Apple TV UI中正确反映出来.我正在初始化它像这样:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtist: artist
};
center.nowPlayingInfo = songInfo;
Run Code Online (Sandbox Code Playgroud)

由于我正在播放,因此在开始播放时我没有持续时间信息.当我从流中获得"就绪"信号时,我会更新Apple TV上正确显示的持续时间:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];
[playingInfo setObject:[NSNumber numberWithFloat:length] forKey:MPMediaItemPropertyPlaybackDuration];
center.nowPlayingInfo = playingInfo;
Run Code Online (Sandbox Code Playgroud)

当用户寻找音轨时,我也可以使用这种技术:

[playingInfo setObject:[NSNumber numberWithFloat:length * targetProgress] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的一件事是,如何暂停Apple TV上的播放头.当用户在我的UI中点击暂停时,我正在尝试执行以下操作:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];        
[playingInfo setObject:[NSNumber numberWithFloat:0.0f] forKey:MPNowPlayingInfoPropertyPlaybackRate];            
center.nowPlayingInfo = playingInfo;
Run Code Online (Sandbox Code Playgroud)

这不是暂停,而是将播放头追回到零并继续前进.

如何让播放头在Apple TV UI中正确暂停?

ios avplayer airplay mpnowplayinginfocenter

45
推荐指数
2
解决办法
1万
查看次数

从AVPlayer对象访问URL?

有没有办法从已使用URL初始化的AVPlayer对象访问URL,如下所示:

NSURL *url = [NSURL URLWithString: @"http://www.example.org/audio"];
self.player = [AVPlayer playerWithURL: url];
Run Code Online (Sandbox Code Playgroud)

ios avplayer

43
推荐指数
4
解决办法
2万
查看次数

RTCReporting&pancake.apple.com错误

昨天我将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: can't get storebag from the server
Run Code Online (Sandbox Code Playgroud)

更新:我以前没有发现任何伤害,但现在我的应用程序挂起(在模拟器中)约5秒,而我只是准备好播放项目(在我按下播放之前).如果我在挂起期间按暂停,则以下是调试导航器显示的内容:

当应用程序在5秒后解冻时,只会记录以下内容:

RTCReporting: resolve from http://pancake.apple.com/bags/hls?version=4.12
Run Code Online (Sandbox Code Playgroud)

关于"答案"的说明:

我正在寻找与我提出的问题有关的非显而易见的解释.

ios avplayer

41
推荐指数
2
解决办法
2万
查看次数

在UITableView中更改AVPlayer的playerItem

我有一个UITableView包含滚动时要播放的视频.由于tableView中的单元格正在被重用,我只会AVPlayer为每一行实例化一个.当一个单元被重用时,我只需PlayerItem通过调用来改变单元的播放器[self.player replaceCurrentItemWithPlayerItem:newItem];.目前这是内部间接调用的tableView:cellForRowAtIndexPath.向下滚动时,重新使用时会出现明显的延迟.通过消除过程,我得出结论,滞后是replaceCurrentItemWithPlayerItem在它开始播放之前引起的.当删除这一行代码(阻止播放器获取新视频)时,滞后消失.

我试图解决它:

我有一个UITableViewCell播放这些视频的自定义,我在这些视频中创建了一个方法,用来自对象的新信息进行初始化.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;
        }
    }/*...*/
}
Run Code Online (Sandbox Code Playgroud)

运行此操作时,我得到的结果与完全删除更换项目的调用相同.显然,这个函数不能被线程化.我不完全确定我对此的期望.我会想象我需要一个干净copyAVPlayer这个工作,但搜索了一下后,我发现了一些意见指出,replaceCurrentItemWithPlayerItem:不能在一个单独的线程,这是没有意义的我被调用.我知道UI元素永远不应该在除main/UI-thread之外的其他线程中处理,但我绝不会想到replaceCurrentItemWithPlayerItem属于这个类别.

我现在正在寻找一种方法来改变一个AVPlayer没有滞后的项目,但找不到任何.我希望我已经理解了这个函数的错误,并且有人会纠正我.

编辑: 我现在已被告知此调用已经线程化,这不应该发生.但是,我没有看到其他解释..下面是我的cellForRowAtIndexPath:.它位于自定义内UITableView,委托设置为self(so self …

multithreading cocoa-touch objective-c ios avplayer

40
推荐指数
1
解决办法
5310
查看次数

AVPlayer停止播放,不再恢复

在我的应用程序中,我必须播放存储在Web服务器上的音频文件.我正在使用AVPlayer它.我有所有播放/暂停控件和所有代表和观察员在那里工作得非常好.在播放小音频文件时,一切都很棒.

播放长音频文件时,它也会开始正常播放,但几秒后AVPlayer暂停播放(最可能是缓冲它).问题是它不能再自行恢复.它保持暂停状态,如果我再次手动按下播放按钮,它将再次流畅播放.

我想知道为什么AVPlayer不自动恢复,如何在没有用户再次按下播放按钮的情况下再次恢复音频?谢谢.

audio avfoundation ios avplayer

39
推荐指数
5
解决办法
3万
查看次数