본문 바로가기

개발 코딩 정보 공유/애플 iOS 스위프트 Xcode

오디오 플레이어 레코드 만들기 - 녹음 기능을 구현해보자

간단하게 녹음기능을 구현할수 있다

소개

안녕하세요. 지난 글에 이어서 녹음 기능을 구현해 보겠습니다.

역시나 오픈 소스를 이용하지 않고 AVFoundation을 이용해서 구현해보겠습니다.

녹음이 시작 되면 오디오 파일이 생성되고 그 파일을 재생하는 기능입니다.

 

2023.03.31 - [개발 코딩 정보 공유/애플 iOS 스위프트 Xcode] - 오디오 플레이어 녹음 앱 만들기? 바로 시작 해보자

2023.03.05 - [개발 코딩 정보 공유/애플 iOS 스위프트 Xcode] - 파이어베이스를 이용한 IOS 테스트 배포

녹음 기능을 구현해보자

본문

권한설정

우선 마이크에 대한 권한 설정부터 하겠습니다.

자신의 info.plist 에서 Privacy - Microphone Usage Description 의 내용을 설정 합니다.

또한 파일이 저장되고 있는지 확인하기 위해 아래의 권한도 설정해줍니다.

 

마이크 사용 권한을 설정합니다
file 저장 확인을 위해 권한을 설정한다

 

작업시작

지난 시간의 오디오 플레이어 클래스에 작업하셔도 되고 따로 만드셔도 상관없습니다.

class audioRecorderViewController : AVAudioRecorderDelegate {
//...
}

뷰 컨트롤러 클래스는 하나 만들고 delegate를 추가해주겠습니다. 

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    //...
}

delegate를 추가했으니 해당 함수를 구현해주겠습니다. 내용구현은 자신의 소스에 맞게 하시면 됩니다.

레코딩이 종료된후 call 되는 형태 이므로 자원정리 및 화면을 클린하는 형태의 구현을 하시면 되겠습니다.

 

 //rec
var aRecorder : AVAudioRecorder!
var recFile : URL!
var timer : Timer!

 

필요한 변수를 선언하고 녹음 파일이 저장될 경우 사용될 파일을 선언 합니다.

해당 소스는 viewDidLoad 정도에 구현하면 좋겠습니다.

//rec file
let docDic = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
recFile = docDic.appendingPathComponent("recFile.m4a")
//셋팅 조정 필요
let rSettings = [
    AVFormatIDKey : NSNumber(value: kAudioFormatAppleLossless as UInt32),
    AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
    AVEncoderBitRateKey : 320000,
    AVNumberOfChannelsKey : 2,
    AVSampleRateKey : 44100.0] as [String : Any]

do {
  aRecorder = try AVAudioRecorder(url: recFile, settings: rSettings)
} catch let error as NSError {
    print("Error-initRecord : \(error)")
}

aRecorder.delegate = self

 

레코더를 초기화 하기 위해 오디오 품질 셋팅과 딜레게이트를 셋팅합니다.

오디오 플레이어와 마찬가지로 세션도 초기화 해야 합니다. 

 

let session = AVAudioSession.sharedInstance()
do {
    try session.setCategory(.record, mode: .default)
    try session.setActive(true)

} catch let error as NSError {
    print(" AVAudioSession : \(error)")

}

세션은 category 설정을 제대로 해주셔야 합니다. 

녹음을 할 것이므로 .record 를 지정하겠습니다. (혹은 .playAndRecord)

초기화 관련 작업은 완료 되었습니다.

 

녹음 버튼을 하나 두고 아래의 코드를 실행하겠습니다.

sender.setBackgroundImage(UIImage(systemName: "stop"), for: .normal)
aRecorder.record()
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateRecordTime) , userInfo: nil, repeats: true)

놓친 부분이 있습니다. 녹음을 진행하면서 화면에 현재 progress 를 업데이트 하는 부분 입니다.

@objc func updateRecordTime() {
    if(aRecorder.isRecording){
        print("\(audioRecorder.currentTime)")
    }
}

이게 전부 입니다. 정말 간단하게 녹음기능을 구현완료 하였습니다.

녹음기능을 구현하면 이게 제대로 저장되고 있는지 궁금합니다.

 

파일 저장 확인

자신의 테스트 아이폰을 연결합니다. finder를 여시고 아이폰의 탐색창으로 이동합니다.

이런식으로 왼편에 자신의 아이폰이 보이실겁니다.

 

 

그리고 파일 탭으로 이동하셔서 자신의 앱 아래의 하위 파일을 확인합니다.

제대로 되었다면 우리가 지정한 recFile 이 저장되어 있을것입니다.

 

 

끝으로

오디오 플레이/녹음 기능을 구현해 보았습니다. 

꽤나 간단해서 오픈소스를 사용할 필요가 없습니다.

 

 

참고문서

https://developer.apple.com/documentation/avfoundation/audio_playback_recording_and_processing