Как создать выходной словарь настроек<String. Любой> для использования с экземпляром AVAssetWriterInput?

Я пытаюсь преобразовать экземпляр MPMediaItem в аудиофайл в формате caf. Я следил за работой Криса Адамсона и его постом " От iPod Library до образцов 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. Если другая информация о расположении канала недоступна, значение 1 для AVNumberOfChannelsKey приведет к монофоническому выходу, а значение 2 - к стереофоническому выходу. Если AVNumberOfChannelsKey указывает число каналов больше 2, в словаре также должно быть указано значение для AVChannelLayoutKey. Для kAudioFormatLinearPCM должны быть включены все соответствующие ключи ключа AVLinearPCM*, а для kAudioFormatAppleLossless должны быть включены ключи AVEncoderBitDepthHintKey. См. -InitWithMediaType: outputSettings: sourceFormatHint: чтобы избежать необходимости указывать значение для каждого из этих ключей.

Так что в словаре вызывает ошибку?

1 ответ

Решение

В Свифте 3 kAudioFormatLinearPCM импортируется как UInt32 (ака AudioFormatID), и Swift 3.0.0 не может преобразовать его в соответствующий тип (NSNumber в этом случае) когда положить в [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, который должен исправить ваш случай.

Другие вопросы по тегам