주희하세요!

[AVKit] AVPlayer

2019-04-28
Juhee Kim

플레이어의 전송 동작을 제어하기 위한 인터페이스를 제공하는 객체입니다.

Declaration

class AVPlayer: NSObject

Overview

AVPlayer는 미디어 자산의 재생 및 타이밍을 관리하는데 사용되는 컨트롤러 객체입니다. AVPlayer를 사용하여 QuickTime 동영상 및 MP3 오디오와 같은 로컬 및 원격 파일 기반 미디어 뿐만 아니라 HTTP 라이브 스트리밍을 사용하여 시청각 미디어를 재생할 수 있습니다.

AVPlayer는 한 번에 하나의 미디어 자산을 재생합니다. replaceCurrentItem(with:) 메소드를 사용하여 플레이어 인스턴스를 재사용하여 추가 미디어 자산을 재생할 수 있지만 한 번에 하나의 미디어 자산만 재생할 수 있습니다. 또한 프레임워크는 AVPlayer의 하위 클래스인 AVQueuePlayer를 제공합니다. 이를 사용하여 순차적으로 재생되는 미디어 자산의 대기열을 만들고 관리할 수 있습니다.

AVPlayer를 사용하여 AVFoundation이 AVAsset 클래스를 사용하여 모델링한 미디어 자산을 재생할 수 있습니다. AVAsset은 재생 시간이나 생성 날짜와 같은 미디어의 정적인 부분만을 모델링하며 AVPlayer로 재생할 때에는 적합하지 않습니다. 자산을 재생하려면 AVPlayerItem에 있는 동적 요소의 인스턴스를 만들어야 합니다. 이 객체는 AVPlayer의 인스턴스에서 재생되는 자산의 타이밍 및 표현 상태를 모델링합니다. 자세한 내용은 AVPlayerItem을 참조하세요.

AVPlayer는 상태가 계속해서 변경되는 동적 객체입니다. 플레이어의 상태를 관찰하는 데에는 두 가지 방법이 있습니다.

  • 일반적인 상태 관측 : KVO (Key-value observer)를 사용하여 currentItem 또는 재생 속도와 같은 많은 플레이어의 동적 속성에 대한 상태 변화를 관찰 할 수 있습니다. 메인 스레드에서 KVO 변경 알림을 등록하고 등록 취소해야합니다. 이렇게 하면 다른 스레드에서의 변경에 의해 만들어진 부분 알림을 수신할 가능성을막습니다. AVFoundation은 다른 스레드에서 변경 작업을 수행할 때도 주 스레드에서 observeValue(forKeyPath:of:change:context:)를 호출합니다.
  • 시간 상태 관측 : KVO는 일반적인 상태 관찰에 적합하지만 플레이어 시간과 같은 지속적으로 변화하는 상태를 관찰하기에는 적합하지 않습니다. AVPlayer는 시간 변화를 관찰하기 위한 두 가지 메소드를 제공합니다.
    • addPeriodicTimeObserver(forInterval:queue:using:)
    • addBoundaryTimeObserver(forTimes:queue:using:)
  • 이러한 메소드들을 사용하면 주기적으로 또는 경계별로 시간 변경을 관찰할 수 있습니다. 변경이 발생했을 때, 이러한 메서드에 제공한 콜백 블록이나 클로저를 호출하여 플레이어의 사용자 인터페이스 상태를 업데이트하는 등의 작업을 수행 할 수있는 기회를 제공 할 수 있습니다.

AVPlayer와 AVPlayerItem은 보여지지 않는 객체이므로 비디오 자산을 화면상에 표시할 수 없습니다. 비디오 컨텐츠를 화면에 표시하혀면 다음 두 가지 접근방법을 사용할 수 있습니다.

  • AVKit : 비디오 컨텐츠를 표시하는 가장 좋은 방법은 AVKit 프레임워크의 다음 클래스를 사용하는 것입니다. iOS와 tvOS에서는 AVPlayerViewController, macOS에서는 AVPlayerView입니다. 이러한 클래스들은 비디오 컨텐츠를 표시하며, 재생 컨트롤러 및 기타 미디어 기능과 함께 완벽한 재생 기능을 제공합니다.
  • AVPlayerLayer : 플레이어 용 사용자 인터페이스를 만들 때 AVPlayerLayer를 사용하세요. 플레이어 레이어를 뷰의 배경 레이어로 설정하거나 레이어 계층에 직접 추가할 수 있습니다. AVPlayer 및 AVPlayerViewController와는 달리 플레이어 레이어는 재생 컨트롤을 제공하지 않고 화면 상에 시각적인 내용만을 제공합니다. 미디어를 재생, 일시 중지 및 탐색할 수 있도록 재생 전송 컨트롤을 구성하는 것이 필요합니다.

