简体   繁体   English

如何使用 AudioKit 使用 Swift 同时播放两个音频文件

[英]How to play two audio files at once with Swift using AudioKit

I have two short wav audio files that I'm trying to play at the same time.我有两个想要同时播放的短 wav 音频文件。 Using AudioKit, I have an AudioEngine(), and I'm assuming I should use a MultiSegmentAudioPlayer() as the output along with the scheduleSegments().使用 AudioKit,我有一个 AudioEngine(),我假设我应该使用 MultiSegmentAudioPlayer() 作为 output 以及 scheduleSegments()。 Here is what I have:这是我所拥有的:

class AudioPlayClass : ObservableObject {

var player = MultiSegmentAudioPlayer()
let engine = AudioEngine()

init(){}

    func playFiles(){
    
        self.engine.output = player
        do {
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: .defaultToSpeaker)
            try AVAudioSession.sharedInstance().setActive(true)
            try engine.start()
           guard let url = Bundle.main.url(forResource: note1, withExtension: "wav", subdirectory: instrumentDirectory) else {return}
            guard let url2 = Bundle.main.url(forResource: note2, withExtension: "wav", subdirectory: instrumentDirectory) else {return}
            let audioFile = try AVAudioFile(forReading: url)
            let audioFile2 = try AVAudioFile(forReading: url2)
            let fileSampleRate = audioFile.processingFormat.sampleRate
            let file2SampleRate = audioFile2.processingFormat.sampleRate
            let fileNumberOfSamples = audioFile.length
            let file2NumberOfSamples = audioFile2.length
            let audioFileEndTime = Double(fileNumberOfSamples)/fileSampleRate
            let audioFile2EndTime = Double(file2NumberOfSamples)/file2SampleRate

            let segment1 = segment(audioFile: audioFile,
                                   playbackStartTime: 0.0, fileStartTime: 0, fileEndTime: audioFileEndTime)
            let segment2 = segment(audioFile: audioFile2,
                                       playbackStartTime: 0.0, fileStartTime: 0, fileEndTime: audioFile2EndTime)

            player2.scheduleSegments(audioSegments: [segment1, segment2])
            player2.play()
        } catch {
            print(error.localizedDescription.debugDescription)
        }
    }
}

public struct segment : StreamableAudioSegment {
public var audioFile: AVAudioFile

public var playbackStartTime: TimeInterval

public var fileStartTime: TimeInterval

public var fileEndTime: TimeInterval

public var completionHandler: AVAudioNodeCompletionHandler?

}

I just have a basic understanding of playing audio in Swift and using AudioKit so any feedback would be greatly appreciated.我只是对在 Swift 中播放音频和使用 AudioKit 有基本的了解,因此非常感谢任何反馈。 Thanks!谢谢!

I think MultiSegmentAudioPlayer is mostly for playing sounds sequentially.我认为 MultiSegmentAudioPlayer 主要用于顺序播放声音。 You probably just want 2 AudioPlayer() and play them both at the same time.您可能只想要 2 个 AudioPlayer() 并同时播放它们。

Solved this by creating two separate instances of an AudioEngine(), each with their own respective AudioPlayer(), and loaded and played them immediately one after the other.通过创建两个单独的 AudioEngine() 实例解决了这个问题,每个实例都有各自的 AudioPlayer(),并立即一个接一个地加载和播放它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM