如何将CMTime添加到NSMutableDictionary中?

4
我目前正在尝试将一些视频剪辑设置添加到NSMutableDictionary中,其中包括两个CMTime对象。
我正在尝试存储所使用的视频流(用整数表示),剪辑持续时间(CMTime)和剪辑开始时间(CMTime),这些在代码中的其他地方已经定义。
我可能有点傻,但我无法弄清如何将CMTimes添加到字典中,我收到了“将'CMTime'发送到不兼容类型'id'的参数”的错误提示。
我尝试过setObject和setValue,但都没有成功,并且找不到答案。
NSMutableDictionary *clipDetails = [NSMutableDictionary dictionary];
[clipDetails setObject:[NSNumber numberWithInteger:currentStream] forKey:@"stream"];
[clipDetails setObject:startTime forKey:@"clipStart"];
[clipDetails setObject:duration forKey:@"duration"];
4个回答

15

由于CMTime是一个结构体,你需要将其包装在Objective C类型中,通常使用NSValue

CMTime startTime = (...);
NSValue *startValue = [NSValue valueWithBytes:&startTime objCType:@encode(CMTime)];
[clipDetails setObject:startValue forKey:@"startTime"];

您可以这样再次获取它:

CMTime startTime;
NSValue *startValue = [clipDetails objectForKey:@"startTime"];
[startValue getValue:&startTime];

顺便说一下,使用新的字典语法要容易得多:

clipDetails[@"startTime"] = ...;
NSValue *value = clipDetails[@"startTime"];

这些步骤适用于任何结构体;事实证明,AVFoundation框架为CMTime结构提供了方便的方法:

clipDetails[@"startTime"] = [NSValue valueWithCMTime:startTime];
CMTime startTime = [clipDetails[@"startTime"] CMTimeValue];

太棒了,谢谢!我知道我需要把它包装起来,但是找不到一个简单的“这就是你需要做的”答案。我仍然需要编写另一端代码,实际上使用所有这些剪辑细节和值,但至少现在我可以将其全部存储而没有错误消息,谢谢! - m23

6
最简单和优雅的方法可能是:

最简单而又优雅的方法可能就是:

NSValue *value = [NSValue valueWithCMTime:cmTime];

然后将值添加到字典中:
NSMutableDictionary *clipDetails = [NSMutableDictionary dictionary];
[clipDetails setObject: value forKey:@"cmtime"];

2

使用CMTimeCopyAsDictionary将您的CMTime结构体转换为CFDictionaryRef,并使用CMTimeMakeFromDictionary恢复您的CMTime。

// Without ARC
 CFDictionaryRef timeAsDictionary = CMTimeCopyAsDictionary(startTime, kCFAllocatorDefault);
[clipDetails setObject:(NSDictionary*)timeAsDictionary forKey:@"clipStart"];
CFRelease(timeAsDictionary);

0
问题在于setObject:需要一个Objective-C对象作为参数(例如,从NSObject派生的对象)。
另一方面,CMTime是一个结构体,你不能将其用于添加到字典中。你需要将其转换为其他有效的对象...也许是NSDate?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接