我使用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;
}
答案 0 :(得分:3)
为了给TonyMkenu的答案添加一点,AVAsset是一种替代方案,能够为您提供更准确的持续时间。
如果指定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)
AVAudioPlayer似乎只在文件准备播放时返回正确的文件持续时间,因此请在[_audioPlayer play];
在某些压缩格式下,音频播放器可能会更改其持续时间的估计值,因为它通过播放(并因此解码)越来越多的内容来学习越来越多的歌曲 - https://stackoverflow.com/a/16265186
答案 2 :(得分:0)
在我的情况下,将一个音频文件添加到项目然后编辑(使其更长或更短),然后删除并重新添加该文件到Xcode项目是问题。 本质上,该项目正在缓存旧文件。为了调试这个,我将音频文件重命名为其他内容,将新的音频文件添加到项目中,之后播放器报告的持续时间始终是正确的,在调用播放之前和之后。