๊ธ€ ์ž‘์„ฑ์ž: ์ด์ง€์›๐ŸŒฉ๏ธ

๊ฐœ์š”

AVFoundation์„ ์ด์šฉํ•ด์„œ ์˜ค๋””์˜ค๋ฅผ ๋…น์Œ, ์žฌ์ƒ, ์ €์žฅํ•ด๋ณด์ž.

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋จผ์ € AVFoundation ์š”์†Œ ์ค‘์—์„œ ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

  • AVAudioSession
  • AVAudioRecorder
  • AVAudioPlayer

AVAudioSession

class AVAudioSession: NSObject

An audio session acts as an intermediary between your app and the operating system—and, in turn, the underlying audio hardware.

์˜ค๋””์˜ค ์„ธ์…˜์€ ์•ฑ๊ณผ ์šด์˜ ์ฒด์ œ ์‚ฌ์ด์˜ ์ค‘๊ฐœ์ž ์—ญํ• ์„ ํ•˜๋ฉฐ ๊ธฐ๋ณธ ์˜ค๋””์˜ค ํ•˜๋“œ์›จ์–ด ์—ญํ• ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  iOS, tvOS, watchOS ์•ฑ์—๋Š” ๋‹ค์Œ ๋™์ž‘์œผ๋กœ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋œ ๊ธฐ๋ณธ ์˜ค๋””์˜ค ์„ธ์…˜์ด ์žˆ๋‹ค.

  • ์˜ค๋””์˜ค ์žฌ์ƒ์€ ์ง€์›ํ•˜์ง€๋งŒ ์˜ค๋””์˜ค ๋…น์Œ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. (tvOS๋Š” ์˜ค๋””์˜ค ๋…น์Œ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.)
  • iOS์—์„œ ๋ฒจ์†Œ๋ฆฌ/๋ฌด์Œ ์Šค์œ„์น˜๋ฅผ ๋ฌด์Œ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜๋ฉด ์•ฑ์—์„œ ์žฌ์ƒ์ค‘์ธ ๋ชจ๋“  ์˜ค๋””์˜ค๊ฐ€ ๋ฌด์Œ์œผ๋กœ ์„ค์ •๋œ๋‹ค.
  • iOS์—์„œ ๊ธฐ๊ธฐ๋ฅผ ์ž ๊ทธ๋ฉด ์•ฑ์˜ ์˜ค๋””์˜ค๊ฐ€ ์Œ์†Œ๊ฑฐ๋œ๋‹ค.
  • ์•ฑ์—์„œ ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฐฐ๊ฒฝ ์˜ค๋””์˜ค๋Š” ์Œ์†Œ๊ฑฐ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์•ฑ์˜ ์˜ค๋””์˜ค ์„ธ์…˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋Š” 7๊ฐ€์ง€์ด๊ณ , ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋Š” playback์ด๋‹ค. ์ด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์Œ ๋ชจ๋“œ๋กœ ์„ค์ •๋œ ์ƒํƒœ์—์„œ๋„ ์•ฑ์˜ ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฐธ๊ณ 

AVAudioSession ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ฑ์˜ ์˜ค๋””์˜ค ์„ธ์…˜์„ ๊ตฌ์„ฑํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์นดํ…Œ๊ณ ๋ฆฌ, ๋ชจ๋“œ, ๊ธฐํƒ€ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์ด๋‹ค. ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ์˜ค๋””์˜ค ์„ธ์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ดํ›„, setActive(_:) ๋˜๋Š” setActive(_:options:) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์œ„์—์„œ ๊ตฌ์„ฑํ•œ ์„ค์ •์ด ์ ์šฉ๋œ๋‹ค.

AVAudioRecorder

class AVAudioRecorder: NSObject

์˜ค๋””์˜ค ๋ ˆ์ฝ”๋”๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‹œ์Šคํ…œ์˜ ํ™œ์„ฑ ์ž…๋ ฅ ์žฅ์น˜์—์„œ ์˜ค๋””์˜ค ๋…น์Œ
  • ์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋…น์Œ์„ ์ค‘์ง€ํ•  ๋•Œ ๊นŒ์ง€ ๋…น์Œ
  • ๋…น์Œ ์ผ์‹œ ์ค‘์ง€ ๋ฐ ๋‹ค์‹œ ์‹œ์ž‘
  • Access recording-level metering data

iOS ๋˜๋Š” tvOS์—์„œ ์˜ค๋””์˜ค๋ฅผ ๋…น์Œํ•˜๋ ค๋ฉด ์˜ค๋””์˜ค ์„ธ์…˜์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ record ๋˜๋Š” playAndRecord๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

AVAudioPlayer

class AVAudioPlayer: NSObject

์˜ค๋””์˜ค ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํŒŒ์ผ ๋˜๋Š” ๋ฒ„ํผ์—์„œ ๋ชจ๋“  ๊ธธ์ด์˜ ์˜ค๋””์˜ค ์žฌ์ƒ
  • ์žฌ์ƒ๋˜๋Š” ์˜ค๋””์˜ค์˜ ๋ณผ๋ฅจ, ํŒจ๋‹, ์†๋„ ๋ฐ ๋ฐ˜๋ณต ๋™์ž‘ ์ œ์–ด
  • Access recording-level metering data
  • ์—ฌ๋Ÿฌ ํ”Œ๋ ˆ์ด์–ด์˜ ์žฌ์ƒ์„ ๋™๊ธฐํ™”ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์‚ฌ์šด๋“œ๋ฅผ ๋™์‹œ์— ์žฌ์ƒ

iOS ๋˜๋Š” tvOS์—์„œ ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๋ ค๋ฉด Configuring the Audio Playback of iOS and tvOS Apps๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

