在 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 标签的主要内容,如果未能解决你的问题,请参考以下文章