I'm working on voice recorder. When I'm running the code in simulator it's not working.I want the when user record the voice of 1 second upload this voice on backend. How can get the url of voice recorder and stored on backend server? Can we testing the voice recording in simulator or in real mobile device? I've watched some resources that tested on simulator. See my code and guide me best way to record the voice and stored on backend server.
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
class ViewController: UIViewController {
@IBOutlet var recordButton: UIButton!
@IBOutlet var playButton: UIButton!
var recordingSession: AVAudioSession!
var audioRecorder: AVAudioRecorder!
var audioPlayer: AVAudioPlayer!
override func viewDidLoad() {
super.viewDidLoad()
recordingSession = AVAudioSession.sharedInstance()
do {
try recordingSession.setCategory(.playAndRecord, mode: .default)
try recordingSession.setActive(true)
recordingSession.requestRecordPermission { [unowned self] allowed in
DispatchQueue.main.async {
if allowed {
self.loadRecordingUI()
} else {
// failed to record
}
}
}
} catch {
// failed to record!
}
}
func loadRecordingUI() {
recordButton.isHidden = false
recordButton.setTitle("Tap to Record", for: .normal)
}
@IBAction func recordButtonPressed(_ sender: UIButton) {
if audioRecorder == nil {
startRecording()
} else {
finishRecording(success: true)
}
}
@IBAction func playButtonPressed(_ sender: UIButton) {
if audioPlayer == nil {
startPlayback()
} else {
finishPlayback()
}
}
func startRecording() {
let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.medium.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
audioRecorder.delegate = self
audioRecorder.record()
recordButton.setTitle("Tap to Stop", for: .normal)
} catch {
finishRecording(success: false)
}
}
func finishRecording(success: Bool) {
audioRecorder.stop()
audioRecorder = nil
if success {
recordButton.setTitle("Tap to Re-record", for: .normal)
playButton.setTitle("Play Your Recording", for: .normal)
playButton.isHidden = false
} else {
recordButton.setTitle("Tap to Record", for: .normal)
playButton.isHidden = true
// recording failed :(
}
}
func startPlayback() {
let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")
do {
audioPlayer = try AVAudioPlayer(contentsOf: audioFilename)
audioPlayer.delegate = self
audioPlayer.play()
playButton.setTitle("Stop Playback", for: .normal)
} catch {
playButton.isHidden = true
// unable to play recording!
}
}
func finishPlayback() {
audioPlayer = nil
playButton.setTitle("Play Your Recording", for: .normal)
}
}
extension ViewController: AVAudioRecorderDelegate {
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
if !flag {
finishRecording(success: false)
}
}
}
extension ViewController: AVAudioPlayerDelegate {
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
finishPlayback()
}
}