→ ์š”์•ฝํ•˜์ž๋ฉด

  • ๋Œ€๋ถ€๋ถ„์˜ ๋ฏธ๋””์–ด ์žฌ์ƒ ์•ฑ์—๋Š” playback ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • ๊ทธ ๋ฐ–์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜ค๋””์˜ค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
    • Xcode์—์„œ ํ”„๋กœ์ ํŠธ.xcodeproj ์„ ํƒ
    • Signing & Capabilities ํƒญ์—์„œ Capability ์ถ”๊ฐ€ ์„ ํƒ
    • Background Mode ์ถ”๊ฐ€
    • Audio, AirPlay, and Picture in Picture ์ฒดํฌ

์‚ฌ์šฉ์ž์—๊ฒŒ ๋…น์Œ ๊ถŒํ•œ ์š”์ฒญํ•˜๊ธฐ

์ค‘์š”ํ•œ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ณด์•˜์œผ๋‹ˆ, ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. AVAudioSession์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์— ๋‚˜์™€์žˆ๋“ฏ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…น์Œ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋…น์Œ ๊ธฐ๋Šฅ์€ ๊ฐœ์ธ์ •๋ณด์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋…น์Œ์„ ํ•˜๋ ค๋ฉด ๋จผ์ € ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งˆ์ดํฌ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.

Info.plist์— ์œ„์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์™œ ๋งˆ์ดํฌ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์ง€ ์„ค๋ช…์„ ํ•ด์•ผ ํ•œ๋‹ค.

์ด์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ ์š”์ฒญํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. ๊ถŒํ•œ์„ ์š”์ฒญํ•  ๋•Œ ์„ธ ๊ฐ€์ง€ ์ƒํ™ฉ์ด ์žˆ๋‹ค.

  1. ํ•œ ๋ฒˆ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…น์Œ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
  2. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…น์Œ ๊ถŒํ•œ์„ ๊ฑฐ๋ถ€๋‹นํ•œ ๊ฒฝ์šฐ
  3. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…น์Œ ๊ถŒํ•œ์„ ํ—ˆ์šฉ๋ฐ›์€ ๊ฒฝ์šฐ

๊ถŒํ•œ ์š”์ฒญ์€ ๋น„๋™๊ธฐ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— completionHandler๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

requestMicrophoneAccess()๋Š” viewWillAppear(_:)์—์„œ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. Alert์„ ๋„์šฐ์ง€ ์•Š์„ ๊ฑฐ๋ผ๋ฉด viewDidLoad(_:)์—์„œ ํ˜ธ์ถœํ•ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค.

๊ณ ๋ฏผ์ธ ์ ์€, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…น์Œ ๊ถŒํ•œ์„ ๊ฑฐ๋ถ€๋‹นํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ค์ • ํ™”๋ฉด์—์„œ ๊ถŒํ•œ ํ—ˆ์šฉ์„ ํ•˜๊ฒŒ๋” ์œ ๋„ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์•ฑ์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ–ˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์€๋ฐ, ์ด ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋‹ค๋ฅธ ๋ถ„๊ป˜ ์—ฌ์ญค๋ดค๋‹ค. ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์ค‘์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์˜ฌ ๋•Œ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜์…จ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  Observable๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€์ฐฐํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋น„์Šทํ•œ ์ƒ๊ฐ์„ ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์—ˆ๋˜ ๋ชจ์–‘์ธ์ง€, RxPermission ์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์—ˆ๋‹ค. (ํ˜„์žฌ๋Š” deprecated)

์•„์ง๊นŒ์ง€ ์ด ๋ถ€๋ถ„์€ ์šฐ์„ ์ˆœ์œ„์— ๋ฐ€๋ ค์„œ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ตณ์ด Rx๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ NotificationCenter๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™๋‹ค.

์˜ค๋””์˜ค ๋…น์Œ, ์ €์žฅํ•˜๊ธฐ

์•„๋ฌดํŠผ ์•ž์„  ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ํ—ˆ๊ฐ€๋ฐ›์•˜๋‹ค๋ฉด ๋…น์Œ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋…น์Œ์„ ํ•˜๋ ค๋ฉด AVAudioRecorder๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. AVAudioSession์ฒ˜๋Ÿผ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๊ฐ€ ์žˆ์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ [String: Any]์— ์„ค์ • ๊ฐ’์„ ๋‹ด์•„์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

AVAudioRecorder๋ฅผ ์ดˆ๊ธฐํ™”๊นŒ์ง€ ํ•˜๊ณ  ๋‚˜๋ฉด ๋์ด๋‹ค. ์ด์ œ ๋…น์Œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฒ„ํŠผ๊ณผ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ–ˆ๊ณ  && ๋…น์Œ ๋ฒ„ํŠผ์„ ํƒญ ํ–ˆ๋‹ค๋ฉด

  • ๋…น์Œ์„ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ๋…น์Œ์„ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๋…น์Œ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋…น์Œ์„ ์ •์ง€ํ•œ๋‹ค.

์˜ค๋””์˜ค ์žฌ์ƒํ•˜๊ธฐ

๋…น์Œ ์ค‘์ผ ๋•Œ๋Š” ์žฌ์ƒ์„ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ(ํŒŒ์ผ์ด ์ €์žฅ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ), ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. delegate๋Š” ์˜ค๋””์˜ค ์žฌ์ƒ์ด ๋๋‚ฌ์„ ๋•Œ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

์ „์ฒด ์ฝ”๋“œ๋Š” jwonyLee/iOSExamples์— ์žˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

๋ฐ˜์‘ํ˜•