티스토리 뷰
AVAudioPlayer vs AVPlayer
- AVAudioPlayer 백그라운드 여러개 재생, data 재생 가능하고 AVPlayer보다 간단한 오디오 재생 관련 기능만 제공한다
- AVPlayer 실시간 스트림 기능 제공, 한 플레이어당 하나의 플레이 아이템에 대한 playback 정보를 제공하기 위해서 하나의 아이템만 재생함. (ios 버전마다 다르지만) 한 화면에서 여러개의 객체가 생성이 가능하지만(ios 버전마다 다르지만) 애플의 궁극적인 목적은 AVPlayer는 한 화면에서 하나만 생성하는게 정상적인 것으로 보이고 player에 playerItem을 교체해 주는것이 맞을것으로 보임.
AVPlayer 사용법
1. AVPlayer 생성
// 여러 가지 재생할 때
let player = AVPlayer()
// 한가지만 재생할 때
let player = AVPlayer(url: someURL)
2. AVPlayerItem
- AVAsset을 사용한 AVFoundation인 클래스(객체)
- 미디어 재생 시 사용
- AVAsset은 정적 데이터만 가지고있고 AVPlayer를 만들어서 AVPlayer를 사용해야함
let fileUrl = file.url
let asset = AVAsset(url: fileUrl)
let playerItem = AVPlayerItem(asset: asset,
automaticallyLoadedAssetKeys: requiredAssetKeys)
3. control
- player.replaceCurrentItem(with: playerItem)
AVPlayer는 한가지 미디어 소스에 대한 playback만 제공하기 때문에 replaceCurrentItem을 사용해서 currentItem을 바꿉니다.currentItem은 현재 재생되는 중인 미디어
- addPeriodicTimeObserver(forInterval:queue:using:)
현재 재생 시간에 대해 observing 함.
let interval = CMTime(seconds: 1, preferredTimescale: 1)
let timeObserverToken = player.addPeriodicTimeObserver(
forInterval: interval,
queue: .main,
using: playTimeCallback)
4. AVAudioSession
싱글톤으로 제공중. 오디오 포커스를 가지고 옴
let session = AVAudioSession.sharedInstance()
- setActive(true or false): 오디오 포커싱 잡았다 품
- category
- Mode
- default: 웬만하면 이걸로 하면 된다
- moviePlayback: 영상 재생 시
- videoRecording: 영상 녹화 시
- spokenAudio: for continuous spoken audio. (ex) 팟캐스트 앱은 이 모드를 사용
- voicePrompt: 카플레이 등을 위한 모드. for text-to-speech
- CategoryOption
- mixWithOthers: 다른 앱의 소리와 우리 앱 소리가 함께 들릴 수 있게 하는 옵션.
- duckOthers: 다른앱과 우리 앱 소리가 함께 나는데 우리 앱에서 소리가 날 때는 다른 앱 소리를 살짝 죽이는 옵션.
- interruptSpokenAudioAndMixWithOthers: mixWithOthers + 다른 앱에서 spokenAudio 가 출력될 때에만 interrupt 걸고 우리 앱이 소리를 독차지
- allowBluetoothA2DP: 블루투스 디바이스 지원을 위한 옵션
- playback 카테고리에서는 기본제공이지만 playAndRecord 카테고리에서는 기본이 아니기 때문에 따로 셋팅해주어야 함
- defaultToSpeaker: 연결된 오디오 receiver가 따로 있을때(ex: 아이폰 built-in receiver, 이어폰, 카오디오 등), 그쪽이 아닌 폰 speaker로 오디오를 전달하게 해주는 옵션
5. 기타
- RouteCategory: 어떤 오디오 스피커를 사용할지 결정 기본 외장스피커인지 통화 스피커인지, 블루투스 기기인지 path
- 애플에서 지원하는 코덱 관련: https://developer.apple.com/documentation/audiotoolbox/audio_file_stream_services/1576497-audio_file_types
- interrupt나 playEnd에 대한 이벤트는 notification center를 만들어 줘야한다.(이건 다음 기회에)
댓글