【问题标题】:AVAudioPlayer initWithContentsOfURL returns nil for AAC/M4A filesAVAudioPlayer initWithContentsOfURL 为 AAC/M4A 文件返回 nil
【发布时间】: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?”)。我通过弧扩展得到的错误代码的四个字母代码是“同步”。

【问题讨论】:

  • 我确实检查了提供的链接。与错误号相关的 4 字母代码是“sync”

标签: ios avaudioplayer aac m4a


【解决方案1】:

找到了解决办法!

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

【讨论】:

  • 遗憾的是,这对我不起作用。我需要应用程序委托方法、回调函数以及在文件中轻松搜索和跳转的能力。有谁知道为什么 AAC 仍然不起作用?更改为 AVPlayer 对我来说将是一次重大的改写。谢谢
  • @MajorHavoc 你找到解决方案了吗?
  • @MajorHavoc 下一个答案中的解决方案 (stackoverflow.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");
   }

【讨论】:

  • 同意检查文件是否存在并不是一个糟糕的第一步。但是根据我的代码,我现在已经知道它存在,因为我之前已经打开过它。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2019-03-15
相关资源
最近更新 更多