AVAudioPlayer initWithContentsOfURL 为 AAC/M4A 文件返回 nil

Posted

技术标签:

【中文标题】AVAudioPlayer initWithContentsOfURL 为 AAC/M4A 文件返回 nil【英文标题】:AVAudioPlayer initWithContentsOfURL returns nil for AAC/M4A files 【发布时间】:2013-12-04 22:40:38 【问题描述】:

我使用以下代码播放音频文件。它可以很好地播放 MP3 文件,但是当我尝试播放 AAC 文件时,[[AVAudioPlayer alloc] initWithContentsOfURL:] 返回nil,我收到以下错误:

Error Domain=NSOSStatusErrorDomain Code=1937337955 "The operation couldn’t be completed. (OSStatus error 1937337955.)"

音频文件在 Mac 和 iPhone 上播放良好(当我通过电子邮件将其发送给自己时)并且在这里:https://dl.dropboxusercontent.com/u/2667666/song.aac

NSError *setCategoryError = nil;
[[AVAudiosession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&setCategoryError];

// Create audio player with background music
NSString *backgroundMusicPath = [[NSBundle mainBundle] pathForResource:@"song" ofType:@"aac"];
NSURL *backgroundMusicURL = [NSURL fileURLWithPath:backgroundMusicPath];
NSError *error;
_backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error];
if (!_backgroundMusicPlayer) 
    NSLog(@"_backgroundMusicPlayer pointer is null!!");

[_backgroundMusicPlayer setDelegate:self];  // We need this so we can restart after interruptions
[_backgroundMusicPlayer prepareToPlay];
[_backgroundMusicPlayer play];

更新:如果我将文件的扩展名从 aac 更改为 m4a,错误代码将更改为 1954115647(其四个字母代码为“tip?”)。我通过弧扩展得到的错误代码的四个字母代码是“同步”。

【问题讨论】:

见following 我确实检查了提供的链接。与错误号相关的 4 字母代码是“sync” 【参考方案1】:

找到了解决办法!

事实证明,如果我只是使用 AVPlayer 而不是 AVAudioPlayer,并且如果我使用 .acc 作为文件的扩展名,那么它可以正常播放。现在我可以同时播放 aac 和 mp3 文件了。

【讨论】:

遗憾的是,这对我不起作用。我需要应用程序委托方法、回调函数以及在文件中轻松搜索和跳转的能力。有谁知道为什么 AAC 仍然不起作用?更改为 AVPlayer 对我来说将是一次重大的改写。谢谢 @MajorHavoc 你找到解决方案了吗? @MajorHavoc 下一个答案中的解决方案 (***.com/a/21729842/930450) 为我修复了它【参考方案2】:

使用initWithData:error: 初始化音频播放器可以解决这个问题。 例如:

NSData* data = [NSData dataWithContentsOfURL:url] ;
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:outError];

令人失望的是,苹果基于扩展名初始化他们的音频播放器,而不是查看二进制数据并试图找出他们收到的数据类型。

【讨论】:

这是我初始化音频播放器的方式。还是不行。你能提供更多细节吗? @MajorHavoc 文件类型是什么?你是怎么编码的? 该文件的“扩展名”为 aac。该文件是应用程序捕获并保存在 Bundle 中的 AAC 流的原始捕获。该文件在 Mac 上作为预览(空格键)、在 VLC(将自身标识为 AAC 文件)和其他播放器中播放。使用 AVPlayer 框架也可以正常播放。但是,该应用程序需要 AVAudioPlayer 的回调方法和接口元素(我允许前后跳转 30、查找下一项等)。感谢您的帮助。 您介意上传文件@MajorHavoc 吗?另外,你得到什么类型的错误? AVAudioPlayer 是否实例化? 不,我可以做很多。我应该把它放在哪里?我可以在这里上传吗?还有就是上面提到的错误:Code=1937337955【参考方案3】:

.aac文件可以播放,试试看文件是否存在?

   NSFileManager *filemgr = [NSFileManager defaultManager];
   if ([filemgr fileExistsAtPath: backgroundMusicPath ] == YES)
   
        NSLog(@"find file");
   

【讨论】:

同意检查文件是否存在并不是一个糟糕的第一步。但是根据我的代码,我现在已经知道它存在,因为我之前已经打开过它。

以上是关于AVAudioPlayer initWithContentsOfURL 为 AAC/M4A 文件返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AVAudioPlayer 没有响应?

斯威夫特:非托管 AVAudioPlayer

声音 AVAudioPlayer 不工作

AVAudioPlayer

iPhone:AVAudioPlayer 是不是支持 .wav 格式?

AVAudioPlayer 行为处理问题