IT

iOS AVPlayer 멜론 음악 끊김 해결 | AudioSession 완벽 가이드

초코모찌롤 2026. 4. 3. 09:32
반응형
iOS AVPlayer 멜론 음악 끊김 해결 | AudioSession 완벽 가이드

iOS AVPlayer 재생 시 멜론 음악 끊김 해결 방법 (AudioSession 완벽 정리)

iOS에서 영상 재생을 위해 AVPlayer를 사용하면, 기존에 재생 중이던 음악 앱이 갑자기 멈추는 현상을 자주 겪게 된다. 특히 :contentReference[oaicite:0]{index=0} 같은 음악 앱을 사용하는 경우 매우 자주 발생한다.

이 문제는 AVPlayer가 아니라 AudioSession 정책 때문이며, 설정을 정확히 이해하면 완전히 해결할 수 있다.


🔍 왜 멜론 음악이 멈출까?

iOS는 여러 앱이 동시에 소리를 재생할 때 충돌을 방지하기 위해 Audio Session이라는 시스템을 사용한다.

  • 기본 상태 → 다른 앱 오디오 중단
  • mix 설정 없음 → 기존 음악 앱 종료
  • AVPlayer.play() 호출 시 자동으로 오디오 세션 활성화

즉, 별도 설정 없이 아래 코드만 실행해도:


player.play()

👉 시스템이 자동으로 독점 오디오 모드로 전환되며 👉 멜론 음악이 강제로 중단된다


🎧 AudioSession 핵심 구조

1. Category (오디오 타입)

Category 설명 다른 앱 영향
.ambient 효과음 / 영상 유지됨
.playback 영상 / 음악 앱 중단됨
.soloAmbient 기본값 중단됨

2. Options (동작 옵션)

  • .mixWithOthers → 다른 앱과 동시에 재생
  • .duckOthers → 다른 앱 소리 줄임

✅ 해결 방법 (핵심 코드)

✔️ 방법 1. 음악 유지 (가장 추천)


let session = AVAudioSession.sharedInstance()
try session.setCategory(.ambient)
try session.setActive(true)

✔️ 멜론 음악 유지
✔️ 영상만 재생됨
✔️ 가장 자연스러운 UX


✔️ 방법 2. 영상 소리 + 음악 같이


let session = AVAudioSession.sharedInstance()
try session.setCategory(.playback, options: [.mixWithOthers])
try session.setActive(true)

✔️ 영상 소리도 들림
✔️ 멜론도 유지됨


✔️ 방법 3. 다른 음악 강제 중단


try session.setCategory(.playback)

✔️ 유튜브 / 넷플릭스 스타일
✔️ 다른 앱 오디오 중단


🎬 기존 AVPlayer 코드 적용 예시


private func playMP4(from url: URL) {

    let session = AVAudioSession.sharedInstance()
    try? session.setCategory(.ambient)
    try? session.setActive(true)

    let playerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)

    playerLayer = AVPlayerLayer(player: player)
    playerLayer?.videoGravity = .resizeAspectFill

    if let playerLayer = playerLayer {
        playerLayer.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer)
    }

    player?.play()
}

🚨 실무에서 꼭 알아야 할 포인트

❗ AudioSession은 앱 전체 공유

AudioSession은 싱글톤이기 때문에 한 화면에서 변경하면 앱 전체에 영향을 준다.

❗ 화면 종료 시 반드시 해제


override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    try? AVAudioSession.sharedInstance().setActive(false)
}

👉 이걸 안 하면 다른 화면에서도 계속 영향 발생


💡 실무 추천 구조 (AudioManager)


final class AudioManager {

    static let shared = AudioManager()

    enum Mode {
        case silentVideo
        case mixedVideo
        case exclusive
    }

    func configure(_ mode: Mode) {
        let session = AVAudioSession.sharedInstance()

        do {
            switch mode {
            case .silentVideo:
                try session.setCategory(.ambient)
            case .mixedVideo:
                try session.setCategory(.playback, options: [.mixWithOthers])
            case .exclusive:
                try session.setCategory(.playback)
            }
            try session.setActive(true)
        } catch {
            print(error)
        }
    }

    func deactivate() {
        try? AVAudioSession.sharedInstance().setActive(false)
    }
}

🔥 핵심 요약

  • AVPlayer 문제가 아니라 AudioSession 문제
  • 기본 설정 → 다른 음악 앱 중단
  • .ambient → 완전 공존
  • .playback + mixWithOthers → 같이 재생
반응형