我正在使用AVMetaDataItem将ID3标签写入文件 var soundFileMetadata = [AVMetadataItem]()soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyArtist, "MyArtist")!)soundFileMetadata.append(createMetadata(AVMetadataiTunes
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")!)
这是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 }
然后我尝试写年份标签,但没有成功:
let comps = NSDateComponents() comps.year = 2010; let yearTag = AVMutableMetadataItem() yearTag.keySpace = AVMetadataKeySpaceID3 yearTag.key = AVMetadataID3MetadataKeyYear yearTag.value = NSCalendar.currentCalendar().dateFromComponents(comps) soundFileMetadata.append(yearTag)
在这种情况下,我收到此错误:
FigMetadataCreateConverter signalled err=-12482 (kFigMetadataConverterError_UnsupportedFormat) (Unsupported format conversion) at /SourceCache/CoreMedia/CoreMedia-1562.238/Prototypes/Metadata/Converters/FigMetadataConverterCommon.c line 118
请注意,这是在控制台中打印的简单错误,不例外!
将它写为字符串,作为Int甚至是Float,也会导致我出现同样的错误.
轨道/光盘数,轨道/光盘编号标签也是如此.
第一个问题是:如何写出来?
我还有另一个问题.
目前我有一个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({ .... })
第二个问题是:有没有办法避免这种双步行动?
我已经设法在您的代码中添加年份标记并进行了一些修改:let yearTag = AVMutableMetadataItem() yearTag.keySpace = AVMetadataKeySpaceiTunes yearTag.key = AVMetadataiTunesMetadataKeyReleaseDate yearTag.value = "2123"
我无法使用ID3键,所以我认为这可能是问题,实际上它适用于这些iTunes键.此外,值必须是String(或NSString),而不是日期对象.