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

4 回答 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];
于 2014-02-19T16:12:49.423 回答
6

最简单优雅的方式大概是:

NSValue *value = [NSValue valueWithCMTime:cmTime];

然后向字典添加值:

NSMutableDictionary *clipDetails = [NSMutableDictionary dictionary];
[clipDetails setObject: value forKey:@"cmtime"];
于 2014-07-18T12:25:26.580 回答
2

用于CMTimeCopyAsDictionary将您的 CMTime 结构转换为CFDictionaryRefCMTimeMakeFromDictionary取回您的 CMTime。

// Without ARC
 CFDictionaryRef timeAsDictionary = CMTimeCopyAsDictionary(startTime, kCFAllocatorDefault);
[clipDetails setObject:(NSDictionary*)timeAsDictionary forKey:@"clipStart"];
CFRelease(timeAsDictionary);
于 2014-02-19T16:07:06.090 回答
0

问题在于setObject:将objectiveC对象作为参数(例如从NSObject派生的对象)

另一方面,CMTime 是一个结构,您不能使用它来将其添加到字典中。您需要将其转换为其他有效对象……也许是 NSDate?

于 2014-02-19T16:01:47.497 回答