如何解决Swift:使用 AVAudioEngine (AVAudioPlayerNode) 播放无缝音频?
基本上,我正在尝试通过 websockets 使用 AudioEngine 播放 AAC(带有 ADTS 标头)流(我使用的是 StarScream)。我实时播放这些音频,播放时音频数据包之间存在故障。这些是我尝试过的步骤:
- 从 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
}
}
}
- 解析 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
}
}
- 播放 PCM 数据
func playPCM(_ pcm: AVAudioPCMBuffer) {
audioFilePlayer.scheduleBuffer(pcm,at: nil,options: .interrupts,completionHandler: nil)
}
- 最终结果音频在每个音频数据包之间存在一些小故障。问题与此类似.. https://storage.googleapis.com/webfundamentals-assets/videos/gap.webm
对我做错的任何建议表示赞赏。
谢谢!
解决方法
终于!我已经用 AudioQueue 解决了这个问题。如果有人在 Swift 中遇到和我一样的问题,这个 AudioQueue 示例代码救了我。
https://gist.github.com/zonble/635ea00cb125bc50b3f5880e16ba71b7
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。