AVAudioPlayer的NSOSStatusErrorDomain Code=1685348671错误解决方案

项目有个播放本地音频的功能,在测试过程中发现了一个问题,有些音频可以播放,有些音频播放不了并且报错:NSOSStatusErrorDomain Code=1685348671,代码大致如下:
NSError *playerIninError;
NSURL *audioURL = [NSURL fileURLWithPath:filePath];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL 
error:&playerIninError];

1.直接报错NSOSStatusErrorDomain Code=1685348671,主要奇怪的是同样的两个都是mp3文件格式,一个可以播一个不可以播,后来改用如下方法就又可以播放了。

 NSError *playerIninError;
 NSData *audioData = [NSData dataWithContentsOfFile:filePath];
 _player = [[AVAudioPlayer alloc] initWithData:audioData fileTypeHint:AVFileTypeMPEGLayer3
 error:&playerIninError];

2.我想一定是initWithData 指定了fileTypeHint:AVFileTypeMPEGLayer3指定了音频文件类型就可以播放了,但是改成下面的initWithContentsOfURL:audioURL
fileTypeHint:AVFileTypeMPEGLayer3还是不行。

NSError *playerIninError;
NSURL *audioURL = [NSURL fileURLWithPath:filePath];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL 
fileTypeHint:AVFileTypeMPEGLayer3  error:&playerIninError];

3.查看了两个mp3文件除了采样率不一样没发现其他的不同,

AVAudioPlayer的NSOSStatusErrorDomain Code=1685348671错误解决方案_第1张图片
不可以播的MP3文件.png

AVAudioPlayer的NSOSStatusErrorDomain Code=1685348671错误解决方案_第2张图片
可以播的MP3文件.png

4.我用了ffmpeg查看了两个音频信息发现:
a.不能播放的mp3文件其实是音频编码格式其实是wav格式。
b.而正常的mp3文件个音频编码格式是mp3.
c.所以可以推断的是如果没有用fileTypeHint:AVFileTypeMPEGLayer3 ,指定解码格式的时候,AVAudioPlayer其实其实是根据二进制的音频流信息自动解码,解码出的音频格式和播放格式不符所以出错。
d.而指定了音频格式后,强制将wav的音频文件解码成mp3格式并且播放,是支持的<个人理解,并不代表官方说法,如有不当之处欢迎指正>。

1.mp3
bgm.mp3

你可能感兴趣的:(AVAudioPlayer的NSOSStatusErrorDomain Code=1685348671错误解决方案)