AVFoundation은 미디어 앱을 만들기 위해서 필요한 기능들을 제공하는 프레임워크입니다
음성을 녹음하고 재생하기 위해서는 AVFoundation을 사용해야 합니다. 그런 기능들을 AVFoundation 이라는 프레임워크로 만들어 해당 기능을 하는 클래스들을 제공하고 있습니다.
필수 사전 설정
음성 녹음하기 전 반드시 info.plist 설정을 해야합니다.
Privacy - Microphone Usage Description
음성 녹음하기 전 반드시 AVAudioSession 을 사용하여 세팅을 해야합니다.
playAndRecord를 통해 앱이 오디오를 녹음과 재생을 동시에 할 수 있도록 설정하고 defaultToSpeaker 옵션을 사용하여 오디오가 기본적으로 스피커를 통해 재생되도록 설정합니다.
override init() {
super.init()
do {
try recordingSession.setCategory(.playAndRecord, options: .defaultToSpeaker)
AVAudioApplication.requestRecordPermission { allowed in
if !allowed {
print("Recording not allowed by the user" as! Error)
}
}
} catch {
print(error.localizedDescription)
}
}
AVAudioRecorder로 녹음하기
AVAudioRecorder란 오디오를 녹음하기 위해서 사용될 수 있는 객체입니다
AVAudioRecorder가 사용될 수 있는 방식
- 디바이스로부터 음성 녹음을 할 수 있습니다
- 녹음을 중지 및 제개할 수 있습니다
- 녹음되는 음량에 대한 크기를 측정할 수 있습니다
AVAudioRecorder 인스턴스 생성
음성을 녹음하기 위해서는 AVAudioRecorder 클래스가 필요합니다. 우선 AVAudioRecorder 클래스의 인스턴스를 생성해줍니다.
하지만 사용하기 위해서는 아래에 나올 init를 사용하여 좀 더 구체적으로 선언해야합니다.
class AudioRecorder {
var recorder = AVAudioRecorder()
}
AVAudioRecorder 인스턴스 초기화 방법
인스턴스를 초기화 하는 방법에는 2가지 방법이 있습니다. 초기화가 성공되면 새로운 audio recorder가 반환되며 아니면 nil이 반환됩니다
1. init(url: URL, settings: [String : Any]) 을 이용하여 dictionary 설정과 함께 초기화 하는 방법
2. init(url: URL, format: AVAudioFormat) 을 이용하여 AVAudioFormat 을 사용하여 초기화 하는 방법
URL 설정하기
init(url: ..)에서 URL은 FileManager를 이용하여 데이터를 로컬에 저장합니다.
- FileManager의 싱글톤인 default를 사용하고
- cachesDirectory에 캐시 파일을 저장하도록 설정한 후
- userDomainMask로 유저의 홈 디렉터리에 데이터를 저장하도록 설정합니다
- appendingPathComponent로 audio 타입의 "recording.m4a" 이름의 파일 저장 경로를 추가합니다.
var captureURL: URL {
(FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
.first?.appendingPathComponent("recording.m4a", conformingTo: .audio))!
}
settings 설정하기
settings를 통해서 인스턴스를 초기화하는 방법으로는 [String : Any]인 dictionary 타입을 사용해야합니다.
AVFormatIDKey 오디오 데이터의 형식을 지정합니다 |
kAudioFormatLinearPCM kAudioFormatMPEG4AAC kAudioFormatAppleLossless kAudioFormatAppleIMA4 kAudioFormatiLBC kAudioFormatULaw |
AVSampleRateKey 오디오 sampling rate(초당 샘플되는 횟수)를 지정합니다 |
8 kHz to 192kHz |
AVNumberOfChannelsKey 오디오 데이터의 채널 수를 지정합니다 |
1 to 64 |
AVEncoderAudioQualityKey 오디오의 퀄리티 정도를 지정합니다 |
AVAudioQuality.min AVAudioQuality.low AVAudioQuality.medium AVAudioQuality.high AVAudioQuality.max |
AVFormatIDKey
- kAudioFormatLinearPCM: 리니어 PCM(Linear Pulse Code Modulation) 형식. 무압축 오디오 데이터 형식입니다.
- kAudioFormatMPEG4AAC: MPEG-4 AAC(Advanced Audio Coding) 형식. 높은 압축률과 품질을 제공하는 오디오 코덱입니다.
- kAudioFormatAppleLossless: Apple Lossless Audio Codec(ALAC). 손실 없는 압축 오디오 코덱입니다.
- kAudioFormatAppleIMA4: IMA4 (Interactive Multimedia Association) 압축 오디오 형식. 비교적 낮은 품질의 압축 포맷입니다.
- kAudioFormatiLBC: iLBC (internet Low Bitrate Codec). 낮은 비트레이트의 오디오 코덱입니다. 주로 VoIP에 사용됩니다.
- kAudioFormatULaw: uLaw (Mu-law) 압축 형식. 주로 통신 시스템에서 사용됩니다.
AVSampleRateKey
초당 샘플되는 횟수를 의미하며 1Hz 동안에서 오디오 데이터를 몇번 샘플하는지를 의미합니다.
8000 Hz 정도: 전화 통화 품질, 기본 음성 녹음에 적합
44100 Hz 이상: CD, 고음질 녹음에 적합
AVNumberOfChannelsKey
오디오 데이터의 채널 수를 지정합니다
AVEncoderAudioQualityKey
오디오의 퀄리티 정도를 지정합니다, enum 값으로 종류는 아래와 같습니다
- min = 0
- low = 32
- medium = 64
- high = 96
- max = 127
AVAudioRecorder 인스턴스 초기화
위에서 파악한 토대로 audio recorder를 한번 만들어보겠습니다.
audioRecorder = try AVAudioRecorder(url: captureURL, settings: [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
])
녹음 시작
이후 AVAudioRecorder의 record 메서드를 이용하여 녹음을 시작합니다, 녹음되는 데이터는 지정된 URL에 저장됩니다.
func recordAudio() {
do {
recorder = try AVAudioRecorder(url: captureURL, settings: [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
])
recorder.record()
} catch {
print(error.localizedDescription)
}
}
녹음 중단
녹음을 잠깐 중단하고 싶으면 pause 메서드를 사용합니다.
func pauseRecordAudio() {
recorder.pause()
}
녹음 끝내기
녹음을 중단하고 싶으면 아래 코드처럼 stop 메서드를 사용합니다.
func stopRecordAudio() {
recorder.stop()
}
녹음 삭제
녹음된 오디오 파일을 삭제하려면 deleteRecording 메서드를 사용합니다.
func deleteRecordAudio() {
recorder.deleteRecording()
}
녹음 파일 재생하기
녹음 파일이 저장된 위치인 URL를 이용하여 녹음 파일을 재생할 수 있습니다
AVAudioPlayer를 이용하면 파일 또는 버퍼로 저장된 오디오 데이터를 재생할 수 있습니다.
AVAudioPlayer가 사용될 수 있는 방식
- 파일 또는 버퍼로부터 오디오를 재생
- 볼륨, 속도, 패닝,반복 여부를 설정 가능 (패닝이란 오디오 소리를 왼쪽 또는 오른쪽 채널 간에 배치하는 방법)
- 오디오의 볼륨 정보를 실시간으로 가져오는 기능 제공하여 오디오 볼륨에 따른 시각적 표현 가능
AVAudioPlayer 선언
AVAudioPlayer는 다음과 같이 선언될 수 있습니다. 물론 이렇게 설정하면 아무 동작도 하지 못하기 때문에 AVAudioRecorder처럼 초기화를 통한 설정이 필요합니다.
var audioPlayer = AVAudioPlayer()
초기화는 init(contentsOf: URL)를 사용하였습니다.
audioPlayer = try AVAudioPlayer(contentsOf: captureURL)
AVAudioPlayer를 이용한 녹음 파일 재생
녹음 파일을 재생하기 위해서는 위에서 초기화한 인스턴스와 play 메서드를 사용하며 코드는 다음과 같습니다.
func playRecordAudio() {
do {
audioPlayer = try AVAudioPlayer(contentsOf: captureURL)
audioPlayer.play()
} catch {
print(error.localizedDescription)
}
}
전체 코드
https://github.com/iOS-Developer-KR/SwiftUIRepository2/tree/main/AVFoundationTest
'SwiftUI' 카테고리의 다른 글
confirmationDialog 로 하단 메뉴 나타나게하기 (0) | 2024.06.03 |
---|---|
AVFoundation 사용자가 말하는 동안만 녹음하기 (0) | 2024.05.31 |
Sendable 프로토콜 (0) | 2024.05.25 |
AsyncPublisher (.value로 비동기적으로 데이터 처리) (0) | 2024.05.25 |
MacPaw/OpenAI SwiftUI Package 분석하기 (0) | 2024.05.25 |