首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过ID3编写AVMetaDataItem标签

通过ID3编写AVMetaDataItem标签
EN

Stack Overflow用户
提问于 2015-11-07 12:37:02
回答 1查看 2.1K关注 0票数 5

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

代码语言:javascript
复制
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方便的方法:

代码语言:javascript
复制
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
}

然后,我试着写了一年的标签,但没有成功:

代码语言:javascript
复制
let comps = NSDateComponents()
comps.year = 2010;

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

soundFileMetadata.append(yearTag)

在本例中,我得到了以下错误:

代码语言:javascript
复制
FigMetadataCreateConverter signalled err=-12482 (kFigMetadataConverterError_UnsupportedFormat) (Unsupported format conversion) at /SourceCache/CoreMedia/CoreMedia-1562.238/Prototypes/Metadata/Converters/FigMetadataConverterCommon.c line 118

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

同时,将它写成StringInt o甚至Float,也会导致同样的错误。磁道/光盘计数、磁道/光盘号码标签也是如此。

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

我还有另外一个问题。

目前我有一个AVAudioRecorder,我没有办法直接将标记写到记录器的输出文件中,所以我提交了记录器文件,用AVURLAsset打开它,然后用AVAssetExportSession重新导出它。

代码语言:javascript
复制
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({ 
         ....

})

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 14:16:49

我用代码添加了年份标记,并做了一些修改:

代码语言:javascript
复制
let yearTag = AVMutableMetadataItem()
yearTag.keySpace = AVMetadataKeySpaceiTunes
yearTag.key = AVMetadataiTunesMetadataKeyReleaseDate
yearTag.value = "2123"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33582845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档