我以编程方式生成音频文件,并且我想向其添加元数据,例如标题和艺术家。我并不特别关心文件的格式,只要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)。
在此背景下,我的核心问题是:
我稍后会探索第三方id3框架,但如果可能的话,我想用AVFoundation(或其他内置框架)来实现它。
答案 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文件。