๐ง Player๋ฅผ ๋ง๋ค ์ผ์ด ์๊ฒจ AVFoundation์ ์ด์ฉํด Player๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
Step1
๋น์ฐํ ์ฒ์์๋ AVFoundation์ import ํด์ค์ผํฉ๋๋ค.
๐ Player.swift
import AVFoundation
Step2
Player๋ผ๋ Class๋ฅผ ์์ฑํด์ฃผ๊ณ ์์ฑํ ํด๋์ค ๋ด์ AVPlayer ์ธ์คํด์ค๋ฅผ ์ ์ธํด์ค๋๋ค.
๐ Player.swift
import AVFoundation
class Player {
private let player = AVPlayer()
}
Step3
AVPlayer์์ ํ์ํ ๋ฉ์๋๋ค์ ์ฌ์ฉํฉ๋๋ค. ์ ๋ item, ์ฌ์์๊ฐ, ์ด์๊ฐ, ์ฌ์, ์ผ์์ ์ง ์ด๋ ๊ฒ ์ฐ์ ์ฌ์ฉํ์ต๋๋ค.
๐ Player.swift
import AVFoundation
class Player {
private let player = AVPlayer()
var currentItem: AVPlayerItem? {
return player.currentItem
}
func replaceCurrentItem(with item: AVPlayerItem?) {
player.replaceCurrentItem(with: item)
}
var currentTime: Double {
return player.currentItem?.currentTime().seconds ?? 0
}
var durationSeconds: Double {
return player.currentItem?.duration.seconds ?? 0
}
func pause() {
player.pause()
}
func play() {
player.play()
}
func seek(to time:CMTime) {
player.seek(to: time)
}
func periodicTimeObserver(interval: CMTime, queue: DispatchQueue, using: @escaping (CMTime) -> Void) {
player.addPeriodicTimeObserver(forInterval: interval, queue: queue, using: using)
}
}
Step3 +
์ ๋ ์ฑ๊ธํค ํจํด์ ์ ์ฉ์์ผฐ์ต๋๋ค.
ํ์ฌ ์ฌ์์ค์ธ ์ํ๋ฅผ ํ์ธํ ํ์๊ฐ ์์ด์ extension AVPlayer๋ฅผ ์ถ๊ฐํ์ต๋๋ค
๐ Player.swift
class Player {
static let shared = Player()
init() { }
...
var isPlaying: Bool {
return player.isPlaying
}
}
extension AVPlayer {
var isPlaying: Bool {
guard self.currentItem != nil else { return false }
return self.rate != 0
}
}
Step4
๋ทฐ์ ์ ์ฉํฉ์๋ค.
๐ ViewController.swift
import UIKit
class PlayerViewController: UIViewController {
let player = Player.shared
override func viewDidLoad() {
super.viewDidLoad()
self.player.replaceCurrentItem(with: ...) // ํ์ํ ๋ฐฉ์์ผ๋ก AVPlayerItem()์ ๋ถ๋ฌ์์ฃผ์ธ์. ์ ๋ ์ฃผ๋ก url๋ก ์์ํ์ผ์ ๋ถ์ด์์ต๋๋ค.
}
//MARK: ํ์ํ ๋ฒํผ Action์ ์ถ๊ฐํด์ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค!
}
๐ง(์๋ ์ฐธ๊ณ ๋ด์ฉ์ ํตํด ๋ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค!)
Apple Developer Documentation