본문 바로가기
공부/[iOS&Swift]

[iOS] AVFoundation, AVAudioPlayer, Timer

by 인생은아름다워 2022. 2. 2.

✏️ AVFoundation

AVFoundation은 애플 플랫폼에서 시청각 미디어의 capture, process, synthesize, control, import, export 6개의 주요 기술 영역을 지원하는 프레임워크이다.

그러니까, 미디어 파일을 다룰 때 이 프레임워크를 이용하면 되는 것 같다!

참고로 아래에서 다룰 AVAudioPlayer 클래스는 AVFoundation에 선언되어있고, Timer 클래스는 UIKit에 선언되어있다.

(하나씩 주석 처리하고 어디서 에러가 발생하는지 확인해봄...)

✏️ AVAudioPlayer

음성 데이터를 파일이나 어떤 버퍼로부터 재생(또는 기타 기능)시킬 수 있는 객체(Object)

  • AVAudioPlayer를 이용하여
  1. 시간제한 없이(Any duration) 파일(또는 버퍼)로 부터 음성파일 재생 가능
  2. 볼륨, 속도, 스테레오 포지셔닝(Panning), 반복 재생 기능 등을 조절 가능
  3. 현재 재생 정보 얻기 가능(access playback-level metering data)
  4. 동시에 여러 플레이어를 통해 여러 개의 음성 재생 가능(싱크 맞춰서)
  • AVAudioPlayer의 주료 프로퍼티 및 메서드
var isPlaying: Bool
var volume: Float // 0.0~1.0
var rate: Float // 1: normal, 0.5: half, 2: doubled
var numberOfLoops: Int // 음수 설정시 무한반복(stop()으로 종료, 기본 0: 1회 재생 후 종료
var duration: TimeInterval // [s]
var currentTime: TimeInterval // [s]

func init(contentOf: URL)
func init(data: Data)
func play()
func play(atTime: TimeInterval)
func pause()
func stop()

✏️ Timer

어떤 인터벌의 시간이 지나면, 특정 메시지를 타깃 객체에 전달하는 클래스

Timer는 run loops라는 것과 함께 동작한다는데, Run Loop라는라는 것이 초보자인 나에게는 조금 생소한 개념이다. 조금 더 알고 난 후에 공부해볼 필요가 있을 것 같다. (아래 링크 참조!)

 

Run Loops

Run Loops Run loops are part of the fundamental infrastructure associated with threads. A run loop is an event processing loop that you use to schedule work and coordinate the receipt of incoming events. The purpose of a run loop is to keep your thread bus

developer.apple.com

  • Timer의 특징
  1. Run loop에서 동작한다.
  2. 생성할 때 반복 여부를 결정한다.

반복 타이머의 경우 특정 TimeInterval간격으로 실행되며, 기능을 정지하려면 invalidate() 메서드를 호출해야 하며, 비 반복 타이머의 경우 한 번 실행된 다음 자동으로 invalid상태가 된다.

  • Timer의 주요 프로퍼티 및 메서드
var isValid: Bool // 타이머가 유효한지?
var fireDate: Date // 다음에 시행될 시각
var timeInterval: TimeInterval // 실행 간격

// 1. 타이머 생성과 동시에 run loop에 default mode로 등록하는 메서드
class func scheduledTimer(withTimeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void)
class func scheduledTimer(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)
class func scheduledTimer(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)

// 2. 타이머 생성 후 수동으로 객체를 add(_: forMode: )메서드를 통해 run loop에 추가해줘야하는 메서드
func init(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)
func init(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)
func init(fireAt: Date, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)

🤔 unowned reference

코드를 보다 보니 [unowned self] (timer: Timer) 이런 전혀 이해가 되지 않는 부분이 있어서 대~충 구글링을 해보니 Unowned reference(미소유 참조)라는 개념이다.

ARC부분을 참고해야겠다.

 

Automatic Reference Counting — The Swift Programming Language (Swift 5.6)

Automatic Reference Counting Swift uses Automatic Reference Counting (ARC) to track and manage your app’s memory usage. In most cases, this means that memory management “just works” in Swift, and you don’t need to think about memory management your

docs.swift.org

 

댓글