Swift: 使用 AVAudioEngine (AVAudioPlayerNode) 播放无缝音频?

Swift: Play gapless audio with AVAudioEngine (AVAudioPlayerNode)?

基本上,我正在尝试通过 websockets(我正在使用 StarScream)使用 AudioEngine 播放 AAC(使用 ADTS header)流。我实时播放这些音频,播放时音频数据包之间存在故障。这些是我尝试过的步骤:

  1. 从 WebSocket 接收数据
extension ViewController: WebSocketDelegate {
    func didReceive(event: WebSocketEvent, client: WebSocket) {
        switch event {
        case .binary(let data):
            // Here is the AAC Stream. I store them in a buffer (NSMutableData)

        default:
            break
        }
    }
}
  1. 解析 AAC(AAC 到 PCM)

使用 FileHandle 将数据保存到 audio.aac 并使用 AVAudioFile

对其进行解码
func decodeAACTOPCM(aac: Data) -> AVAudioPCMBuffer? {
        self.fileHelper.createFile(name: "audio.aac")
        self.fileHelper.writeFile(data: aac)
        let url = URL(fileURLWithPath: fileHelper.path)
        do {
            let audioFile = try AVAudioFile(forReading: url)
            guard let buffer = AVAudioPCMBuffer(pcmFormat: audioFile.processingFormat, frameCapacity: .init(audioFile.length * 3)) else {
                return nil
            }
            try audioFile.read(into: buffer)
            buffer.frameLength = buffer.frameCapacity
            print("Buffer size \(buffer.frameLength)")
            return buffer
        } catch {
            print(error)
            return nil
        }
    }
  1. 播放 PCM 数据
func playPCM(_ pcm: AVAudioPCMBuffer) {
     audioFilePlayer.scheduleBuffer(pcm, at: nil, options: .interrupts, completionHandler: nil)
}
  1. 最终结果音频在每个音频数据包之间存在一些故障。这个问题与此类似.. https://storage.googleapis.com/webfundamentals-assets/videos/gap.webm

如有任何关于我做错的建议,我们将不胜感激。

谢谢!

终于!我已经用 AudioQueue 解决了这个问题。如果有人在 Swift 遇到和我一样的问题,这个 AudioQueue 示例代码救了我。

https://gist.github.com/zonble/635ea00cb125bc50b3f5880e16ba71b7