如何获得在iOS的audio文件的持续时间?

NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filename error:nil] 

从文件属性键,你可以得到的date,大小等,但你怎么得到的持续时间?

NSFileManager类引用的“文件属性键”中,可以看到没有使用的键将返回歌曲的持续时间。 NSFileManager实例获取文件的所有信息都与操作系统中实际文件本身的属性(如文件大小)有关。 NSFileManager实际上不解释文件。

为了获得文件的持续时间,你需要使用一个知道如何解释文件的类。 AVFoundation框架提供您需要的确切类, AVAsset 。 你可以使用具体的子类AVURLAsset实例化这个抽象类的实例,然后为它提供一个NSURL ,指向你想获得持续时间的audio文件。 然后,您可以通过查询其duration属性从AVAsset实例获取持续duration

例如:

 AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil]; CMTime audioDuration = audioAsset.duration; float audioDurationSeconds = CMTimeGetSeconds(audioDuration); 

请注意,AVFoundation被devise为一个严重asynchronous的框架,以提高性能和整体的用户体验。 即使执行简单的任务,例如查询媒体文件的持续时间,也可能需要很长一段时间,并可能导致应用程序挂起。 您应该使用AVAsynchronousKeyValueLoading协议来asynchronous加载歌曲的持续时间,然后在完成处理程序块中更新您的UI。 您应该查看“Block Programming Guide”以及WWDC2010video“Discovering AV Foundation”,该video可在https://developer.apple.com/videos/wwdc/2010免费获取。;

为了完整性 – 还有另一种方法来获得一个MP3文件的持续时间:

 NSURL * pathToMp3File = ... NSError *error = nil; AVAudioPlayer* avAudioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:pathToMp3File error:&error]; double duration = avAudioPlayer.duration; avAudioPlayer = nil; 

我用这个没有明显的延迟。