【问题标题】:How to add CMTime to NSMutableDictionary?如何将 CMTime 添加到 NSMutableDictionary?
【发布时间】:2014-02-19 15:56:18
【问题描述】:

我目前正在尝试将一些视频剪辑设置添加到 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"];

【问题讨论】:

    标签: objective-c nsmutabledictionary cmtime


    【解决方案1】:

    由于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];
    

    【讨论】:

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

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

    NSValue *value = [NSValue valueWithCMTime:cmTime];
    

    然后将值添加到字典中:

    NSMutableDictionary *clipDetails = [NSMutableDictionary dictionary];
    [clipDetails setObject: value forKey:@"cmtime"];
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-02-12
          • 1970-01-01
          • 1970-01-01
          • 2017-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多