7

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

4

1 回答 1

1

我已经能够使用AVAssetWriteriTunes 密钥空间将元数据值存储在 .m4a 文件中:

let songID = AVMutableMetadataItem()
songID.value = "songID" as NSString
songID.identifier = .iTunesMetadataSongID

let songName = AVMutableMetadataItem()
songName.value = "songName" as NSString
songName.identifier = .iTunesMetadataSongName

您可以通过在设置输入对象时指定正确的设置直接使用压缩的 .m4a 文件AVAssetWriter,因此无需使用中间 AIFF 文件。

于 2018-08-12T18:57:55.120 回答