Ошибка чтения аудиофайла, записанного с помощью AudioKit, в экземпляр AVPlayer

Я нахожусь в ситуации, когда мне нужно экспортировать аудиофайл, записанный с помощью AudioKit, а затем повторно импортировать его для дальнейшей обработки через AVAudioPCMBuffer,

Ниже приведен код, который я использую для экспорта из AudioKit:

    tape = recorder.audioFile!
    player.load(audioFile: tape)


    if let _ = player.audioFile?.duration {
        recorder.stop()
        tape.exportAsynchronously(name: "TempTestFile",
                                  baseDir: .documents,
                                  exportFormat: .caf) {_, exportError in
                                    if let error = exportError {
                                        AKLog("Export Failed \(error)")
                                    } else {
                                        AKLog("Export succeeded")
                                    }
        }

    }

И здесь я пытаюсь позже прочитать этот аудиофайл в мое приложение MacOS и заполнить AVAudioPCMBuffer (где file это аудиофайл, который я пытаюсь прочитать):

            let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: Double(sampleRate), channels: AVAudioChannelCount(channels), interleaved: interleaved)

            if let buffer = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: AVAudioFrameCount(file.length)){
                if ((try? file.read(into: buffer)) != nil) {

                    let arraySize = Int(buffer.frameLength)

                    switch type {
                    case is Double.Type:
                        let doublePointer = UnsafeMutablePointer<Double>.allocate(capacity: arraySize)
                        vDSP_vspdp(buffer.floatChannelData![0], 1, doublePointer, 1, vDSP_Length(arraySize))
                        return Array(UnsafeBufferPointer(start: doublePointer, count:arraySize)) as? [T]
                    case is Float.Type:
                        return Array(UnsafeBufferPointer(start: buffer.floatChannelData![0], count:arraySize)) as? [T]
                    default: return nil
                    }
                }
            }

Тем не менее, я постоянно получаю сообщение об ошибке:

ИСКЛЮЧЕНИЕ (-50): "неправильное количество буферов"

[avae] AVAEInternal.h: 103: _AVAE_CheckNoErr: [AVAudioFile.mm:445:-[AVAudioFile readIntoBuffer: frameCount: ошибка:]: (ExtAudioFileRead(_imp->_extAudioFile, и ошибка ioFramesu):

Это не зависит от формата файла, используемого при экспорте и импорте аудио.

Тем не менее, он работает нормально, если я использую этот файл.wav, который читается непосредственно из приложения.

Кто-нибудь знает, почему я не могу прочитать данные из аудиофайла в AVPCMBuffer,

0 ответов

В этой строке:

let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: Double(sampleRate), channels: AVAudioChannelCount(channels), interleaved: interleaved)

попробуйте правильно настроить interleaved к false и не забывайте обрабатывать полученные данные как не чередующиеся (подробнее об этом читайте ниже).

По какой-то причине он работает с буфером без чередования, но я не могу заставить его работать с буфером с чередованием:(Если кто-то знает, как это сделать, оставьте комментарий:)

С чередованием и без чередования

Это отрывок из блога Майка Эша о работе с аудиоданными.

... Вы могли заметить, что у большинства людей два уха. Из-за этого звук, записанный в виде двух отдельных потоков, звучит для большинства людей лучше, чем один поток. Концептуально этот звук можно рассматривать как две отдельные функции давления во времени.

Чтобы представить стереозвук в данных, эти две функции должны быть представлены одновременно. Наиболее распространенный способ - просто чередовать два канала, так что первое значение в буфере будет левым каналом, второе значение - правым каналом, затем снова левым и т. Д. В памяти это будет выглядеть так:

LRLRLRLRLRLRLRLRLR

Также можно просто использовать два совершенно разных буфера, что выглядит примерно так:

buffer 1: LLLLLLLLLL
buffer 2: RRRRRRRRRR

Такие данные с удаленным чередованием могут быть более удобными для работы, но представление с чередованием чаще используется просто потому, что оно хранит все в одном месте.

Другие вопросы по тегам