Как создать словарь outputSettings для использования с экземпляром AVAssetWriterInput?

#avfoundation #swift3 #avassetwriter #avassetwriterinput

#avfoundation #swift3 #avassetwriter #avassetwriterinput

Вопрос:

Я пытаюсь преобразовать экземпляр MPMediaItem в аудиофайл в формате caf. Я следил за работой Криса Адамсона и его сообщением о переходе из библиотеки iPod в образцы PCM за гораздо меньшее количество шагов, чем было необходимо ранее

Пока я копался в поисках того, как это сделать в swift, я наткнулся на Abel Domingues github FileConverter.swift для выполнения именно этого в Swift.

Затем я приступил к преобразованию в Swift 3 в качестве расширения протокола. Все шло хорошо, пока я не попытался запустить его. Он выходит из строя при assetWriterInput создании объекта и, похоже, связан с outputSettings переменной.

         var outputSettings = [
            AVFormatIDKey: kAudioFormatLinearPCM,
            AVSampleRateKey: 44100,
            AVNumberOfChannelsKey: 2,
            AVChannelLayoutKey: NSData(bytes:amp;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 * Key, а для kAudioFormatAppleLossless должны быть включены ключи AVEncoderBitDepthHintKey. Смотрите -initWithMediaType:outputSettings:sourceFormatHint: чтобы избежать необходимости указывать значение для каждого из этих ключей.

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

Комментарии:

1. Я могу опубликовать больше кода, я просто не хотел заглушать вопрос.

Ответ №1:

В Swift 3 kAudioFormatLinearPCM импортируется как UInt32 (он же AudioFormatID ), и Swift 3.0.0 не может преобразовать его в соответствующий тип ( NSNumber в данном случае) при вводе [String: Any] .

Попробуйте это:

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

Или подождите до Xcode 8.1 / Swift 3.0.1, что должно исправить ваш случай.