ios - 使用 'AVMutableMetadataItem *' 类型的表达式初始化 'AVMetadataItem *' 的不兼容指针类型?

标签 ios objective-c avaudioplayer

在它起作用之前我无法理解问题是什么

 - (NSString *)titleForAudioFileModel:(APAudioPlayerModel *)audioFileModel {
    AVPlayerItem *avItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:audioFileModel.filePath]];
    NSUInteger titleIndex = [avItem.asset.commonMetadata indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        AVMutableMetadataItem *metaItem = (AVMutableMetadataItem *)obj;
        if ([metaItem.commonKey isEqualToString:AVMetadataCommonKeyTitle]) {
            return YES;
        }
        return NO;
    }];

    if (titleIndex == NSNotFound) {
        return @"";
    }
    AVMutableMetadataItem *item = avItem.asset.metadata[titleIndex];// Incompatible pointer types initializing 'AVMutableMetadataItem *' with an expression of type 'AVMetadataItem *'
    return (NSString *)item.value;
}

提前谢谢你。

最佳答案

您要分配给 item 的属性变量声明为:

@property(nonatomic, readonly) NSArray <AVMetadataItem *> *metadata

这意味着编译器期望数组中的每一项都是 AVMetadataItem 类型.此类是 AVMutableMetadataItem 的父类(super class),并且您不能将对父类(super class)的引用分配给子类的变量。

它之前可能起作用的原因是 SDK 和编译器并不总是支持泛型(属性声明中的 <AVMetadataItem *>)。只要你不对待item,它就会起作用作为可变的。

解决方法是更改​​ item 的类型,或分配 mutableCopyavItem.asset.metadata[titleIndex] .

关于ios - 使用 'AVMutableMetadataItem *' 类型的表达式初始化 'AVMetadataItem *' 的不兼容指针类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33737477/

相关文章:

iOS检查应用程序是否可以访问麦克风

iphone - 添加声音到 Xcode 4.3

ios - 我有错误 : no visible interface for 'UIAlertController'

objective-c - 无法为 UIImage 创建新的 socket 连接

objective-c - "Entitlement has value not permitted by a provisioning profile",但它没有

iphone - 关于在不同设备上播放AMR音频文件的问题

ios - 访问 iPod 库以与 AVAudioPlayer 一起使用或使用 AVPlayer 远程控制事件

ios - Core Data 删除同名对象

ios - 尾随约束缺失错误

objective-c - iOS Core Data 如何使用谓词正确比较字符串文本?