AVAudioConverter не работает в iOS 10

AVAudioConverter кажется неработающим в iOS 10. Код работал в iOS 9 и теперь

Домен ошибки = код NSOSStatusErrorDomain = -50 "(null)"

возвращается независимо от того, какой аудиоформат используется. Меня каждый год удивляет, что базовый функционал библиотеки перестает работать.

func audioConverterFailureIOS10() {
    // Describe the audio format
    let inFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 2)
    let outFormat = AVAudioFormat(standardFormatWithSampleRate: 22050, channels: 2)

    // Allocate buffers
    let outBuffer = AVAudioPCMBuffer(pcmFormat: outFormat, frameCapacity: 1024)

    // Create an input block that is called when the converter needs input
    let inputBlock : AVAudioConverterInputBlock = { (inNumPackets, outStatus) -> AVAudioBuffer? in
        // Fails before entering here
        return nil
    }

    // Create the audio converter
    let converter = AVAudioConverter(from: inFormat, to: outFormat)

    var error : NSError?
    _ = converter.convert(to: outBuffer, error: &error, withInputFrom: inputBlock)

    // Error Domain=NSOSStatusErrorDomain Code=-50 "(null)"
    print(error)
}

person borrel    schedule 27.09.2016    source источник
comment
Ух ты. Работают ли приложения, созданные для SDK версии 9.3?   -  person Rhythmic Fistman    schedule 27.09.2016
comment
@RhythmicFistman Точно. Я установил Xcode 7.3 и запустил точно такой же код (с синтаксисом Swift 2.x) для SDK 9.3, и ошибки не было. Самое смешное, что в прошлом году, когда была выпущена iOS 9, я обновил свой код с помощью AVAudioConverter вместо старых расширенных аудиофайловых служб из-за ошибок сегментации внутри библиотеки Apple. Может быть, они исправили это и вместо этого сломали другое...   -  person borrel    schedule 27.09.2016


Ответы (1)


Итак, оказалось, что параметру outBuffer frameLength нужно присвоить значение frameCapacity. По умолчанию длина равна 0 и, по-видимому, обрабатывается по-разному в iOS 10.

person borrel    schedule 29.09.2016