본문 바로가기

iOS

[iOS] AVFoundation, AVPlayer, AVPlayerLayer

AVFoundation

Work with audiovisual assets, control device cameras, process audio, and configure system audio interactions.

시청각 에셋 관련 작업을 하고, 디바이스 카메라를 제어하고, 오디오를 처리하고, 시스템 오디오 상호작용을 구성한다.

 

AVKit이 동영상 플레이 위주라면, AVFoundation은 동영상, 오디오 등 여러 미디어 관련 작업을 위한 프레임워크인 듯 하다.

AVFoundation은 iOS, tvOS, macOS를 위한 애플의 미디어 프레임워크이다. 이를 사용하여 미디어 재생, 캡쳐, 편집, low-level의 처리를 수행할 수 있다. 또한 효율적으로 미디어 에셋을 로드하고 HTTP 라이브 스트리밍을 통해 원격으로 제공되는 QuickTime 비디오, MP3 오디오 파일, 시청각 자료의 재생을 제어할 수 있다. 

AVFoundation의 기능은 기본적인 미디어 재생 그 이상이다. 하지만 이 프레임워크는 UIKit 아래에 있기 때문에 재생 제어를 위한 표준 UI를 제공하지 않는다. 커스텀 player 인터페이스를 구축할 수 있지만 상당한 작업량이 필요하다. 커스텀을 할 필요가 없으면 AVKit 프레임워크에 의존하는 것이 나을 수 있다. 

 


 

AVFoundation > AVPlayer

AVPlayer

An object that provides the interface to control the player’s transport behavior.

class AVPlayer : NSObject

미디어를 재생할 수 있는 클래스

AVPlayer만 사용하면 화면에 아무것도 나타나지 않는다.

AVPlayerLayer를 추가하고, 이 레이어에 AVPlayer를 추가해줘야 화면에서 영상이 재생된다.

또한 영상이 재생되는 것 외에 재생 버튼, 슬라이더 등은 나타나지 않기 때문에 직접 구현해서 추가해주어야 함!

AVPlayerLayer와 같은 크기의 UIView를 만들어서, 재생 버튼, 슬라이더 등을 추가해주어 영상 제어 전용 뷰를 사용하는 것이 좋다.

(이런 버튼들이 화면에 나타나 있는 채로 영상이 재생되는 건 적절하지 않기 때문에, 한번에 hidden 처리를 해 주기에도 좋음)

 

+

AVPlayer는 한 번에 하나의 미디어 데이터만 재생할 수 있다.

여러 미디어 데이터를 순서대로 재생하고자 하면 AVFoundation의 AVQueuePlayer를 사용하면 됩니다~ 

 

AVPlayer는 연속적으로 변화하는 상태를 가진 dynamic object이다.

player의 상태를 관찰하기(observe)하기 위한 접근 방법들이 있다.

 

1. General State Observations

currentItem, 재생 rate와 같은 플레이어의 dynamic한 프로퍼티의 상태 변화를 관찰하기 위해 Key-Value Observing을 사용할 수 있다. 

AVFoundation은 observeValue(forKeyPath:of:change:context) 함수를 메인 스레드에서 호출한다. (다른 스레드에서 작업을 변경시킬 때도!)

 

observeValue(forKeyPath:of:change:context:) 

Informs the observing object when the value at the specified key path relative to the observed object has changed.

func observeValue(forKeyPath keyPath: String?, 
               of object: Any?, 
           change: [NSKeyValueChangeKey : Any]?, 
          context: UnsafeMutableRawPointer?)

플레이어의 상태가 바뀔 때마다 호출된다. 

 

 

2. Time State Observations

KVO는 일반적인 상태 관찰에 유용하지만, 연속적으로 변화하는 상태(플레이어의 시간)를 관찰하기에는 적절하지 않다. 그래서 AVPlayer는 시간의 변화를 관찰하기 위해 두 가지 메소드를 제공한다. 

 

addPeriodicTimeObserver(forInterval:queue:using)

Requests the periodic invocation of a given block during playback to report changing time.

func addPeriodicTimeObserver(forInterval interval: CMTime, 
                       queue: DispatchQueue?, 
                       using block: @escaping (CMTime) -> Void) -> Any

현재 재생 시간을 나타낼 때(1초마다 바뀌기 때문에) 사용하면 적절함.

interval

The time interval at which the block should be invoked during normal playback, according to progress of the player’s current time.

queue

A serial dispatch queue onto which block should be enqueued. Passing a concurrent queue is not supported and will result in undefined behavior.

If you pass NULL, the main queue is used.

block

The block to be invoked periodically.

The block takes a single parameter:

time

The time at which the block is invoked.

 

addBoundaryTimeObserver(forTimes:queue:using)

이건 나중에 .. 

 


 

AVFoundation > AVPlayerLayer

AVPlayerLayer

An object that manages a player's visual output.

class AVPlayerLayer : CALayer

AVPlayer는 스스로 화면에 영상을 나타내지 못하기 때문에, AVPlayerLayer를 추가해, 이 레이어에 AVPlayer를 추가해줘야 한다.

AVPlayerLAyer는 오직 화면 출력 기능만 제공하기 때문에, 다른 기능들은 직접 구현해야 함!

 

 

 

 

 

 

 

addPeriodicTimeObserver(forInterval:queue:using:) - AVPlayer | Apple Developer Documentation

Instance Method addPeriodicTimeObserver(forInterval:queue:using:) Requests the periodic invocation of a given block during playback to report changing time. DeclarationParametersintervalThe time interval at which the block should be invoked during normal p

developer.apple.com

 

observeValue(forKeyPath:of:change:context:) - NSObject | Apple Developer Documentation

Instance Method observeValue(forKeyPath:of:change:context:) Informs the observing object when the value at the specified key path relative to the observed object has changed. DeclarationParameterskeyPathThe key path, relative to object, to the value that h

developer.apple.com

 

AVFoundation | Apple Developer Documentation

The AVFoundation framework combines four major technology areas that together encompass a wide range of tasks for capturing, processing, synthesizing, controlling, importing and exporting audiovisual media on Apple platforms.

developer.apple.com

 

 

[iOS] AVFoundation & Media Playback Programming Guide

[iOS] AVFoundation & Media Playback Programming Guide AVFoundation Programming Guide 와 Media Playback Programming Guide 보면서 공부한 내용을 제가 이해한 것을 바탕으로 정리한 내용입니다. 올바르지 않..

baked-corn.tistory.com

 

'iOS' 카테고리의 다른 글

[iOS] NotificationCenter  (0) 2020.06.14
[iOS] CMTime  (0) 2020.06.13
[iOS] AVKit, AVPlayerViewController  (0) 2020.06.13
[iOS] Gesture Recognizer  (0) 2020.06.13
[iOS] 세그 (Segue)  (0) 2020.06.12