如何在Swift中连续录制音频并播放同一文件中的音频?

时间:2018-11-16 17:00:29

标签: ios swift avaudioplayer

我想创建一个类似于助听器的应用程序,当我按下“ startRecording” UIButton时,它会连续记录我在说什么,并同时在我的耳机中同时播放给我。基本上是帮助听力障碍的人通过耳机更好地,更大声地听到周围环境的声音。

我正在尝试使用AVAudioKit来实现它,而AudioRecorder和AudioPlayer会在while循环中与相同的文件路径“文件名”一起工作。

我得到以下错误:audioPlayer.delegate = self

线程1:致命错误:展开一个Optional值时意外发现nil。

            @IBOutlet weak var startRecording: UIButton!

var recordingSession : AVAudioSession!
var audioRecorder : AVAudioRecorder!
var audioPlayer : AVAudioPlayer!
var fileNameString : String = "test.m4a"




@IBAction func buttonPressed(_ sender: Any) {

    print("button pressed")
    let filename = getDirectory().appendingPathComponent("\(fileNameString)")


    if audioRecorder == nil{ // DAF needs to be started



        let settings = [AVFormatIDKey: Int(kAudioFormatAppleLossless),
                        AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue,
                        AVEncoderBitRateKey: 320000,
                        AVNumberOfChannelsKey: 1,
                        AVSampleRateKey: 12000.0] as [String : Any]

        do{

            audioRecorder = try AVAudioRecorder(url: filename, settings: settings)
            audioRecorder.delegate = self
            //audioRecorder.record()

            do{
                audioPlayer = try AVAudioPlayer(contentsOf: filename, fileTypeHint: nil)
            }
            catch let error{
                print("\(error)")
            }
            audioPlayer.delegate = self
            audioPlayer.prepareToPlay()

            while true {
                audioRecorder.record()
                sleep(1)
                audioPlayer.play()
            }

            //startRecording.setTitle("Stop ", for: .normal)


        } catch{

            print ("failed")

        }

    }
    else { // DAF started, needs to stop

        audioRecorder.stop()
        audioRecorder = nil

        startRecording.setTitle("Start", for: .normal)

        playRecording()


    }

1 个答案:

答案 0 :(得分:0)

AVAudioRecord记录到文件并从该文件读取以进行播放将导致实时音频的延迟过多,这是因为API使用相当大的样本块或缓冲区来写入和读取文件。

更好的iOS API是带有RemoteIO音频单元的音频单元API。使用RemoteIO音频单元可能导致麦克风到扬声器(或耳机)的等待时间非常短。但是,这是一个C回调API,因为Apple当前不建议在实时音频上下文中使用Swift。