通过 AVMetaDataItem 写入 ID3 标签

Tee*_*jay 5 avaudiorecorder avassetexportsession avmetadataitem swift

我正在使用以下命令将 ID3 标签写入文件AVMetaDataItem

var soundFileMetadata = [AVMetadataItem]()

soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyArtist, "MyArtist")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeySongName, "MySong")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyAlbum, "MyAlbum")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyUserGenre, "MyGenre")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyComposer, "MyComposer")!)
Run Code Online (Sandbox Code Playgroud)

这是createMetadata方便的方法:

func createMetadata(tagKey: String, _ tagValue: AnyObject?,
                    keySpace:String = AVMetadataKeySpaceiTunes) -> AVMutableMetadataItem? {
    if let tagValue = tagValue {       
        let tag = AVMutableMetadataItem()
        tag.keySpace = keySpace
        tag.key = tagKey
        tag.value = (tagValue as? String) ?? (tagValue as? Int)
        return tag
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试也写年份标签,但没有成功:

let comps = NSDateComponents()
comps.year = 2010;

let yearTag = AVMutableMetadataItem()
yearTag.keySpace = AVMetadataKeySpaceID3
yearTag.key = AVMetadataID3MetadataKeyYear
yearTag.value = NSCalendar.currentCalendar().dateFromComponents(comps)

soundFileMetadata.append(yearTag)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我收到此错误:

FigMetadataCreateConverter signalled err=-12482 (kFigMetadataConverterError_UnsupportedFormat) (Unsupported format conversion) at /SourceCache/CoreMedia/CoreMedia-1562.238/Prototypes/Metadata/Converters/FigMetadataConverterCommon.c line 118
Run Code Online (Sandbox Code Playgroud)

请注意,这是在控制台中打印的一个简单错误,而不是异常!

将其写为 a String、 oInt甚至 aFloat也会导致同样的错误。曲目/光盘计数、曲目/光盘编号标签也是如此。

第一个问题是:如何写它们?

我还有另一个问题。

目前我有一个AVAudioRecorder,我发现无法将标签直接写入记录器的输出文件,因此我提交记录器文件,使用以下命令打开它AVURLAsset并使用以下命令重新导出它AVAssetExportSession

self.recorder.stop()

let urlAsset = AVURLAsset(URL: srcSoundFileURL)
let assetExportSession: AVAssetExportSession! = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetPassthrough)

assetExportSession.outputFileType = AVFileTypeAppleM4A
assetExportSession.outputURL = tmpSoundFileURL
assetExportSession.metadata = soundFileMetadata

assetExportSession.exportAsynchronouslyWithCompletionHandler({ 
         ....

})
Run Code Online (Sandbox Code Playgroud)

第二个问题是:有什么办法可以避免这种双步操作吗?

aya*_*aio 1

我已经成功地用您的代码添加了年份标签,并进行了一些修改:

let yearTag = AVMutableMetadataItem()
yearTag.keySpace = AVMetadataKeySpaceiTunes
yearTag.key = AVMetadataiTunesMetadataKeyReleaseDate
yearTag.value = "2123"
Run Code Online (Sandbox Code Playgroud)

我无法让它与 ID3 密钥一起使用,所以我认为这可能是问题所在,而且确实它与这些 iTunes 密钥一起工作。此外,该值必须是字符串(或 NSString),而不是日期对象。

在此输入图像描述