Как создать выходной словарь настроек<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, который должен исправить ваш случай.