AVAudioPlayer的NSOSStatusErrorDomain Code=1685348671錯誤解決方案

項目有個播放本地音頻的功能,在測試過程中發(fā)現(xiàn)了一個問題,有些音頻可以播放,有些音頻播放不了并且報錯: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文件除了采樣率不一樣沒發(fā)現(xiàn)其他的不同,

不可以播的MP3文件.png

可以播的MP3文件.png

4.我用了ffmpeg查看了兩個音頻信息發(fā)現(xiàn):
a.不能播放的mp3文件其實是音頻編碼格式其實是wav格式。
b.而正常的mp3文件個音頻編碼格式是mp3.
c.所以可以推斷的是如果沒有用fileTypeHint:AVFileTypeMPEGLayer3 ,指定解碼格式的時候,AVAudioPlayer其實其實是根據(jù)二進制的音頻流信息自動解碼,解碼出的音頻格式和播放格式不符所以出錯。
d.而指定了音頻格式后,強制將wav的音頻文件解碼成mp3格式并且播放,是支持的<個人理解,并不代表官方說法,如有不當之處歡迎指正>。

1.mp3
bgm.mp3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容