AudioPlayer iOS 和 m4a
Posted
技术标签:
【中文标题】AudioPlayer iOS 和 m4a【英文标题】:AudioPlayer iOS and m4a 【发布时间】:2013-04-20 00:40:41 【问题描述】:我制作了一个使用 AVAudioPlayer 播放音乐的应用。它上传或下载歌曲,将它们写入核心数据,然后在选择时调用它们进行播放。我测试过的所有 15 首歌曲都可以在 iPhone 音乐客户端和我自己的电脑上正常运行。
但是,其中三个没有在应用程序上播放。具体来说,我可以按任意顺序上传这十五首歌曲,清空我的Model.sqlite,重新下载到应用程序中,发现其中三首根本不播放。但是,他们确实有正确的标题和艺术家。
对此,我注意到不同之处在于非工作文件是 .m4a。如何使用 AVAudioPlayer 播放该格式的文件?
EDIT ("Whats "recalling?", 你用什么 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。
【问题讨论】:
【参考方案1】:这不是直接的解决方案,但您可能直接shouldn't be saving the blobs in Core Data。将文件写入缓存位置并将文件路径保存在 Core Data 中。这将更有效地使用数据库并为您提供本地文件路径以提供给您的 AVAudioPlayer,这将绕过该问题。
【讨论】:
或者,如果您使用 Core Data 中的选项来允许外部存储,您可以在此答案之后找到位置:***.com/questions/9801944/… 但这仅适用于超过一定大小的对象(目前1 MB) 我调整了应用程序以正常工作。我将数据保存到本地 url dataLocation,然后将该字符串保存到 coremodel。这适用于常规歌曲,但仍然不适用于 m4a。我发现了这个***.com/questions/10545658/…,它似乎描述了同样的问题。当我执行导出会话时,我确实得到了一个包含标头信息的更大文件,但现在我遇到了另一个问题,即 s3 putObject 无法接收它。【参考方案2】:你是如何回忆它们来播放的 - 你是否将它们写入具有 m4a 扩展名的临时文件 - 这个 m4a 扩展名可能是必需的。
【讨论】:
我将它们写入核心数据,以唯一 ID 为键,然后在需要播放时通过该 ID 调用它们。 什么是“召回?”,你用什么 URL 初始化 AVAudioPlayer? 已编辑以反映问题等。 为了逗我开心,试着将它们写入一个扩展名为 m4a 的文件,然后播放它们。 您的意思是在应用程序中?还是在电脑上?我还没有实现它,但我正在考虑调整模型,以便不将数据保存为字段,而是将文件 url 保存为字段,并在该位置写入实际数据,类似于第二个答案链接的SO。然后我可以使用 initWithContentsOfUrl【参考方案3】:您确定 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,而是格式。
【讨论】:
是的,iOS 支持 .m4a,所有文件通过常规方式在 iPhone 上播放都没有问题。以上是关于AudioPlayer iOS 和 m4a的主要内容,如果未能解决你的问题,请参考以下文章
扑。任务“:audioplayer:verifyReleaseResources”执行失败
使用 Apple 新的 AudioEngine 改变 AudioPlayer 声音的 Pitch