Swift 如何在 macOS 中编辑 .mp3 文件的元数据 (ID3)

标签 swift macos metadata mp3 id3

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/

相关文章:

swift - 硬件音量按钮和 Swift

macos - 如何获取 NSScrollView 的文档 View 被裁剪的可见框架?

java - 如何使用 JDBC 从 Oracle 11g 获取注释?

mysql - 如何根据 MySQL 5.5.x 中单独表中的元数据对主表进行排序?

ios - 初始化变量 : 'self' captured by a closure before all members were initialized

swift - 切换到 macOS Catalina 后,Modulemap 将无法编译 - tcp_var.h

ios - 如何测试在主线程上异步运行的方法?

ios - 如何发布 MTAudioProcessingTap?

xcode - 在终端中使用 codesign 命令签名后,使用 Unity 构建的 macOS 应用程序在启动时挂起

amazon-web-services - 如何使用元数据端点或 java sdk 获取我的 FARGATE ECS 任务的公共(public) IP?