📀
AVFoundation-시작하기
July 05, 2024
AVFoundation-시작하기
오늘은 오디오/비디오를 다루기 위한 AVFoundation, AVKit 에 대해서 알아보고, ‘로컬 재생’의 간단한 예제를 통해서 다루어보았습니다.
주의 사항
- 대용량 미디어 파일의 앱 크기 영향 -
(하루에 2~3만원 정도의 서버 비용이 발생할 수 있다.) - 저작권 및 라이선스 확인 - (사용자가 불법적으로 컨텐츠를 사용하고 있지 않은지, 실시간 모니터링 운영 팀이 있어야 한다.)
- 접근성 고려 (자막, 오디오 설명 등) -
AVAudioPlayer (Audio - Video Player)
Audio App
// AudioPlayerManager
// 오디오 파일은 용량이 크고 인코딩 과정에서 실패할 수 있기에, 따로 로딩하는 과정이 필요하다
class AudioPlayerManager {
var audioPlayer: AVAudioPlayer?
func loadAudio(name fileName: String, withExtension ext: String) {
guard let url = Bundle.main.url(forResource, fileName, withExtension: ext) else {
print("Audio file not found")
return
}
do {
// 플레이가 가능한 상태로 만듬_인코딩
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.prepareToPlay()
} catch {
print("Error loading audio: \(error.localizedDescription))
}
}
}
// play, pause, 그리고 stop 메소드도 만든다.
func play() {
audioPlayer?.play()
}
func pause() {
audioPlayer?.pause()
}
func stop() {
audioPlayer?.stop()
audioPlayer?.currentTime = 0
}
그리고 만든 플레이어를 ContentView 에 적용한다.
struct ContentView: View {
var audioPlayerManager = AudioPlayerManager()
@State private var playAudio = false
var body: some View {
VStack {
Button(action: {
if !playAudio {
audioPlayerManager.play()
} else {
audioPlayerManager.pause()
}
playAudio.toggle()
}, label: {
Text(!playAudio ? "Play audio" : "Pause audio")
})
}
.padding()
.onAppear {
audioPlayerManager.loadAudio(name: "Smaill World", withExtension: "mp3")
}
}
}
Video App
GPU, HardWare 의 영향을 많이 받는 코드이기에, 따로 커스텀이 필요하지만, 간단히 Video 를 앱에서 재생해보는 코드를 작성해보았다.
AVKit 을 사용하면 아주 간단하게 비디오를 추가할 수 있다.
아래 코드는 videoOverlay 를 추가하여, 비디오 위에 텍스트를 얹어보았다. 원래는 어려운 일이지만, SwiftUI에서는 아주 쉽게 할 수 있다.
struct ContentView: View {
@State var player: AVPlayer?
var body: some View {
VideoPlayer(player: player, videoOverlay: {
VStack {
Spacer()
Text("Overlay text to appear")
}
})
.frame(height: 320)
.onAppear {
guard let videoURL = Bundle.main.url(forResource: "SaturnV", withExtension: "mov") else {
print("Video file not found")
return
}
player = AVPlayer(url: videoURL as URL)
}
.ignoreSafeArea()
}
}
이렇게 AVFoundation 사용법에 대해 알아보았다.