的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立即正常工作。
这样做的推荐方式,如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
财产;然而,这是我个人的经验,结果不如他们应该可靠;-)
可悲的是,这不适用于iOS 10.x – user3069232
@ user3069232通过“不工作”,你是什么意思?你有什么看法? –
它返回nan ...我结束了使用AVURLAsset和您在此使用的AVPlayer状态的组合。 – user3069232
嗨 这并不适用于我。任何其他的选择? – Nitesh
嗨Nitesh,请在新线程中提问你的问题,显示你的一些代码和你得到的错误。 –
我还在使用[[AVPlayer currentItem]持续时间],它会在iOS 7中返回NaN以获取有效的媒体文件。在iOS 6中,如果它返回NaN,则意味着该文件无法播放。切换到AVURLAsset的想法解决了这个问题。 – Deminetix