2014-02-19 38 views
3

我目前正在尝试添加一些视频剪辑设置到一个NSMutableDictionary,包括两个CMTime对象。如何将CMTime添加到NSMutableDictionary?

我试图存储正在使用的视频流(用整数表示),剪辑持续时间(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"]; 

回答

12

由于CMTime是一个结构,你需要NSValue来包装它的目的C型,通常:

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]; 
+0

太棒了,谢谢!我意识到,我必须将其包装在一些东西中,但无法找到一个简单的“这就是你需要做的”答案。 我仍然需要对它的另一端进行编码,其中我实际上使用了所有这些剪辑细节和值,但至少现在我可以将其全部存储并且没有错误消息,谢谢! – m23

0

的问题是,setObject:接受一个的ObjectiveC对象作为参数(例如,从NSObject的派生对象)

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

2

使用CMTimeCopyAsDictionary将您的CMTime结构转换为CFDictionaryRefCMTimeMakeFromDictionary以找回您的CMTime。

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

最简单,最优雅的方式可能是:

NSValue *value=[NSValue valueWithCMTime:cmTime]; 

然后增值词典:

NSMutableDictionary *clipDetails = [NSMutableDictionary dictionary]; 
[clipDetails setObject: value forKey:@"cmtime"]; 
相关问题