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

Posted

技术标签:

【中文标题】如何在 Swift 中连续录制音频并播放同一文件中的音频?【英文标题】:How to continuously record Audio and play Audio from same file in Swift? 【发布时间】:2018-11-16 17:00:29 【问题描述】:

我想创建一个类似助听器应用程序的东西,一旦我点击“startRecording”UIButton,它就会连续记录我所说的内容,并同时在我的耳机中播放给我听。基本上是为了帮助有听力障碍的人通过耳机更好地听到周围环境的声音。

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

我收到以下行的错误:audioPlayer.delegate = self

线程 1:致命错误:在展开可选值时意外发现 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()


    

【问题讨论】:

写入文件似乎是一个不必要的步骤,看看AVAudioEngine AVAudioEngine 似乎使用的缓冲区对于实时音频延迟来说太长了。 @CleverError 谢谢我会参考它,如果您已经熟悉使用 AVAudioEngine 的此类应用程序,请与我分享链接或伪代码:) @hotpaw2 一点延迟对我来说没问题,只要它能完成工作,你有任何我可以使用的应用程序的参考吗? 【参考方案1】:

AVAudioRecording to a file and read from that file to play 将导致实时音频的延迟过多,因为 API 使用相当大的样本块或缓冲区来写入和读取文件。

为您的目的使用的更好的 iOS API 是带有 RemoteIO 音频单元的音频单元 API。使用 RemoteIO 音频单元会导致从麦克风到扬声器(或耳机)的延迟非常低。然而,这是一个 C 回调 API,因为 Apple 目前不建议在实时音频上下文中使用 Swift。

【讨论】:

延迟对于此应用程序的范围是可以的。你能帮我纠正这个代码的错误吗?我的意思是不使用音频引擎。更糟的是,我会听取您的建议并使用 API

以上是关于如何在 Swift 中连续录制音频并播放同一文件中的音频?的主要内容,如果未能解决你的问题,请参考以下文章

Swift AVAudioPlayer 不会播放用 AVAudioRecorder 录制的音频

如何防止使用 AVFoundation 录制视频中断当前正在播放的任何全局音频(Swift)?

Android录制声音文件(音频),并播放

从无线耳机录制音频并通过蓝牙扬声器播放

如何录制/保存 iPhone 应用程序中正在播放的音频?

如何录制音频并将其保存到沙盒?