Swift 如何在 macOS 中编辑 .mp3 文件的元数据 (ID3)
我正在编写一个 macOS 应用程序,并且已经尝试更改 .mp3 中“更多信息”部分中的措辞一段时间,并且对 SO 进行了大量搜索,发现了 2 个将读取元数据的代码片段,但是只有一个实际上输出现有的 key ,但我不明白如何向其中任何一个写入新数据。我实际上想将数据写入我创建的 .mp3 文件,并在可能的情况下添加图像,作为一个对 Swift 3 有一定了解的新手,任何人都可以帮忙。下面的输出来 self 复制到桌面的测试歌曲 (Imagine_Test_Song)。
我在 SO Writing ID3 tags via AVMetaDataItem 上找到了这个但我在这些行中遇到编译错误:-
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyArtist, "MyArtist")!) // compiler error here
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeySongName, "MySong")!)
….
其中表示:- 调用中缺少参数标签“tagKey”。功能是这样的:-
func createMetadata(tagKey: String, _ tagValue: AnyObject?,
keySpace:String = AVMetadataKeySpaceiTunes) -> AVMutableMetadataItem? {
if let tagValue = tagValue {
let tag = AVMutableMetadataItem()
tag.keySpace = keySpace
tag.key = tagKey as NSCopying & NSObjectProtocol
tag.value = (tagValue as? String as! NSCopying & NSObjectProtocol) ?? (tagValue as? Int as! NSCopying & NSObjectProtocol)
return tag
}
return nil
}
第二个片段是我下面的代码,它编译并输出各种数据,但如何编辑文本并保存更改。理想情况下,我也想添加“艺术品”,这可能吗?
let homeUrl = NSHomeDirectory()
let sourceFilePath = String(format: "%@/Desktop/%@.mp3", homeUrl, " Imagine_Test_Song")
let fileUrl = NSURL(fileURLWithPath: sourceFilePath)
var asset = AVAsset(url: fileUrl as URL) as AVAsset
//using the asset property to get the metadata of file
for metaDataItems in asset.commonMetadata {
//getting the title of the song
if metaDataItems.commonKey == "title" {
let titleData = metaDataItems.value as! NSString
print("title = \(titleData)")
}
//getting the "Artist of the mp3 file"
if metaDataItems.commonKey == "artist" {
let artistData = metaDataItems.value as! NSString
print("artist = \(artistData)")
}
//getting the "creator of the mp3 file"
if metaDataItems.commonKey == "creator" {
let creatorData = metaDataItems.value as! NSString
print("creator = \(creatorData)")
}
//getting the "Album of the mp3 file"
if metaDataItems.commonKey == "albumName" {
let albumNameData = metaDataItems.value as! NSString
print("albumName = \(albumNameData)")
}
输出:-
title = Imagine
creator = John Lennon
type = Singer-Songwriter
albumName = Imagine
如有任何帮助,我们将不胜感激,提前致谢。
最佳答案
经过对这个问题的大量研究,由于许可问题,使用 AVFoundation API 调用修改 AVMetaDataItems 并将其保存到 MP3 文件的能力似乎是不可能的(即使 mp3 文件类型被列为一个选项) MP3 文件。因此,据我所知,做到这一点的唯一方法是要么使用自己的 id3 标签编辑器,要么使用其他作者的库/框架。
我个人不喜欢使用其他作者提供的不提供完整源代码的框架或库,因为当作者停止维护项目并且 Apple 更改某些内容并且该更改破坏了我的应用程序时,我遇到了问题。
但是,我发现了ID3TagEditor Fabrizio Duroni 的图书馆。完整源代码可在 github here 上找到。这是一个直接且易于使用的库。截至撰写本文时,Fabrizio 正在积极维护代码。
关于Swift 如何在 macOS 中编辑 .mp3 文件的元数据 (ID3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791298/