如何从 iOS 上的音频文件中提取元数据

2024-02-16

我正在尝试使用 AVFoundation 框架从 mp3 和 m4a 文件中提取元数据。

这是测试代码:

+ (void)printMetadataForFileAtPath:(NSString *)path
{
    NSURL *url = [NSURL fileURLWithPath:path];
    AVAsset *asset = [AVURLAsset assetWithURL:url];
    NSArray *availableFormats = [asset availableMetadataFormats];
    NSLog(@"Available formats: %@", availableFormats);
    NSArray *iTunesMetadata = [asset metadataForFormat:AVMetadataFormatiTunesMetadata];
    for (AVMetadataItem *item in iTunesMetadata)
    {
        NSLog(@"%@ %x", item.key, [(NSNumber *)item.key integerValue]);

        if ([item.key isEqual:AVMetadataiTunesMetadataKeySongName])
        {
            NSLog(@"FOUND song name: %@", item.stringValue);
        }
    }
    NSLog(@"====================");
    NSLog(@"%@ %@ %@", AVMetadataiTunesMetadataKeySongName, AVMetadataiTunesMetadataKeyAlbum, AVMetadataiTunesMetadataKeyArtist);
}

这是输出:

Available formats: (
    "com.apple.itunes",
    "com.apple.quicktime.udta"
)
-1452383891 a96e616d
-1455336876 a9415254
1631670868 61415254
-1451789708 a9777274
-1453233054 a9616c62
-1452838288 a9677270
-1452841618 a967656e
1953655662 74726b6e
1684632427 6469736b
-1453039239 a9646179
-1453101708 a9636d74
1668311404 6370696c
1885823344 70676170
1953329263 746d706f
-1451987089 a9746f6f
com.apple.iTunes.iTun
com.apple.iTunes.Enco
1668249202 636f7672
-1452508814 a96c7972
====================
@nam @alb @ART

当解释为 4 个 ASCII 字符时:

© n a m
© A R T
a A R T
© w r t
© a l b
© g r p
© g e n
t r k n
d i s k
© d a y
© c m t
c p i l
p g a p
t m p o
© t o o

所以看来item.key is a NSNumber对象,但常量开头为AVMetadataiTunesMetadataKey... are NSString对象。获取元数据的正确方法是什么?当我使用[AVAsset commonMetadata]钥匙是NSString对象也是如此,并与AVMetadataCommonKey...常量按预期工作。


AVFoundation API 在处理元数据时相当混乱。

定义的键AVMetadataiTunesMetadataKey*值与 AVMetadataItem 的关键属性值不同。 AVMetadataiTunesMetadataKey* 键将与[AVMetadataItem metadataItemsFromArray:withKey:keySpace:AVMetadataKeySpaceiTunes]用于过滤掉具有特定 iTunes 密钥的元数据项目的 API。

AVMetadataItem 的键和值取决于资源文件的确切格式。除了用上面的函数过滤掉按键之外,我建议使用 item 的公用密钥属性,它提供了比其他属性更通用的“关键”属性。

更改示例代码以打印出来公用密钥以及该项目的value。 这里有些例子:

  • 公用密钥是“标题”-value是一个带有歌曲标题的 NSString
  • 公用密钥是“艺术家”-value是带有歌曲艺术家的 NSString
  • 公用密钥是“专辑名称”-value是一个带有专辑名称的 NSString

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 iOS 上的音频文件中提取元数据 的相关文章

随机推荐