我制作了一个使用 AVAudioPlayer 播放音乐的应用程序。它上传或下载歌曲,将它们写入核心数据,然后在选择时调用它们来播放。我测试过的所有 15 首歌曲都可以在 iPhone 音乐客户端和我自己的电脑上正常运行。
但是,其中三个无法在应用程序上播放。具体来说,我可以按任意顺序上传这十五首歌曲,清除我的 Model.sqlite,再次将它们下载到应用程序中,然后发现其中三首无法播放。然而,他们确实有正确的头衔和艺术家。
对此进行研究,我注意到不同之处在于非工作文件是 .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 不支持的文件类型 https://stackoverflow.com/questions/4901709/iphone-avaudioplayer-unsupported-file-type。那里提出了一个解决方案,要么在开始时修剪掉坏数据,要么从 URL 的内容进行初始化。是否有可能找到数据写入核心模型的位置,以将其作为 URL 提供?
编辑:(比较文件。它们有不同吗?)
是的,他们是。我从我的服务器获取一个由应用程序上传的示例 .m4a 文件,并将其与 iTunes 中的文件进行比较。我发现文件在偏移量 229404(超出 2906191 字节)之前被切断,该偏移量开始20680001 A0000E21
。在 iTunes 版本中,0028D83B 6D646174
位于这些字节之前。在此之前是一大块零,后面是一大块数据,后面是 iTunes 编码信息。最顶部是更多编码信息,将文件列为 M4A。