【发布时间】: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 文件都在应用程序的文档文件夹中。
-
你有没有进一步了解这里?
-
不幸的是我还没有。
标签: iphone objective-c id3