的iOS 7 AVPlayer AVPlayerItem持续时间的iOS 7

问题描述:

不正确我在我的应用程序下面的代码:的iOS 7 AVPlayer AVPlayerItem持续时间的iOS 7

NSURL *url = [NSURL fileURLWithPath: [self.DocDir stringByAppendingPathComponent: self.FileName] isDirectory: NO]; 
self.avPlayer = [AVPlayer playerWithURL: url]; 

Float64 duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration); 

这工作得很好与iOS 6,但与iOS 7由于某种原因,返回NaN。在检查self.avPlayer.currentItem.duration时,CMTime对象具有0的标志为17.

有趣的是,玩家工作正常,只是持续时间是错误的。

是否有其他人遇到过相同的问题?我输入以下内容:

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 
#import <MediaPlayer/MediaPlayer.h> 
#import <CoreMedia/CoreMedia.h> 
#import <AVFoundation/AVAsset.h> 

与初始化我来到一个可行的解决方案的对象不同的方式玩耍后:

AVURLAsset *asset = [AVURLAsset assetWithURL: url]; 
Float64 duration = CMTimeGetSeconds(asset.duration); 
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset: asset]; 
self.avPlayer = [[AVPlayer alloc] initWithPlayerItem: item]; 

它出现的持续时间值从并非总是立即可用AVPlayerItem,但它似乎与AVAsset立即正常工作。

+0

嗨 这并不适用于我。任何其他的选择? – Nitesh

+0

嗨Nitesh,请在新线程中提问你的问题,显示你的一些代码和你得到的错误。 –

+2

我还在使用[[AVPlayer currentItem]持续时间],它会在iOS 7中返回NaN以获取有效的媒体文件。在iOS 6中,如果它返回NaN,则意味着该文件无法播放。切换到AVURLAsset的想法解决了这个问题。 – Deminetix

在iOS系统7,对于AVPlayerItem已经创建,您还可以从垫层资产获取时间:

CMTimeGetSeconds([[[[self player] currentItem] asset] duration]); 

,而不是直接从AVPlayerItem得到它,它给你一个楠:

CMTimeGetSeconds([[[self player] currentItem] duration]); 
+0

感谢您的支持! – JKoko

+0

太棒了!谢谢 – SpaceDog

这样做的推荐方式,如the manual中所述,通过观察玩家物品状态:

[self.avPlayer.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionInitial context:nil]; 

然后,里面observeValueForKeyPath:ofObject:change:context

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    // TODO: use either keyPath or context to differentiate between value changes 
    if (self.avPlayer.currentItem.status == AVPlayerStatusReadyToPlay) { 
     Float64 duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration); 
     // ... 
    } 
} 

此外,请确保您删除观察者当您更改播放器项目:

if (self.avPlayer.currentItem) { 
    [self.avPlayer.currentItem removeObserver:self forKeyPath:@"status"]; 
} 

顺便说一句,你还可以直接观察duration财产;然而,这是我个人的经验,结果不如他们应该可靠;-)

+0

可悲的是,这不适用于iOS 10.x – user3069232

+0

@ user3069232通过“不工作”,你是什么意思?你有什么看法? –

+0

它返回nan ...我结束了使用AVURLAsset和您在此使用的AVPlayer状态的组合。 – user3069232