외부 재생 모드

외부 재생 모드는 비디오 데이터가 AirPlay를 통해 Apple TV와 같은 외부 장치로 전송되거나 오리지널리티를 위해 전체 화면 재생을 위한 미니 커넥터 기반 HDMI/VGA 어댑터로 전송되었을 경우를 말합니다.

“외부 스크린” 모드(미러링 및 두번째 디스플레이 모드로도 알려진)에서 호스트 장치는 비디오 데이터를 렌더링합니다. 호스트 장치는 렌더링 된 비디오를 재압축하여 외부 장치로 전송하고, 외부 장치는 비디오를 압축 해제하고 표시합니다.

외부 재생 속성은 AirPlay 비디오 재생에 영향을 주며 사용되지 않는 AirPlay 지원 속성 대신 사용됩니다.

Topics

Player 만들기

// 지정된 URL을 참조하는 단일 오디오-비주얼 자원을 재생하는 새로운 플레이어를 생성합니다.
init(url: URL)

// 지정된 플레이어 항목을 재생할 새 플레이어를 만듭니다.
init(playerItem: AVPlayerItem?)

재생 관리하기

// 현재 아이템의 재생을 시작합니다.
func play()

// 현재 아이템의 재생을 일시정지합니다.
func pause()

// 현재 재생 속도입니다.
var rate: Float

// 현재 플레이어 아이템의 재생이 끝났을 때 수행할 액션입니다.
var actionAtItemEnd: AVPlayer.ActionAtItemEnd

// 재생이 종료되었을 때 플레이어가 수행할 동작입니다.
enum AVPlayer.ActionAtItemEnd

// 현재 플레이어 아이템을 새로운 플레이어 아이템으로 교체합니다.
func replaceCurrentItem(with: AVPlayerItem?)

// 비디오 재생이 디스플레이와 기기 잠자기 모드를 예방해야하는지를 가리키는 Bool 값입니다.
var preventsDisplaySleepDuringVideoPlayback: Bool

자동 대기 행위 관리

// 재생이 끊기는 것을 최소화하기 위해 플레이어가 자동적으로 재생을 지연해야하는지 여부를 나타내는 Bool 값
var automaticallyWaitsToMinimizeStalling: Bool

// 플레이어가 현재 재생을 시작이나 재시작할 때까지 기다리는 이유
var reasonForWaitingToPlay: AVPlayer.WaitingReason?

// 플레이어가 재생을 시작이나 재시작할 때까지 기다리는 이유의 구조체
struct AVPlayer.WaitingReason
The reasons the player is waiting begin or resume playback.

// 적절한 네트워크 상태를 기다리는 동안 재생이 현재 진행 중인지, 무기한으로 일시 중지되었는지 혹은 정지되었는지를 나타내는 상태입니다.
var timeControlStatus: AVPlayer.TimeControlStatus

// 플레이어가 재생 속도 변경을 나타내는 상태입니다.
// .pause .waitingToPlayAtSpecifiedRate, .playing
enum AVPlayer.TimeControlStatus

// 주어진 속도로 가능한 미디어 데이터를 즉시 재생합니다.
func playImmediately(atRate: Float)

시간 관리

// 현재 플레이어 항목의 현재 시간을 반환한다.
func currentTime() -> CMTime

// 현재 재생 시간을 주어진 시간으로 설정합니다.
func seek(to: CMTime)

// 현재 재생 시간을 날짜 객체로 지정된 시간으로 설정합니다.
func seek(to: Date)

// 현재 재생 시간을 지정된 시간으로 설정하고 탐색 작업이 완료되거나 중단될 때까지 지정된 블록을 실행합니다.
func seek(to: CMTime, completionHandler: (Bool) -> Void)

// 현재 재생 시간을 지정된 날짜로 설정하고 탐색 작업이 완료되거나 중단될 때까지 지정된 블록을 실행합니다.
func seek(to: Date, completionHandler: (Bool) -> Void)

// 지정된 시간 범위 내에서 현재 재생 시간을 설정합니다.
func seek(to: CMTime, toleranceBefore: CMTime, toleranceAfter: CMTime)

// 지정된 시간 범위 내에서 현재 재생 시간을 설정하고 탐색 작업이 완료되거나 중단 될 때 지정된 블록을 호출합니다.
func seek(to: CMTime, toleranceBefore: CMTime, toleranceAfter: CMTime, completionHandler: (Bool) -> Void)

시간 관찰

