Как непрерывно записывать аудио и воспроизводить аудио из одного файла в Swift? - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу создать что-то наподобие приложения для слухового аппарата, в котором, когда я нажимаю кнопку UIB «startRecording», она непрерывно записывает то, что я говорю, и одновременно воспроизводит его мне одновременно в наушниках.По сути, это помогает людям с нарушениями слуха лучше и громче слышать звуки из окружающей среды.

Я пытаюсь реализовать это с помощью AVAudioKit, когда AudioRecorder и AudioPlayer работают вместе с одним и тем же путем к файлу"filename", в цикле while.

Я получаю ошибку для строки: audioPlayer.delegate = self

Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения.

            @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 голосов
/ 16 ноября 2018

AVAudioЗапись в файл и чтение из этого файла для воспроизведения приведет к слишком большой задержке для звука в реальном времени из-за того, что API записывает и читает файлы, используя довольно большие блоки или буферы выборок.

Лучшим API для iOS для ваших целей является API Audio Unit с RemoteIO Audio Unit.Использование аудиоустройства RemoteIO может привести к очень низким задержкам между микрофоном и динамиком (или гарнитурой).Однако это API-интерфейс обратного вызова C, поскольку Apple в настоящее время не рекомендует использовать Swift в контексте аудио в реальном времени.

...