AVAudioPlayer的NSOSStatusErrorDom
2017-06-14 本文已影响197人
踏遍青山
项目有个播放本地音频的功能,在测试过程中发现了一个问题,有些音频可以播放,有些音频播放不了并且报错: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];
不可以播的MP3文件.png3.查看了两个mp3文件除了采样率不一样没发现其他的不同,
可以播的MP3文件.png
1.mp3 bgm.mp34.我用了ffmpeg查看了两个音频信息发现:
a.不能播放的mp3文件其实是音频编码格式其实是wav格式。
b.而正常的mp3文件个音频编码格式是mp3.
c.所以可以推断的是如果没有用fileTypeHint:AVFileTypeMPEGLayer3 ,指定解码格式的时候,AVAudioPlayer其实其实是根据二进制的音频流信息自动解码,解码出的音频格式和播放格式不符所以出错。
d.而指定了音频格式后,强制将wav的音频文件解码成mp3格式并且播放,是支持的<个人理解,并不代表官方说法,如有不当之处欢迎指正>。