AVAudioPlayer返回错误的文件持续时间

时间:2014-05-12 10:49:28

标签: ios objective-c avaudioplayer

我使用AVAudioPlayer播放音频文件,使用UISlider显示用户当前时间。首先,它看起来一切都很好,但我注意到音频播放器返回错误的文件持续时间。例如,它返回持续时间等于3.5秒,但文件持续时间等于6秒。实际上。

你知道什么会导致这个问题吗?

下面你可以看到我的代码返回文件持续时间:

- (NSTimeInterval)audioDurationAtURL:(NSURL *)url
{
   NSError *error;
   NSData *data = [NSData dataWithContentsOfURL:url];
   _audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];
   return _audioPlayer.duration;
}

3 个答案:

答案 0 :(得分:3)

为了给TonyMkenu的答案添加一点,AVAsset是一种替代方案,能够为您提供更准确的持续时间。

https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAsset_Class/Reference/Reference.html#//apple_ref/occ/instp/AVAsset/duration

如果指定providePreciseDurationAndTiming = YES,则AVAsset将根据需要对文件进行解码,以准确确定其持续时间。如果解码时间太长,您可以将其禁用。

在我的情况下,我使用AVURLAsset子类:

            AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:localURL options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]];
            float t = CMTimeGetSeconds(asset.duration);

答案 1 :(得分:1)

  1. AVAudioPlayer似乎只在文件准备播放时返回正确的文件持续时间,因此请在[_audioPlayer play];

  2. 之后检查音频文件的长度
  3. 在某些压缩格式下,音频播放器可能会更改其持续时间的估计值,因为它通过播放(并因此解码)越来越多的内容来学习越来越多的歌曲 - https://stackoverflow.com/a/16265186

答案 2 :(得分:0)

在我的情况下,将一个音频文件添加到项目然后编辑(使其更长或更短),然后删除并重新添加该文件到Xcode项目是问题。 本质上,该项目正在缓存旧文件。为了调试这个,我将音频文件重命名为其他内容,将新的音频文件添加到项目中,之后播放器报告的持续时间始终是正确的,在调用播放之前和之后。