我制作了一个使用 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。