AVKit의 포지션
iOS 예제
import AVKit
let player = AVPlayer(url: "<https://my.example/video.m3u8>")
let playerViewController = AVPlayerViewController()
playerViewController.player = player
present(playerViewController, animated: true)
그 외에도 수많은 기반 기술들을 기반으로 하고 있다.
FullScreen callbacks
@available(iOS 12.0, *)
func playerViewController(_ playerViewController: AVPlayerViewController,
willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator)
func playerViewController(_ playerViewController: AVPlayerViewController,
willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator)
func playerViewController(_ playerViewController: AVPlayerViewController,
willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { (context) in
// Add coordinated animations
}) { context in
if context.isCancelled {
// 여전히 embedding상태
} else {
// 풀스크린 상태
// playerViewController의 레퍼런스를 잡아야 하면 여기서 잡아준다.
}
}
}
스크롤 때문에 원래 위치가 화면에서 벗어나거나, 아예 플레이어 자체가 뷰 계층에서 제거될 수도 있다. → 이때를 대비해 따로 레퍼런스를 잡아야 한다.
func playerViewController(_ playerViewController: AVPlayerViewController,
willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {
// 스크롤로 인해 벗어났다면, playerViewController의 레이아웃을 복구한다.
}
AVPlayerViewController in iPad apps on the Mac
External Metadata
@available(iOS 12.0, *)
extension AVPlayerItem {
open var extenalMetadata: [AVMetadataItem]
}
Improved support for custom controls
뷰컨트롤러 containment
parent.addChild(playerViewController)
parent.view.addSubView(playerViewController.view)
playerViewController.didMove(toParent: parent)
playerViewController.willMove(toParent: nil)
playerViewController.view.removeFromSuperView()
playerViewController.removeFromParent()
컨트롤 제거
playerViewController.showsPlaybackControls = false
화면 채우기 설정
playerViewController.videoGravity = .resizeAspectFill
백그라운드 컬러 설정(필요시)
playerViewController.view.backgroundColor = .clear
외부에 재생되는 것을 막는다.
AVPlayer.allowsExternalPlayback = false
부가 오디오 재생: AVAudioSession
AVAudioSession.silenceSecondaryAudioHintNotification을 감시해라
요구사항
필요 코드: 대부분은 AVPlayerViewController()를 쓰면 자동으로 얻을 수 있다.
import AVKit
let player = AVPlayer(url: "<https://my.example/video.m3u8>")
player.currentItem?.externalMetadata = // [AVMetaData]
let playerViewController = AVPlayerViewController()
playerViewController.player = player
present(playerViewController, animated: true)
베스트 프렉티스
AVPlayerItem은 버퍼링되기 전에 설정하고 AVPlayer에 넘겨라
AVPlayer.status와 AVPlayerItem.status를 Observing하라. → KVO로
useExternalPlaybackWhileExternalScreenIsActive 옵션을 키면, 미러링에 최적화된다.
AudioSession 설정은 .playback