Я нахожусь в ситуации, когда мне нужно экспортировать аудиофайл, записанный с помощью 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: error:]:
(ExtAudioFileRead (_imp -> _ extAudioFile, & ioFrames,
buffer.mutableAudioBufferList)): ошибка -50
Это не зависит от формата файла, используемого при экспорте и импорте аудио.
Тем не менее, он работает нормально, если я использую этот файл .wav , который читается непосредственно из приложения.
Кто-нибудь знает, почему я не могу прочитать данные из аудиофайла в AVPCMBuffer
.