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 사용법에 대해 알아보았다.