// 변경 시간을 보고하기 위해 재생 중 주어진 블록의 주기적인 호출을 요청합니다.
func addPeriodicTimeObserver(forInterval: CMTime, queue: DispatchQueue?, using: (CMTime) -> Void) -> Any

// 정상 재생 중에 지정된 시간이 지나가면 블로 호출을 요청합니다.
func addBoundaryTimeObserver(forTimes: [NSValue], queue: DispatchQueue?, using: () -> Void) -> Any

// 이전에 등록된 시간 주기 혹은 시간 경계 관찰자를 취소합니다.
func removeTimeObserver(Any)
Cancels a previously registered periodic or boundary time observer.

미디어 선택 기준 설정 구성

// 리시버가 현재 선택 기준을 플레이어 항목에 자동으로 적용해야하는지 여부를 나타내는 Bool 값
var appliesMediaSelectionCriteriaAutomatically: Bool

// 지정된 미디어특성을 가진 미디어 항목에 대한 자동 선택 조건을 반환합니다.
func mediaSelectionCriteria(forMediaCharacteristic: AVMediaCharacteristic) -> AVPlayerMediaSelectionCriteria?

// 지정된 미디어 특성을 갖는 미디어에 대한 자동 선택 기준을 적용합니다.
func setMediaSelectionCriteria(AVPlayerMediaSelectionCriteria?, forMediaCharacteristic: AVMediaCharacteristic)

외부 재생 관리

// 플레이어가 외부 재생 모드로 전환할 수 있는지 여부를 나타내는 Bool 값입니다.
var allowsExternalPlayback: Bool

// 플레이어가 현재 외부 재생 모드에서 비디오를 재생 중인지 여부를 나타내는 Bool 값입니다.
var isExternalPlaybackActive: Bool

// 외부 화면 모드가 활성화되어 있는 동안 플레이어가 외부 재생 모드로 자동 전환해야하는지 여부를 나타내는 Bool 값입니다.
var usesExternalPlaybackWhileExternalScreenIsActive: Bool

// 외부 재생 모드에서만 적용되는 플레이어의 비디오 gravity.
var externalPlaybackVideoGravity: AVLayerVideoGravity

// 비디오가 레이어의 경계 사각형 내에 비디오가 표시되는 방법을 정의하는 값
struct AVLayerVideoGravity

외부 소스와 재생 동기화하기

이 섹션의 고급 동기화 및 속도 제어 방법은 현재 파일 기반 미디어에서만 지원되며 HTTP 라이브 스트리밍을 사용하여 제공되는 미디어에서 지원되지 않습니다.

// 외부 소스와 현재 재생 아이템의 재생속도와 시간을 동기화합니다.
func setRate(Float, time: CMTime, atHostTime: CMTime)

// 재생을 위해 미디어 파이프 라인을 준비하기 위해 미디어 데이터를 불러오기 시작합니다.
func preroll(atRate: Float, completionHandler: ((Bool) -> Void)?)

// 보류중인 모든 사전 요청을 취소하고 해당 completionHandler를 호출합니다.
func cancelPendingPrerolls()

// 항목 시간 기준에 사용되는 마스터 시계입니다.
var masterClock: CMClock?
The master clock used for item time bases.

오디오 출력 관리

// 플레이어의 오디오 출력이 음소거되었는지의 여부를 나타내는 Bool값
var isMuted: Bool

// 플레이어의 오디오 재생 볼륨
var volume: Float

// 오디오를 재생하는 데 사용되는 Core 오디오 출력 장치의 고유 ID를 지정합니다.
var audioOutputDeviceUniqueID: String?

Player 설정 가져오기

// 플레이어를 재생에 사용할 수 있는지 여부를 나타내는 상태
var status: AVPlayer.Status

// 플레이어가 항목을 성공적으로 재생할 수 있는지 여부를 나타내는 상태입니다.
enum AVPlayer.Status

// 실패의 원인이 된 오류
var error: Error?

// 플레이어의 현재 재생 항목입니다.
var currentItem: AVPlayerItem?

// 외부 보호가 충분하지 않아서 출력이 흐리게 표시되는지 여부를 나타내는 Bool 값입니다.
var isOutputObscuredDueToInsufficientExternalProtection: Bool

HDR 재생 설정

// 재생 가능한 HDR 모드들
class var availableHDRModes: AVPlayer.HDRMode

// HDR 모드를 지정하는 비트 필드 유형
struct AVPlayer.HDRMode

GPU 설정

// 비디오 디코딩에 사용할 GPU 레지스트리 식별자  
var preferredVideoDecoderGPURegistryID: UInt64

원문


Similar Posts

Comments