AudioPlayerNode是一个实例变量,代码如下:
class HXAudioEngine {
private var audioEngine: AVAudioEngine = AVAudioEngine()
var digitFileUrl: URL? {
didSet {
if let digitUrl = digitFileUrl {
do {
digitAudioFile = try AVAudioFile(forReading: digitUrl)
} catch let error {
print("Error loading Digit file: \(error.localizedDescription)")
}
}
}
}
var digitAudioFile: AVAudioFile? {
didSet {
if let digitFile = digitAudioFile {
digitAudioFormat = digitFile.processingFormat
digitFileBuffer = AVAudioPCMBuffer(pcmFormat: digitFile.processingFormat, frameCapacity: UInt32(digitFile.length))
}
}
}
var digitFileBuffer: AVAudioPCMBuffer? {
didSet {
if let buffer = digitFileBuffer {
do {
try digitAudioFile?.read(into: buffer)
} catch let error {
print("Error loading digit file into buffer: \(error.localizedDescription)")
}
}
}
}
var digitAudioFormat: AVAudioFormat?
var digitPlayer: AVAudioPlayerNode = AVAudioPlayerNode()
func playDigit() {
let file = "d0p1m00db"
digitFileUrl = Bundle.main.url(forResource: file, withExtension: "wav")
audioEngine.attach(digitPlayer)
audioEngine.connect(digitPlayer, to: audioEngine.mainMixerNode, format: digitAudioFormat)
audioEngine.prepare()
do {
try audioEngine.start()
} catch let error {
print(error)
}
guard let digitBuffer = digitFileBuffer else { return }
guard let digitAudioFile = digitAudioFile else { return }
digitPlayer.scheduleBuffer(digitBuffer, at: nil, options: .interrupts) {
print("Done playing digit")
}
digitPlayer.play()
}
}由于某些原因,最终被播放的文件只是一声点击声音。音频文件是一位女士说一位数字的1秒长的文件。
它几乎看起来像是播放器加速通过声音文件,因此模糊了讲话。采样率为44100。阅读Stack Overflow时,有很多解决方案都在谈论音频播放器在声音文件完成之前被释放。
但我已经测试了通过Raywenderlich tutorial构建的一个单独的应用程序:https://www.raywenderlich.com/5154-avaudioengine-tutorial-for-ios-getting-started,它实际上显示了声音文件的长度和播放进度。一切似乎都很好,但即使这样,音频文件也不能正常播放。
是我的实现有问题,还是音频文件有问题?音频文件在itunes上播放正常。
发布于 2019-04-06 00:08:42
如果您需要用于播放的输出设备,则必须设置耳机或其他类型的音频会话类别。
try AVAudioSession.sharedInstance().setCategory(.playAndRecord , mode: .default , options: .defaultToSpeaker)https://stackoverflow.com/questions/53945686
复制相似问题