在 iOS 中为 AVAsset 检索 AVMetadataItem 上的键名

Posted

技术标签:

【中文标题】在 iOS 中为 AVAsset 检索 AVMetadataItem 上的键名【英文标题】:Retrieving the key name on AVMetadataItem for an AVAsset in iOS 【发布时间】:2011-02-21 08:03:02 【问题描述】:

我正在尝试识别 iPad 上视频中的不同元数据项。到目前为止,我能够成功地使用 AVAsset 库来查找文件,并使用 metadataForFormat: 生成一个 AVMetadataItems 数组。在该文件中仅找到 iTunes 和 Quicktime 用户数据格式。现在的问题是我有这些信息,我无法确定什么是什么。我打算用元数据键索引的信息加载字典,但是使用 AVMetadataItem 的key 属性似乎无法正常工作,就像返回一个数字一样(调试器说它是一个 NSCFNumber)。这是我正在做的一些示例代码:

ALAssetRepresentation *representation = [[valAsset defaultRepresentation] retain];
NSURL *url = [representation url];
AVURLAsset *aAsset = [[AVURLAsset URLAssetWithURL:url options:nil] retain];
metaDataDict = [[NSMutableDictionary dictionary] retain];
NSArray *fmtmetadata = [aAsset metadataForFormat:@"com.apple.itunes"];
for (AVMetadataItem* meta in fmtmetadata)

    [metaDataDict setObject:[meta stringValue]
             forKey:[meta key]];
    NSLog(@"metadata: key = %@", [meta key]);

这会在调试器控制台中产生以下输出:

metadata: key = -1452383891
metadata: key = -1452841618
metadata: key = 1684370275
metadata: key = 1818518899
metadata: key = 1937009003
metadata: key = -1453101708

顺便说一下,将 NSLog 行改为:

NSLog(@"metadata: %@", meta);

为我们提供如下输出:

metadata: keySpace=itsk, key=desc, commonKey=(null), locale=(null), value=This is the Description of the Video, time=INVALID, duration=INVALID, extras=
    dataType = 1;

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

看起来这些键是编码的 ID3 标签:

1684370275 = 0x64657363 = 'd', 'e', 's', 'c'

1818518899 = 0x6C646573 = 'l', 'd', 'e', 's'

1937009003 = 0x7374696B = 's', 't', 'i', 'k'

等等

【讨论】:

太好了,谢谢你的回答,我有预感......知道是否有解码它们的方法吗? 嗯..这未经测试,但我认为像 NSInteger key = [meta key]; NSString *keyString = [NSString stringWithFormat:@"%.4s", &key] 这样的东西应该可以工作。 谢谢...这是我最终做的: NSUInteger akey = NSSwapInt([(NSNumber *)[meta key] unsignedIntegerValue]); NSString *keyString = [NSString stringWithFormat:@"%.4s",&akey];【参考方案2】:

您可以使用以下扩展:

extension AVMetadataItem 
    var keyString: String 
        if key is NSString  return key as! String
        else if key is NSNumber 

            var keyValue = (key as? NSNumber)?.uint32Value ?? 0 
            keyValue = CFSwapInt32BigToHost(keyValue) 
            
            let array = withUnsafeBytes(of: &keyValue)  Array($0) 

            let string = String(decoding: array, as: UTF8.self)
            return String(string.map $0 == "�" ? "@" : $0 )
         else 
            return "Unknown"
        
    

它可以返回这样的字符串:

keyString Description
@alb Album
aART Album Artist
@ART Artist
@gen Gener
@nam Title
@cmt Comment

使用方法:

let albumMetaData: [AVMetadataItem] = AVMetadataItem.metadataItems(from: asset.metadata, filteredByIdentifier: .iTunesMetadataAlbum)

print(albumMetaData.first?.keyString) // @alb

功劳归于: 学习 AV Foundation:掌握 AVFoundation 框架的实践指南(McCune,Bob)

【讨论】:

以上是关于在 iOS 中为 AVAsset 检索 AVMetadataItem 上的键名的主要内容,如果未能解决你的问题,请参考以下文章

在 AVPlayer 中播放慢动作 AVAsset 的问题

AVAsset 在 iOS 中使用图像叠加保存视频会破坏视频

使用 AVFoundation 裁剪 AVAsset 视频不工作 iOS 8

iOS-如何使用 AVAsset 或 AVURLAsset 获取 .mp4 文件的持续时间

使用 AVAsset 的多个图像到视频需要高内存

在 Nativescript 应用程序中将 PHAsset/AVAsset 转换为 mp4 视频