微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 通过AVMetaDataItem编写ID3标签

我正在使用AVMetaDataItem将ID3标签写入文件

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),而不是日期对象.

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