Well, its really easy for recording audio in an iOS application.
We will decalre two variables in our View Controller
var recordingSession: AVAudioSession! var audioRecorder: AVAudioRecorder!
Request Permisson from the User
recordingSession = AVAudioSession.sharedInstance() do { try recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord) 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! }
Start Recording
func startRecording() { let audioFilename = getDocumentsDirectory() .appendingPathComponent("my_recording.m4a") let settings = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 12000, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue ] do { audioRecorder = try AVAudioRecorder( url: audioFilename, settings: settings) audioRecorder.delegate = self audioRecorder.record() } catch { finishRecording(success: false) } } func getDocumentsDirectory() -> URL { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let documentsDirectory = paths[0] return documentsDirectory }
Set Delegate
class ViewController: UIViewController, AVAudioRecorderDelegate
Finish Recording
func finishRecording(success: Bool) { audioRecorder.stop() audioRecorder = nil if success { // recording finished } else { // recording failed } }
Note :
Sometimes iOS Stops the recording when a phone call comes.
In that case we need to handle this. Since the delegate is our viewcontroller we can handle this using the delegate function audioRecorderDidFinishRecording
func audioRecorderDidFinishRecording( _ recorder: AVAudioRecorder, successfully flag: Bool) { if !flag { finishRecording(success: false) } }
Send your comments to coderzheaven@gmail.com
resume recording after incoming call