๋ฐ์ํ
AVPlayer
๋ฏธ๋์ด Player์ ์ ์ก ๋์์ ์ ์ดํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด.
- ์ฝ๊ฒ๋งํ๋ฉด .. ์ฌ์ ํ๋ ์ด์ด์ ๋์์ ๊ดํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ฐ์ฒด์ธ๋ฏ
- AVAsset์ ์ ๋ฐ์ ์ธ playback(๋ น์, ๋ นํ, ์ฌ์)์ ์ ์ดํ๋๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ฒด
๊ตฌ์กฐ
- AVPlayer๋ ํ ๋ฒ์ ํ๋๋ง ์ฌ์์ด ๊ฐ๋ฅํ๋ฏ๋ก, ์ฌ๋ฌ ๋ฏธ๋์ด๋ฅผ ์ฌ์ํ๊ณ ์ถ์ผ๋ฉด AVQueuePlayer ํด๋์ค๋ฅผ ์ฌ์ฉ
AVPlayerItem
๋ฏธ๋์ด ํ๋ ์ด์ด์ ๋ํ ์๊ฐ๊ณผ ์ํ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด.
- AVAsset: ์ ์ ์ธ ์ํ๊ด๋ฆฌ (์ด ์ฌ์์๊ฐ, ์์ฑ๋ ์ง)
- AVPlayerItem: ๋์ ์ธ ์ํ๊ด๋ฆฌ (presentation state, ํ์ฌ์๊ฐ, ํ์ฌ๊น์ง ์ฌ์๋ ์๊ฐ ๋ฑ)
๊ตฌ์กฐ
- AVPlayerItem ๋ด๋ถ์ AVPlayerItemTrack ๊ฐ์ฒด๋ฅผ ํตํด track๋ค์ ์กฐ์ ํ์ฌ,
์์ ๋ฐ์ดํฐ์์ video ํธ๋๋ง ํ์ฑํ์ํค๊ณ audio ํธ๋์ ๋นํ์ฑํ ์ํค๋ ์์ ๊ฐ๋ฅ
AVPlayer ์ํ ์ฒ๋ฆฌ๋ฐฉ๋ฒ - ์ต์ ๋น
AVPlayer์ AVPlayerItem์ ์ํ๊ฐ ์ง์์ ์ผ๋ก ๋ณํ๋ฏ๋ก, ์ํ์ ๋ํ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด KVO๋ฅผ ํตํด ๊ตฌ๋ ํ์ฌ ์ฌ์ฉ
// VideoCropViewController.swift
extension AVPlayerItem {
public class let timeJumpedNotification: NSNotification.Name
public class let recommendedTimeOffsetFromLiveDidChangeNotification: NSNotification.Name // the value of recommendedTimeOffsetFromLive has changed
public class let mediaSelectionDidChangeNotification: NSNotification.Name // a media selection group changed its selected option
// notification userInfo key type
public class let timeJumpedOriginatingParticipantKey: String
public enum Status : Int, @unchecked Sendable {
case unknown = 0
case readyToPlay = 1
case failed = 2
}
}
extension NSNotification.Name {
@available(iOS 4.0, *)
public static let AVPlayerItemDidPlayToEndTime: NSNotification.Name
@available(iOS 4.3, *)
public static let AVPlayerItemFailedToPlayToEndTime: NSNotification.Name
@available(iOS 6.0, *)
public static let AVPlayerItemPlaybackStalled: NSNotification.Name
@available(iOS 6.0, *)
public static let AVPlayerItemNewAccessLogEntry: NSNotification.Name
@available(iOS 6.0, *)
public static let AVPlayerItemNewErrorLogEntry: NSNotification.Name
}
๋น๋์ค ์ฌ์ ๋ฐฉ๋ฒ
AVKit
import AVKit
// ๋น๋์ค ํ์ผ์ URL
let videoURL = URL(string: "https://example.com/video.mp4")!
// AVPlayerViewController ์ธ์คํด์ค ์์ฑ
let playerViewController = AVPlayerViewController()
// AVPlayer ์ธ์คํด์ค ์์ฑ
let player = AVPlayer(url: videoURL)
// AVPlayerViewController์ AVPlayer ํ ๋น
playerViewController.player = player
// ๋น๋์ค ์ฌ์
present(playerViewController, animated: true) {
player.play()
}
AVPlayerLayer
import AVFoundation
import AVKit
import UIKit
class ViewController: UIViewController {
var player: AVPlayer?
var playerLayer: AVPlayerLayer?
override func viewDidLoad() {
super.viewDidLoad()
// ๋น๋์ค ํ์ผ์ URL
guard let videoURL = URL(string: "https://example.com/video.mp4") else {
return
}
// AVPlayer ์ธ์คํด์ค ์์ฑ
player = AVPlayer(url: videoURL)
// AVPlayerLayer ์ธ์คํด์ค ์์ฑ
playerLayer = AVPlayerLayer(player: player)
playerLayer?.frame = view.bounds
// AVPlayerLayer๋ฅผ ๋ทฐ์ layer์ ์ถ๊ฐ
if let playerLayer = playerLayer {
view.layer.addSublayer(playerLayer)
}
// ๋น๋์ค ์ฌ์
player?.play()
}
}
- ๋ณดํต ๋์์ธ ์ปค์คํฐ๋ง์ด์ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ AVKit๋ณด๋ค๋ AVPlayerLayer๋ฅผ ์ฌ์ฉํ๋ค.
- AVFoundation์์๋ Core Media ํ๋ ์์ํฌ์ CMTime ํ์
์ ์ฌ์ฉํ๋ค.
- ๋ถ๋์์์ ์ ๋ถ์ ํ์ฑ์ผ๋ก ์ธํด ๋ํ ์ผํ ์๊ฐ์ ์์ ์ด ํ์ํ ๋ฏธ๋์ด ์ฌ์์์์ ๋ฌธ์ ์ ์ ๋ง๊ธฐ์ํด ์ฌ์ฉํ๋ค.
Ref
๋ฐ์ํ
'๐ iOS > UIkit' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
AVFoundation (0) | 2023.06.29 |
---|---|
SwiftLint ์ค์นํ๊ณ ์ ์ฉํ๊ธฐ (0) | 2023.04.24 |
[UIkit] Alert (0) | 2023.03.27 |
UIView์ Drawing Cycle (0) | 2023.03.24 |
App Lifecycle (0) | 2023.03.23 |