5

我制作了一个使用 AVAudioPlayer 播放音乐的应用程序。它上传或下载歌曲,将它们写入核心数据,然后在选择时调用它们进行播放。我测试过的所有 15 首歌曲都可以在 iPhone 音乐客户端和我自己的电脑上正常运行。

但是,其中三个没有在应用程序上播放。具体来说,我可以按任意顺序上传这十五首歌曲,清空我的Model.sqlite,重新下载到app里,发现其中三首就是不播放。然而,他们确实有正确的标题和艺术家。

对此进行调查,我注意到不同之处在于非工作文件是 .m4a。如何使用 AVAudioPlayer 播放该格式的文件?

编辑(“什么“召回?”,你用什么 URL 初始化 AVAudioPlayer?”):

有一个服务器,其中包含用户可以通过应用程序访问的歌曲。在选择要检索的子集 S 之后,应用程序会下载 S 并使用 NSManagedObjectContext 将其写入 CoreModel。每首歌曲都存储为具有唯一 ID 和与子集实体(在本例中为 S)的关系的单独实体。

当我使用 AppDelegate “调用”以使用上下文获取正确的歌曲时,数据也会返回。然后我像这样初始化 AVAudioPlayer:

[[AVAudioPlayer alloc] initWithData:(NSData *)[currentSong valueForKey:@"data"] error:nil];

...所以我写了那个然后意识到我实际上并没有检查出错误是什么(愚蠢的我)。我发现它是OSStatus error 1954115647,它作为不支持的文件类型返回。仔细研究一下,我发现了这个iPhone: AVAudioPlayer unsupported file type。那里提出了一种解决方案,即在开始时修剪不良数据或从 URL 的内容进行初始化。是否可以在核心模型中找到数据写入的位置以将其作为 URL 提供?

编辑:(比较文件。它们不同吗?)

对,他们是。我正在从我的服务器上获取一个示例 .m4a 文件,该文件由应用程序上传,并将其与 iTunes 中的文件进行比较。我发现文件在偏移量 229404(共 2906191 个字节)之前被截断,它开始于20680001 A0000E21. 在 iTunes 版本中,0028D83B 6D646174位于这些字节之前。在此之前是一大块零,前面是一大块数据,前面是 iTunes 编码信息。最顶部是更多的编码信息,将文件列为 M4A。

4

3 回答 3

0

您确定 iOS 支持您的编解码器吗?AVAudioPlayer 应该可以播放 iOS 支持的任何格式,您可以在此处阅读支持的格式列表:http: //developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html# //apple_ref/doc/uid/TP40009767-CH2-SW6

我建议您尝试通过 iTunes 手动将这些文件添加到您的设备并在 iPod 中播放,如果它们无法播放,则问题不是您的代码或 sdk,而是格式。

于 2013-04-26T00:19:16.347 回答
0

这不是一个直接的解决方案,但您可能不应该直接在 Core Data 中保存 blob。将文件写入缓存位置并将文件路径保存在 Core Data 中。这将更有效地使用数据库并为您提供本地文件路径以提供给您的 AVAudioPlayer,这将绕过该问题。

于 2013-05-02T17:09:06.937 回答
0

您如何回忆它们播放 - 您是否将它们写入具有 m4a 扩展名的临时文件 - 这个 m4a 扩展名可能是必需的。

于 2013-04-28T14:45:42.153 回答