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