2014-02-19 37 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"]; 
相關問題