#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, что должно исправить ваш случай.