項(xiàng)目有個(gè)播放本地音頻的功能,在測(cè)試過(guò)程中發(fā)現(xiàn)了一個(gè)問(wèn)題,有些音頻可以播放,有些音頻播放不了并且報(bào)錯(cuò):NSOSStatusErrorDomain Code=1685348671,代碼大致如下:
NSError *playerIninError;
NSURL *audioURL = [NSURL fileURLWithPath:filePath];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL
error:&playerIninError];
1.直接報(bào)錯(cuò)NSOSStatusErrorDomain Code=1685348671,主要奇怪的是同樣的兩個(gè)都是mp3文件格式,一個(gè)可以播一個(gè)不可以播,后來(lái)改用如下方法就又可以播放了。
NSError *playerIninError;
NSData *audioData = [NSData dataWithContentsOfFile:filePath];
_player = [[AVAudioPlayer alloc] initWithData:audioData fileTypeHint:AVFileTypeMPEGLayer3
error:&playerIninError];
2.我想一定是initWithData 指定了fileTypeHint:AVFileTypeMPEGLayer3指定了音頻文件類(lèi)型就可以播放了,但是改成下面的initWithContentsOfURL:audioURL
fileTypeHint:AVFileTypeMPEGLayer3還是不行。
NSError *playerIninError;
NSURL *audioURL = [NSURL fileURLWithPath:filePath];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL
fileTypeHint:AVFileTypeMPEGLayer3 error:&playerIninError];
3.查看了兩個(gè)mp3文件除了采樣率不一樣沒(méi)發(fā)現(xiàn)其他的不同,

不可以播的MP3文件.png

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

1.mp3

bgm.mp3