반응형
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 → 같이 재생
반응형
'IT' 카테고리의 다른 글
| AutoLayout vs SwiftUI Layout 시스템 완벽 비교 (0) | 2026.04.03 |
|---|---|
| iOS trailing vs trailingAnchor 차이 완벽 정리 (0) | 2026.04.03 |
| 디자인 시스템 기반 iOS 테마 관리 방법 (UIKit + Swift 실무 아키텍처) (0) | 2026.03.31 |
| iOS 26 TabBar Liquid 스타일 완전히 제거하는 방법 (UITabBarAppearance 설정) (0) | 2026.03.31 |
| iOS 26 Liquid 네비게이션 스타일 완전히 제거하는 방법 (UINavigationBar 커스터마이징) (0) | 2026.03.31 |