1

我正在尝试将 MPMediaItem 实例转换为 caf 格式的音频文件。我一直在关注 Chris Adamson 的工作以及他在从 iPod 库到 PCM 样本的帖子,其步骤比以前需要的要少得多

当我四处寻找如何快速执行此操作时,我遇到了 Abel Domingues github FileConverter.swift ,因为我在 Swift 中执行此操作。

然后我着手转换为 Swift 3 作为协议的扩展。一切顺利,直到我尝试运行它。它在创建对象时崩溃assetWriterInput,似乎与outputSettings变量有关。

        var outputSettings = [
            AVFormatIDKey: kAudioFormatLinearPCM,
            AVSampleRateKey: 44100,
            AVNumberOfChannelsKey: 2,
            AVChannelLayoutKey: NSData(bytes:&channelLayout, length:MemoryLayout<AudioChannelLayout>.size),
            AVLinearPCMBitDepthKey: 16,
            AVLinearPCMIsNonInterleaved: false,
            AVLinearPCMIsFloatKey: false,
            AVLinearPCMIsBigEndianKey: false
        ] as [String : Any]

        // create an asset writer input
        let assetWriterInput = AVAssetWriterInput(mediaType:AVMediaTypeAudio, outputSettings:outputSettings as NSDictionary as! [String : Any])

我收到的错误消息如下:

-[_SwiftValue unsignedIntValue]: unrecognized selector sent to instance 0x1704407b0 2016-10-13 18:34:52.032784 Testie[3098:1535938] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue unsignedIntValue]: unrecognized selector sent to instance 0x1704407b0'

我已经搜索了这方面的示例,但帖子必须使用 Objective-C 和/或与设置视频词典相关。

这是来自与音频相关的 AVAssetWriterInput 源的文档:

对于 AVMediaTypeAudio,outputSettings 字典中当前不支持以下键:AVEncoderAudioQualityKey 和 AVSampleRateConverterAudioQualityKey。使用此初始化程序时,必须完全指定音频设置字典,这意味着它必须包含 AVFormatIDKey、AVSampleRateKey 和 AVNumberOfChannelsKey。如果没有其他可用的通道布局信息,则 AVNumberOfChannelsKey 的值为 1 将导致单声道输出,值为 2 将导致立体声输出。如果 AVNumberOfChannelsKey 指定的通道数大于 2,则字典还必须为 AVChannelLayoutKey 指定一个值。对于 kAudioFormatLinearPCM,必须包括所有相关的 AVLinearPCM*Key 键,对于 kAudioFormatAppleLossless,必须包括 AVEncoderBitDepthHintKey 键。请参阅 -initWithMediaType:

那么字典中的什么导致了错误?

4

1 回答 1

4

在 Swift 3 中,kAudioFormatLinearPCM被导入为UInt32(aka AudioFormatID),而 Swift 3.0.0NSNumber在放入[String: Any].

尝试这个:

    var outputSettings = [
        AVFormatIDKey: UInt(kAudioFormatLinearPCM),
        AVSampleRateKey: 44100,
        AVNumberOfChannelsKey: 2,
        AVChannelLayoutKey: NSData(bytes:&channelLayout, length:MemoryLayout<AudioChannelLayout>.size),
        AVLinearPCMBitDepthKey: 16,
        AVLinearPCMIsNonInterleaved: false,
        AVLinearPCMIsFloatKey: false,
        AVLinearPCMIsBigEndianKey: false
    ] as [String : Any]

或者等到 Xcode 8.1/Swift 3.0.1,它应该可以解决您的问题。

于 2016-10-13T22:59:58.070 回答