# การใช้งาน ByteArk Player SDK for iOS
ByteArk Player SDK for iOS ถูกออกแบบมาให้ใช้งานได้ง่ายและยืดหยุ่น เริ่มต้นด้วยการตั้งค่าผู้เล่นผ่าน class ByteArkPlayerViewController
ซึ่งเป็น subclass ของ UIViewController
โดย class นี้มี player instance property ซึ่งมี API สำหรับควบคุม player และฟังก์ชัน callback เพื่อรับ event ในการเล่นวิดีโอ
การใช้งาน ByteArkPlayerViewController ทำได้ 2 วิธี:
- การใช้งานพื้นฐาน: Subclass ByteArkPlayerViewController และแสดงผลบนหน้าจอโดยตรง
- การใช้งานขั้นสูง: Embed ByteArkPlayerViewController ลงใน container view ที่อยู่ใน view controller อื่น เพื่อแสดงผล video player
# การใช้งานพื้นฐาน
ตัวอย่างโค้ดด้านล่างแสดงวิธีการใช้ ByteArk Player SDK for iOS โดยการสร้าง Subclass จาก ByteArkPlayerViewController
import UIKit
import ByteArkPlayerSDK
// Step 1: Subclass `ByteArkPlayerViewController` to access the `ByteArkPlayer` instance
class PlayerViewController: ByteArkPlayerViewController {
override func viewDidLoad() {
super.viewDidLoad()
do {
// Step 2: Set up the media item using `ByteArkPlayerItemBuilder`
let item = try ByteArkPlayerItemBuilder()
.media(URL(string: "https://byteark-playertzxedwv.stream-playlist.byteark.com/streams/TZyZheqEJUwC/playlist.m3u8")!)
.title("Big Buck Bunny")
.build()
// Step 3: Configure the player using `ByteArkPlayerConfigBuilder`
let config = try ByteArkPlayerConfigBuilder()
.item(item)
.autoplay(true)
.build()
player.configure(with: config)
} catch {
print(error.localizedDescription)
}
}
// Step 4: Override player callback functions in `ByteArkPlayerViewController` to receive playback events
override func playbackReady(player: ByteArkPlayer, item: ByteArkPlayerItem) {
super.playbackReady(player: player, item: item)
// playback ready event
}
override func playbackPlay(player: ByteArkPlayer) {
super.playbackPlay(player: player)
// playback play event
}
override func playbackPause(player: ByteArkPlayer) {
super.playbackPause(player: player)
// playback pause event
}
override func playbackEnded(player: ByteArkPlayer) {
super.playbackEnded(player: player)
// playback ended event
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# การใช้งานขั้นสูง
ตัวอย่างโค้ดด้านล่างแสดงวิธีการใช้ ByteArk Player SDK for iOS โดยการ Embed ByteArkPlayerViewController
ลงใน container view ที่อยู่ใน view controller อื่น เพื่อแสดงผล video player วิธีนี้ช่วยให้คุณสามารถควบคุมการจัดวางและการรวมกับส่วนประกอบ UI อื่นๆ ได้มากขึ้น
class CustomViewController: UIViewController, ByteArkPlayerPlaybackDelegate {
// Step 1: IBOutlet for the container view set up in the Storyboard
@IBOutlet weak var containerView: UIView!
var playerViewController: ByteArkPlayerViewController?
override func viewDidLoad() {
super.viewDidLoad()
// Step 2: Instantiate and add ByteArkPlayerViewController as a child
let playerViewController = ByteArkPlayerViewController()
addChild(playerViewController)
containerView.addSubview(playerViewController.view)
playerViewController.didMove(toParent: self)
playerViewController.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
playerViewController.view.leftAnchor.constraint(equalTo: containerView.leftAnchor),
playerViewController.view.rightAnchor.constraint(equalTo: containerView.rightAnchor),
playerViewController.view.topAnchor.constraint(equalTo: containerView.topAnchor),
playerViewController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
])
self.playerViewController = playerViewController
// Step 3: Access the ByteArkPlayer instance
let player = playerViewController.player
// Step 4: Set up media item and configure the player
do {
let item = try ByteArkPlayerItemBuilder()
.media(URL(string: "https://byteark-playertzxedwv.stream-playlist.byteark.com/streams/TZyZheqEJUwC/playlist.m3u8")!)
.title("Big Buck Bunny")
.build()
let config = try ByteArkPlayerConfigBuilder()
.item(item)
.autoplay(true)
.build()
// Step 5: Assign delegate to receive playback events from the player
player.delegate = self
player.configure(with: config)
} catch {
print(error.localizedDescription)
}
}
// MARK: - ByteArkPlayerPlaybackDelegate Methods
func playbackReady(player: ByteArkPlayer, item: ByteArkPlayerItem) {
// playback ready event
}
func playbackPlay(player: ByteArkPlayer) {
// playback play event
}
func playbackPause(player: ByteArkPlayer) {
// playback pause event
}
func playbackEnded(player: ByteArkPlayer) {
// playback ended event
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# การใช้งาน Player APIs
SDK มี methods และ variables ที่สามารถเข้าถึงได้จาก instance ของ ByteArkPlayer เพื่อควบคุมพฤติกรรมการเล่นหรือรับข้อมูลจากการเล่นวิดีโอ
# Methods
ชื่อ Method | คำอธิบาย |
---|---|
func configure(with config: ByteArkPlayerConfig) | ตั้งค่าคอนฟิกของตัวเล่น |
func destroy() | ล้างข้อมูลและปล่อยทรัพยากรที่เกี่ยวข้องกับตัวเล่น |
func play() | เล่นเนื้อหา |
func pause() | หยุดเล่นเนื้อหา |
func seek(to time: TimeInterval, completionHandler: @escaping (Bool) -> Void) | ข้ามไปยังเวลาที่กำหนด (หน่วยเป็นวินาที) |
func muted(_ muted: Bool) | ปิดเสียงหรือเปิดเสียงของเนื้อหา |
func toggleFullscreen() | สลับโหมดเต็มหน้าจอ |
func togglePictureInPictureMode() | สลับโหมด Picture-in-Picture |
func enablePictureInPicture() | เปิดใช้งานโหมด Picture-in-Picture |
func disablePictureInPicture() | ปิดใช้งานโหมด Picture-in-Picture |
func enableRemoteControlCenter() | เปิดใช้งานการควบคุมระยะไกลใน iOS Control Center |
func disableRemoteControlCenter() | ปิดใช้งานการควบคุมระยะไกลใน iOS Control Center |
func enableBackgroundAudio() | เปิดใช้งานการเล่นเสียงเมื่อแอปทำงานในพื้นหลัง |
func disableBackgroundAudio() | ปิดใช้งานการเล่นเสียงเมื่อแอปทำงานในพื้นหลัง |
func getPlugin(with name: String) -> ByteArkPlayerPlugin? | ดึงอินสแตนซ์ของ ByteArkPlayerPlugin |
func showControls() | แสดงการควบคุมของตัวเล่น |
func hideControls() | ซ่อนการควบคุมของตัวเล่น |
func setPlaybackSpeed(_ speed: Float) | ตั้งค่าความเร็วในการเล่นเนื้อหา |
func setVolume(_ volume: Float) | ตั้งค่าระดับเสียงของตัวเล่น |
func setAudioTrack(_ audioTrack: ByteArkPlayerMediaTrack) | ตั้งค่าแทร็กเสียงที่เลือก |
func setSubtitleTrack(_ subtitleTrack: ByteArkPlayerMediaTrack?) | ตั้งค่าแทร็กคำบรรยายที่เลือก |
func setResolution(_ resolution: ByteArkPlayerMediaResolution) | ตั้งค่าความละเอียดของเนื้อหาที่เลือก |
func next() | ข้ามเนื้อหาปัจจุบันและเล่นเนื้อหาถัดไปในเพลย์ลิสต์ |
func previous() | หยุดเนื้อหาปัจจุบันและเล่นเนื้อหาก่อนหน้าในเพลย์ลิสต์ |
func setPlaylistItem(_ playbackItem: ByteArkPlayerItem) throws | ตั้งค่าไอเท็มในเพลย์ลิสต์ |
func addPlaybackEngineObserve(...) -> any NSObjectProtocol | เพิ่มการสังเกตใน Notification Center เพื่อรับการแจ้งเตือนที่ส่งไปยังบล็อกที่กำหนด |
# Variables
ชื่อ | คำอธิบาย |
---|---|
var playerContainerView: ByteArkPlayerContainerView { get } | View ที่บรรจุองค์ประกอบ เช่น rendering view และ controls |
var playerViewController: ByteArkPlayerViewController? { get } | อินสแตนซ์ของ ByteArkPlayerViewController |
var fullscreenViewController: ByteArkPlayerFullscreenViewController? { get } | ViewController สำหรับโหมดเต็มหน้าจอ |
var config: ByteArkPlayerConfig? { get } | ดึงออบเจ็กต์การตั้งค่าที่ใช้สร้างอินสแตนซ์ของตัวเล่น |
var delegate: ByteArkPlayerPlaybackDelegate? { get, set } | ดึง/ตั้ง playback delegate |
var playbackItem: ByteArkPlayerItem? { get } | ดึงออบเจ็กต์ ByteArkPlayerItem ปัจจุบัน |
var playlist: ByteArkPlayerPlaylist? { get } | ดึงออบเจ็กต์ ByteArkPlayerPlaylist ปัจจุบัน |
var currentTime: TimeInterval { get } | ดึงเวลาในวินาทีที่เล่นอยู่ในปัจจุบัน |
var duration: TimeInterval { get } | ดึงระยะเวลาของวิดีโอในหน่วยวินาที |
var audioTrack: ByteArkPlayerMediaTrack? { get } | ดึงแทร็กเสียงที่ใช้งานอยู่ในปัจจุบัน |
var audioTracks: [ByteArkPlayerMediaTrack] { get } | ส่งคืนอาร์เรย์ของแทร็กเสียงในไอเท็มที่กำลังเล่นอยู่ |
var subtitleTrack: ByteArkPlayerMediaTrack? { get } | ดึงแทร็กคำบรรยายที่ใช้งานอยู่ในปัจจุบัน |
var subtitleTracks: [ByteArkPlayerMediaTrack] { get } | ส่งคืนอาร์เรย์ของแทร็กคำบรรยายในไอเท็มที่กำลังเล่นอยู่ |
var resolution: ByteArkPlayerMediaResolution? { get } | ดึงความละเอียดที่ใช้งานอยู่ในปัจจุบัน |
var resolutions: [ByteArkPlayerMediaResolution] { get } | ส่งคืนอาร์เรย์ของความละเอียดของไอเท็มที่กำลังเล่นอยู่ |
var playbackSpeed: Float { get } | ดึงค่าความเร็วในการเล่นเนื้อหา ค่าเริ่มต้นคือ 1.0 |
var volume: Float { get } | ดึงระดับเสียงปัจจุบันของตัวเล่น ค่าเริ่มต้นคือ 1.0 |
var controlsView: UIView? { get } | ดึง controls view ของตัวเล่น |
var isReady: Bool { get } | ตรวจสอบว่าตัวเล่นพร้อมเล่นเนื้อหาหรือยัง |
var isPlaying: Bool { get } | ตรวจสอบว่าตัวเล่นอยู่ในสถานะกำลังเล่นหรือไม่ |
var isSeeking: Bool { get } | ตรวจสอบว่าตัวเล่นอยู่ในสถานะการเลื่อนหรือไม่ |
var isEnded: Bool { get } | ตรวจสอบว่าเนื้อหาสิ้นสุดแล้วหรือยัง |
var isBuffering: Bool { get } | ตรวจสอบว่าตัวเล่นอยู่ในสถานะการบัฟเฟอร์หรือไม่ |
var isMuted: Bool { get } | ตรวจสอบว่าตัวเล่นอยู่ในสถานะปิดเสียงหรือไม่ |
var isFullscreen: Bool { get } | ตรวจสอบว่าตัวเล่นอยู่ในโหมดเต็มหน้าจอหรือไม่ |
var isInPictureInPicture: Bool { get } | ตรวจสอบว่าตัวเล่นอยู่ในโหมด Picture-in-Picture หรือไม่ |
# Listen player's playback events
สามารถทำได้โดยการ override playback methods ใน subclass ของ ByteArkPlayerViewController
หรือการกำหนด ByteArkPlayerPlaybackDelegate
ให้กับ player instance
/// A protocol which must be used to monitor playback event from ByteArkPlayer instance
@objc public protocol ByteArkPlayerPlaybackDelegate: AnyObject {
/// Fired when the player has initialized
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerReady(player: ByteArkPlayer)
/// Fired when the player start load media metadata
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerLoadingMetadata(player: ByteArkPlayer)
/// Fired when the player stop load media metadata
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerLoadedMetadata(player: ByteArkPlayer)
/// Fired when the player is ready for play
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - item: A ByteArkPlayerItem object
@objc optional func playbackReady(player: ByteArkPlayer, item: ByteArkPlayerItem)
/// Fired when the player enters the playing state fist time
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackFirstPlay(player: ByteArkPlayer)
/// Fired when the player enters the playing state
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackPlay(player: ByteArkPlayer)
/// Fired when the player enters the paused state
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackPause(player: ByteArkPlayer)
/// Fired when the player enters the seeking state
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackSeeking(player: ByteArkPlayer)
/// Fired when content playback resumes after seeking
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackSeeked(player: ByteArkPlayer)
/// Fired when content playback is ended
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackEnded(player: ByteArkPlayer)
/// Fired when the player enters the stalled state
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackStalled(player: ByteArkPlayer)
/// Fired as the playback position gets updated, while the player is playing content
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - time: A updated TimeInterval
@objc optional func playbackTimeupdate(player: ByteArkPlayer, time: TimeInterval)
/// Fired when the player enters the buffering state
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackBuffering(player: ByteArkPlayer)
/// Fired when content playback resumes after buffering
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackBuffered(player: ByteArkPlayer)
/// Fired when a media error has occurred
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - error: An error object
@objc optional func playbackError(player: ByteArkPlayer, error: NSError)
/// Fired when the player enters fullscreen mode
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerEnterFullscreen(player: ByteArkPlayer)
/// Fired when the player exits fullscreen mode
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerExitFullscreen(player: ByteArkPlayer)
/// Fired when the player enters Picture-in-Picture mode
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerEnterPictureInPictureMode(player: ByteArkPlayer)
/// Fired when the player exits Picture-in-Picture mode
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playerExitPictureInPictureMode(player: ByteArkPlayer)
/// Fired when content playback is muted
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackMuted(player: ByteArkPlayer)
/// Fired when content playback is unmuted
///
/// - Parameters:
/// - player: A ByteArkPlayer object
@objc optional func playbackUnmuted(player: ByteArkPlayer)
/// Fired when playback speed is changed
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - speed: A changed playback speed
@objc optional func playbackSpeedChanged(player: ByteArkPlayer, speed: Float)
/// Fired when volume is changed
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - volume: A changed volume
@objc optional func playbackVolumeChanged(player: ByteArkPlayer, volume: Float)
/// Fired when audio track is changed
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - audioTrack: A ByteArkPlayerMediaTrack object or nil
@objc optional func playbackAudioTrackChanged(player: ByteArkPlayer, audioTrack: ByteArkPlayerMediaTrack?)
/// Fired when subtitle track is changed
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - subtitleTrack: A ByteArkPlayerMediaTrack object or nil
@objc optional func playbackSubtitleTrackChanged(player: ByteArkPlayer, subtitleTrack: ByteArkPlayerMediaTrack?)
/// Fired when resolution is changed
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - resolution: A ByteArkPlayerMediaResolution object or nil
@objc optional func playbackResolutionChanged(player: ByteArkPlayer, resolution: ByteArkPlayerMediaResolution?)
/// Fired when the playlist index changes to a new playlist item
///
/// - Parameters:
/// - player: A ByteArkPlayer object
/// - item: A ByteArkPlayerItem object
@objc optional func playbackPlaylistItemChanged(player: ByteArkPlayer, item: ByteArkPlayerItem)
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# Content Protection
ByteArk Player SDK for iOS รองรับ Apple FairPlay Streaming (FPS) (opens new window) ซึ่งทำให้สามารถเล่นเนื้อหาที่เข้ารหัสได้ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Apple FairPlay DRM สามารถดูข้อมูลเพิ่มเติมได้ที่ เอกสาร Apple FairPlay DRM
# Playback Engine
Playback Engine คือ core ของ ByteArk Player SDK for iOS ซึ่งโดยปกติแล้วจะใช้ AVPlayer ซึ่งเป็น default player บนระบบ iOS ในการเล่นวิดีโอ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Playback Engine สามารถดูข้อมูลเพิ่มเติมได้ที่ เอกสาร Playback Engine.
# Plugins
ByteArk Player SDK for iOS มาพร้อมกับระบบ Plugin ที่ทำให้สามารถปรับแต่ง video player ให้เหมาะกับความต้องการของคุณได้ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Plugins สามารถดูข้อมูลเพิ่มเติมได้ที่ เอกสาร Plugin