将元数据添加到生成的音频文件

时间:2018-03-02 15:00:15

标签: ios avfoundation id3 avrcp

我以编程方式生成音频文件,并且我想向其添加元数据,例如标题和艺术家。我并不特别关心文件的格式,只要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个AVMetadataIdentifier)。

在此背景下,我的核心问题是:

  • AVPlayer读取哪些元数据标签并发送到蓝牙设备(即AVRCP)?
  • 是否可以直接将AVAssetWriter的元数据写入支持线性PCM(或其他一些易于生成的格式)的文件格式?
  • 如果已知的标记/值与任何AVMetadataIdentifiers都不匹配,是否可以在AVAssetExportSession中写入它?

我稍后会探索第三方id3框架,但如果可能的话,我想用AVFoundation(或其他内置框架)来实现它。

1 个答案:

答案 0 :(得分:0)

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

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

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

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