iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确相关的知识,希望对你有一定的参考价值。

我的应用程序中有以下代码:

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一起正常工作。

另一答案

在iOS 7中,对于已创建的AVPlayerItem,您还可以从基础资产获取持续时间:

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

而不是直接从AVPlayerItem获取它,它给你一个NaN:

CMTimeGetSeconds([[[self player] currentItem] duration]);
另一答案

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的财产;然而,这是我个人的经验,结果并不像他们应该的那样可靠;-)

另一答案

Swift版本

你可以使用AVAsset获得持续时间,这是AVPlayerItem属性:

func getVideoDuration(from player: AVPlayer) -> Double? {
    guard let duration = player.currentItem?.asset.duration else { return nil }
    let durationSeconds = CMTimeGetSeconds(duration)
    return durationSeconds
}

或者从头开始创建AVAsset

func getVideoDuration(for videoUrl: URL) -> Double {
    let asset = AVAsset(url: videoUrl)
    let duration = asset.duration
    let durationSeconds = CMTimeGetSeconds(duration)
    return durationSeconds
}

以上是关于iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7(子层)AVPlayer Fullscreen animate 需要上面(覆盖)UINavigationBar

AVPlayer 从 iOS 7 后台通知播放音频

iOS 7 使用 AVPlayer 在锁定屏幕上倒带歌曲

在 iOS 7 和 8 中使用 AVPlayer 进行远程控制

iOS 7 对 videoPlayer 的模糊效果

iOS - AVPlayer 音视频播放