안녕하세요! 피피아노입니다 🎵
이번에는 제가 진행하는 프로젝트에서 AVFoundation을 이용해서 구현 기능을 해야 하는 부분이 있어서 한번 정리를 해보려고 합니다.
그럼 바로 시작하겠습니다!
AVFoundation이란?
AVFoundtaion은 공식 문서에서 이렇게 설명하고 있습니다.
"Work with audiovisual assets, control device cameras, process audio, and configure system audio interactions."
해석을 해보자면
audiovisual 에셋, 카메라 장치 제어, 오디오 처리, 시스템 오디오 상호 작용에 대한 역할을 해주는 프레임워크입니다.
https://developer.apple.com/documentation/avfoundation/
AVFoundation | Apple Developer Documentation
Work with audiovisual assets, control device cameras, process audio, and configure system audio interactions.
developer.apple.com
그냥 간단하게 설명하자면 audiovisual 에셋, 카메라 장치 제어, 오디오 처리, 시스템 오디오 상호작용에 대한 기능을 제공해주는 프레임워크로 생각하면 됩니다.
주요 특징
- 미디어 재생: 오디오 및 비디오 파일을 재생할 수 있습니다. AVPlayer 및 AVPlayerItem 클래스를 사용하여 미디어 재생을 제어할 수 있습니다.
- 미디어 녹화: 카메라 및 마이크로폰을 사용하여 오디오 및 비디오를 녹화할 수 있습니다. AVCaptureSession, AVCaptureDevice, AVCaptureInput, AVCaptureOutput 클래스 등을 사용합니다.
- 미디어 편집: AVAsset 및 AVAssetTrack 클래스를 사용하여 미디어 파일을 자르고, 병합하고, 트랙을 수정할 수 있습니다.
- 미디어 스트리밍: AVFoundation을 사용하여 네트워크를 통해 미디어를 스트리밍할 수 있습니다.
- 메타데이터 관리: 미디어 파일의 메타데이터(예: 제목, 아티스트, 앨범, 커버 아트 등)를 읽고 쓸 수 있습니다.
사용방법
사용방법은 음성녹음을 예시로 알아보겠습니다.
음성 녹음 기능을 구현하기 위해서는 AVFoundation 프레임워크를 사용해야 합니다. 여기서는 AVAudioRecorder 클래스를 사용하여 간단한 음성 녹음 기능을 구현하는 예제를 보여드리겠습니다.
프로젝트 설정
1. 프로젝트에 AVFoundation 추가
Xcode 프로젝트를 생성한 후, Info.plist 파일에 마이크 사용 권한을 요청하는 항목을 추가합니다.
<key>NSMicrophoneUsageDescription</key>
<string>녹음을 위해 마이크 접근이 필요합니다.</string>
2. AVFoundation 프레임워크 Import
Swift 파일에서 아래 소스 코드를 추가해줍니다.
import AvFoundation
3. AVAudioRecorder 설정
음성 녹음을 위해서 AVAudioRecorder라는 클래스를 만들고 기능을 구성해보았습니다.
class AudioRecorder: NSObject, ObservableObject {
var audioRecorder: AVAudioRecorder!
@Published var isRecording = false
override init() {
super.init()
setupRecorder()
}
func setupRecorder() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playAndRecord, mode: .default)
try session.setActive(true)
session.requestRecordPermission { allowed in
if !allowed {
print("Permission to record not granted")
}
}
} catch {
print("Failed to setup session: \(error)")
}
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let audioFilename = documentsPath.appendingPathComponent("recording.m4a")
do {
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
audioRecorder.prepareToRecord()
} catch {
print("Failed to setup recorder: \(error)")
}
}
func startRecording() {
audioRecorder.record()
isRecording = true
}
func stopRecording() {
audioRecorder.stop()
isRecording = false
}
}
코드를 자세하게 살펴보겠습니다.
클래스 선언, 변수 정의
class AudioRecorder: NSObject, ObservableObject {
var audioRecorder: AVAudioRecorder!
@Published var isRecording = false
- AudioRecorder 클래스는 NSObject를 상속받고, ObservableObject 프로토콜을 채택합니다. 이는 SwiftUI에서 상태 변화를 감지하고 UI를 업데이트할 수 있도록 하기 위함입니다.
- audioRecorder: AVAudioRecorder 인스턴스를 저장하기 위한 변수입니다.
- isRecording: 녹음 중인지 여부를 나타내는 Boolean 변수입니다. 이 변수는 @Published 속성을 가지며, SwiftUI에서 이 변수가 변경될 때마다 UI가 업데이트됩니다.
초기화 메서드
override init() {
super.init()
setupRecorder()
}
- 클래스가 초기화될 때 호출되는 메서드입니다. 여기서는 setupRecorder() 메서드를 호출하여 녹음기를 설정합니다.
녹음 설정 메서드
func setupRecorder() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playAndRecord, mode: .default)
try session.setActive(true)
session.requestRecordPermission { allowed in
if !allowed {
print("Permission to record not granted")
}
}
} catch {
print("Failed to setup session: \(error)")
}
- AVAudioSession을 설정하여 오디오 녹음과 재생을 관리합니다.
- setCategory(.playAndRecord, mode: .default): 오디오 세션의 카테고리를 녹음과 재생으로 설정합니다.
- setActive(true): 오디오 세션을 활성화합니다.
- requestRecordPermission: 마이크 사용 권한을 요청합니다. 사용자가 권한을 허용하지 않으면 콘솔에 메시지를 출력합니다.
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let audioFilename = documentsPath.appendingPathComponent("recording.m4a")
do {
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
audioRecorder.prepareToRecord()
} catch {
print("Failed to setup recorder: \(error)")
}
}
녹음 설정(settings):
- AVFormatIDKey: 오디오 포맷을 AAC로 설정합니다.
- AVSampleRateKey: 샘플 레이트를 12000Hz로 설정합니다.
- AVNumberOfChannelsKey: 채널 수를 1로 설정합니다.
- AVEncoderAudioQualityKey: 오디오 인코더의 품질을 높음으로 설정합니다.
녹음 파일 경로 설정:
- 앱의 도큐멘트 디렉토리에 recording.m4a 파일을 생성합니다.
AVAudioRecorder 초기화 및 준비
- AVAudioRecorder 인스턴스를 생성하고 설정된 파일 경로와 설정을 사용하여 초기화합니다.
- 녹음을 시작하기 전에 prepareToRecord()를 호출하여 준비합니다.
녹음 시작 및 중지 메서드
func startRecording() {
audioRecorder.record()
isRecording = true
}
func stopRecording() {
audioRecorder.stop()
isRecording = false
}
}
- startRecording(): 녹음을 시작합니다. audioRecorder.record()를 호출하여 녹음을 시작하고, isRecording 변수를 true로 설정합니다.
- stopRecording(): 녹음을 중지합니다. audioRecorder.stop()를 호출하여 녹음을 중지하고, isRecording 변수를 false로 설정합니다.
오늘은 여기까지 :)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > SwiftUI' 카테고리의 다른 글
[SwiftUI] @AppStorage와 @SceneStorage 프로퍼티 래퍼 이해하기 (6) | 2024.09.11 |
---|---|
[SwiftUI] Property Wrapper 알아보기 (0) | 2024.07.29 |
[SwiftUI] Core Data를 사용해보자 (0) | 2024.07.07 |
[SwiftUI] ObservedObject가 뭘까?? (0) | 2024.06.06 |
[SwiftUI] @State란 무엇일까? (2) | 2024.05.27 |