Как создать словарь outputSettings Dictionary‹String. Any› для использования с экземпляром AVAssetWriterInput?

Я пытаюсь преобразовать экземпляр 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: способ избежать необходимости указывать значение для каждого из этих ключей.

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


person Peter Hornsby    schedule 13.10.2016    source источник
comment
Я могу опубликовать больше кода, я просто не хотел заглушать вопрос.   -  person Peter Hornsby    schedule 14.10.2016


Ответы (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:&channelLayout, length:MemoryLayout<AudioChannelLayout>.size),
        AVLinearPCMBitDepthKey: 16,
        AVLinearPCMIsNonInterleaved: false,
        AVLinearPCMIsFloatKey: false,
        AVLinearPCMIsBigEndianKey: false
    ] as [String : Any]

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

person OOPer    schedule 13.10.2016