我正在以编程方式生成一个音频文件,我想向其中添加元数据,例如标题和艺术家。我并不特别关心文件是用什么格式写入的,只要 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(或其他内置框架)来实现它。