【问题标题】:Saving ID3 tags on iOS在 iOS 上保存 ID3 标签
【发布时间】: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


【解决方案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 标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多