관찰 상태 / 이벤트
컨트롤러는 SwiftUI 바인딩용 @Published 상태와, 웹 onEvent 에 대응하는 Combine 이벤트 퍼블리셔를 제공합니다.
@Published 관찰 상태
// 재생 상태
isPlaying: Bool currentTime: TimeInterval duration: TimeInterval
isReady: Bool isLive: Bool hasEnded: Bool
isFullscreen: Bool isPipActive: Bool isModalPresented: Bool
playbackRate: Float maxResolution: CGSize isCaptureBlocked: Bool
// 재생목록
currentItem: PlaylistItem? playlist: [PlaylistItem] playIndex: Int
// 자막
availableSubtitles: [SubtitleTrack] activeSubtitleID: String?
currentSubtitleText: String
// 라이선스 / 에러
lastError: PlayerError? licenseError: VPELicenseError?
isLicenseValidated: BoolavPlayer: AVPlayer 로 원시 AVPlayer 에 직접 접근할 수도 있습니다.
Combine 이벤트 구독
events: AnyPublisher<PlayerEvent, Never> 로 이벤트를 구독합니다.
import Combine
var cancellables = Set<AnyCancellable>()
player.events
.sink { event in
switch event.type {
case .ready: print("준비 완료")
case .play: print("재생 시작")
case .ended: print("재생 종료")
case .error: print("오류:", event.data ?? [:])
default: break
}
}
.store(in: &cancellables)이벤트 타입
이벤트 타입은 웹 PlayerEvent 스키마와 동일한 의미를 가집니다.
stateChange · ready · play · pause · ended
fullscreen · fullscreenExit · loadingStart · loadingEnd
bufferingStart · bufferingEnd · seeking · seeked · waiting
volumechange · timeupdate · controlbarActive · controlbarDeactive
next · prev · skipForward · skipBack · playlistChange · erroriOS 전용 이벤트
HLS 매니페스트 내장 자막(EXT-X-MEDIA)이 자동 로드되면 .embeddedSubtitlesAvailable([SubtitleTrack]) 이벤트가 발생합니다. 각 트랙은 kind == .embedded, embeddedOptionID 를 가집니다. 자세한 내용은 자막 페이지를 참고하세요.
player.events
.sink { event in
if case let .embeddedSubtitlesAvailable(tracks) = event {
print("내장 자막", tracks.map(\.label))
}
}
.store(in: &cancellables)