我想创建一个类似于助听器的应用程序,当我按下“ 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()
}
答案 0 :(得分:0)
AVAudioRecord记录到文件并从该文件读取以进行播放将导致实时音频的延迟过多,这是因为API使用相当大的样本块或缓冲区来写入和读取文件。
更好的iOS API是带有RemoteIO音频单元的音频单元API。使用RemoteIO音频单元可能导致麦克风到扬声器(或耳机)的等待时间非常短。但是,这是一个C回调API,因为Apple当前不建议在实时音频上下文中使用Swift。