在 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 上的键名的主要内容,如果未能解决你的问题,请参考以下文章
AVAsset 在 iOS 中使用图像叠加保存视频会破坏视频
使用 AVFoundation 裁剪 AVAsset 视频不工作 iOS 8