在 iOS 上保存 ID3 标签

Posted

技术标签:

【中文标题】在 iOS 上保存 ID3 标签【英文标题】:Saving ID3 tags on iOS 【发布时间】:2012-09-29 23:41:21 【问题描述】:

所以我想让我的应用编辑并保存 ID3 标签。我很久以前在某个网站上发现了如何阅读它们,这是我的应用程序中的这段代码:

-(NSDictionary*)MP3InfoDictionary 
    AudioFileID fileID = nil;
    OSStatus err = noErr;

    err = AudioFileOpenURL( (CFURLRef) self, kAudioFileReadPermission, 0, &fileID);
    if (err != noErr) 
    //NSLog(@"AudioFileOpenURL failed");
    
    UInt32 id3DataSize = 0;
    char * rawID3Tag = NULL;

    err = AudioFileGetPropertyInfo(fileID, kAudioFilePropertyID3Tag, &id3DataSize, NULL);
    if (err != noErr) 
    NSLog(@"AudioFileGetPropeetyInfo failed for ID3 tag");
    
    //NSLog(@"id3 data size is %lu bytes",id3DataSize);

    rawID3Tag = (char *) malloc(id3DataSize);
    if (rawID3Tag == NULL) 
    //NSLog(@"could not allocated %lu bytes of memory for ID3 tag", id3DataSize);
    

    err = AudioFileGetProperty(fileID, kAudioFilePropertyID3Tag, &id3DataSize, rawID3Tag);
    if (err != noErr) 
    NSLog(@"AudioFileGetProperty failed for ID3 tag");
    
    //NSLog(@"read %lu bytes of ID3 info", id3DataSize);

    CFDictionaryRef piDict = nil;
    UInt32 piDataSize = sizeof(piDict);
    free(rawID3Tag);
    err = AudioFileGetProperty(fileID, kAudioFilePropertyInfoDictionary, &piDataSize, &piDict);
    if (err != noErr) 
    //NSLog(@"AudioFileGetProperty failed for property info dictionary");
    

    //NSLog(@"Property info:%@", (NSDictionary*)piDict);
    //CFShow(piDict);

    NSDictionary *MP3InfoDictionary = (NSDictionary*)piDict;
    if (MP3InfoDictionary != NULL) 
    return MP3InfoDictionary;
    

    return nil;
 

这段代码属于NSURL类,url是ios的documents目录下一个mp3的文件url。它工作 100%,我得到了所有的标题、艺术作品、歌词等。但现在我想保存和覆盖 mp3 的值,如艺术家、标题等。在另一个帖子上,一个人在这里发布了你使用 AudioFileSetProperty() ,如何正确使用?

显然这是因为 kAudioFileReadPermission 但它告诉我 mp3 只能读取,但这不可能是真的,因为我拥有的另一个应用程序可以更改 ID3 标签并且可以在我尝试编辑的同一个 mp3 上。

【问题讨论】:

请在此处发布相关代码,并带有警告。您是否考虑过只使用已经存在多年的 ID3 库之一,而不是自己编写这些低级的东西? 考虑这个;您无法在设备上编辑媒体文件,因为存在沙盒。所以你把这个 mp3 复制到你的项目中,你仍然不能在那里编辑它(捆绑文件也受到保护)。但是您可以将其复制到缓存或文档目录。只是想确保您有权访问工作目录 是的,所有 .mp3 文件都在应用程序的文档文件夹中。 你有没有进一步了解这里? 不幸的是我还没有。 【参考方案1】:

编辑: 请参阅下面的第一条评论。看来 AudioFile 不允许修改链接中列出的四种类型的文件。

【讨论】:

我刚刚在 Apple 网站的技术问答中注意到:developer.apple.com/library/mac/#qa/qa1676/_index.html 我已经尝试了打开的 url,我可以完美地读取 ID3,但无法保存。我可能用错了 AudioFileSetProperty(),我使用了文件 id 和 kAudioFilePropertyID3Tag,我不知道 inDataSize 和 inDataProperty 应该放什么 我收到错误“操作无法完成”。尝试使用写权限打开文件时。 AudioFileID fileID = nil; OSStatus err = noErr; err = AudioFileOpenURL( (__bridge CFURLRef) self, kAudioFileWritePermission, 0, &fileID); if (err != noErr) NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]; NSLog(@"Error: %@", [error description]); NSLog(@"AudioFileOpenURL failed"); 是的,我正在尝试为 .mp3 保存 ID3 标签。

以上是关于在 iOS 上保存 ID3 标签的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中 ID3 标签的正确编码

使用新 ID3 标签保存 MP3 时出现问题

Taglib 锐利保存仅 ID3v2

如何停止将已知类型转换为 id3v2 标签中的数字?

如何使用 taglib 将图片添加到 ID3 相册标签#

删除 id3 标签