【发布时间】:2018-08-10 19:43:56
【问题描述】:
我正在以编程方式生成一个音频文件,并且我想向其中添加元数据,例如标题和艺术家。我并不特别关心文件是用什么格式写入的,只要 AVPlayer 会读取它并将其发送到播放设备即可。 (整个目标是将生成的音频及其音轨名称发送到蓝牙设备。我很高兴探索在 iPhone 上实现这一目标的更简单方法,无需写入文件或直接将元数据添加到文件中。)
到目前为止,我发现 AVAssetWriter 通常只会丢弃它不理解的元数据,而不会产生错误,所以我在尝试找出可以接受的文件格式和键的组合时有点磕磕绊绊。到目前为止,我还没有找到可以自动生成 AVAssetWriter 将添加任何元数据的文件格式。例如:
let writer = try AVAssetWriter(outputURL: output, fileType: .aiff)
let title = AVMutableMetadataItem()
title.identifier = .commonIdentifierTitle
title.dataType = kCMMetadataBaseDataType_UTF8 as String
title.value = "The Title" as NSString
writer.metadata = [title]
// setup the input and write the file.
我还没有找到将在文件中包含此元数据的标识符或文件类型(我实际上可以生成)的任何组合。
我目前的做法是将文件创建为 AIFF,然后使用 AVAssetExportSession 将其重写为 m4a。使用它我已经能够添加足够的元数据,iTunes 将显示标题。但是,Finder 的“文件信息”无法读取标题(它适用于 iTunes m4a 文件)。我的假设是,如果它甚至没有出现在“文件信息”中,它就不会通过蓝牙发送(我很快就会对此进行测试,但我手边没有我需要的硬件)。
研究 iTunes m4a 文件,我发现了一些无法用 AVMetadataItem 重新创建的标签。例如,排序名称 (sonm)。我不知道如何编写不是已知标识符之一的标签(我已经测试了所有 263 个 AVMetadataIdentifiers)。
有了这个背景,我的核心问题:
- AVPlayer 读取哪些元数据标签并将其发送到蓝牙设备(即 AVRCP)?
- 是否可以使用 AVAssetWriter 直接将元数据写入支持线性 PCM(或其他一些易于生成的格式)的文件格式?
- 给定一个与任何 AVMetadataIdentifiers 都不匹配的已知标记/值),是否可以将其写入 AVAssetExportSession 中?
我稍后会探索第三方 id3 框架,但如果可能的话,我想用 AVFoundation(或其他内置框架)来实现它。
【问题讨论】:
-
如果我没记错的话,它与
value的格式有关。我不确定您是否不应该将Data放在那里(utf8 编码字符串)。还要确保设置keySpace。 -
一个想法 - AVRCP 承载的标题信息是否有可能通过
MPNowPlayingInfoCenter的nowPlayingInfo发送?AVPlayer对蓝牙配置文件了解这么多让我有点害怕。 -
@Sulthan 谢谢;是的,我试过了。我认为这不是问题,因为我可以让它将元数据存储在 m4a(通过导出)中,而无需转换为数据。
-
@RhythmicFistman 通过 Twitter,我认为你真的很感兴趣。这将是我的下一个探索。再次感谢。 twitter.com/cocoaphony/status/969610237761159168
-
嘿@RobNapier 解决方案是什么? :)
标签: ios avfoundation id3 avrcp