【问题标题】:Problem reading audio file recorded with AudioKit into an AVPlayer intsance将使用 AudioKit 录制的音频文件读取到 AVPlayer 实例中时出现问题
【发布时间】:2018-11-09 22:32:18
【问题描述】:

我需要导出使用 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
                    }
                }
            }

但是,我一直收到以下错误:

EXCEPTION (-50):“缓冲区数量错误”

[avae] AVAEInternal.h:103:_AVAE_CheckNoErr: [AVAudioFile.mm:445:-[AVAudioFile readIntoBuffer:frameCount:error:]: (ExtAudioFileRead(_imp->_extAudioFile, &ioFrames, buffer.mutableAudioBufferList)): 错误 -50

这与导出和导入音频时使用的文件格式无关。

但是,如果我使用从应用程序内部直接读取的this .wav file,它确实可以正常工作。

有没有人知道为什么我似乎无法将音频文件中的数据读入AVPCMBuffer

【问题讨论】:

    标签: swift avaudioplayer audiokit avaudiopcmbuffer


    【解决方案1】:

    在这一行:

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

    尝试将interleaved 正确设置为false,并且不要忘记将生成的数据视为非交错数据(请阅读下文了解更多信息)。

    由于某种原因,它适用于非交错缓冲区,但我无法让它与交错缓冲区一起工作:( 如果有人知道怎么做,请发表评论:)

    交错与非交错

    这是Mike Ash's blog 关于处理音频数据的摘录。

    ...您可能已经注意到,大多数人都有两只耳朵。因此,对于大多数人来说,录制为两个单独的流的声音比单个流听起来更好。从概念上讲,这个音频可以被认为是压力随时间变化的两个独立函数。

    要在数据中表示立体声,这两个函数必须同时表示。最常见的方法是简单地将两个通道交错,以便缓冲区中的第一个值是左通道,第二个值是右通道,然后又是左通道,依此类推。在内存中,它看起来像:

    LRLRLRLRLRLRLRLRLR
    

    也可以简单地使用两个完全不同的缓冲区,如下所示:

    buffer 1: LLLLLLLLLL
    buffer 2: RRRRRRRRRR
    

    这样的去交错数据可以更方便地使用,但交错表示更常用,因为它将所有内容保存在一个地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多