https://developer.apple.com/documentation/avfoundation
AVAsset
- 한개이상의 AVAssetTrack 으로 구성된다.
- local / remote 의 media 를 담는다.
- file-based / streamed(HLS = HTTP Live Streaming) media 를 담는다.
- duration : asset 길이, providesPreciseDurationAndTiming 가 false 인 경우 duration
- providesPreciseDurationAndTiming : default false, 단순 asset play 용도라면 false 로 충분, asset 이 조작될 여지가 있다면 true 로 세팅되어야한다.
AVAssetTrack
- 하나의 media type 을 갖는 media track.
- media type - AVMediaType 참고
AVAsset, AVURLAsset init(url URL: URL, options: [String : Any]? = nil)
- AVAsset 은 추상클래스, init 시 실제로는 AVURLAsset 인스턴스가 생성됨
- options
- AVURLAssetAllowsCellularAccessKey셀룰러 네트워크 환경을 제한하고 싶은 경우 false 로 세팅.
- default true.
- AVURLAssetHTTPCookiesKey
- http(s) url 인 경우에만 쿠키가 적용될 수 있으며, HLS 인 경우 다양한 path 와 host 로 대량의 request 를 요구하게 되는데 AVURLAsset 에 명시된 url 인 경우에만 지정된 쿠키가 적용된다.
- AVURLAssetPreferPreciseDurationAndTimingKeyasset 이 조작될 여지가 있는 경우 값을 true 로 설정한다.
- default 값은 false 로 일반적인 asset 의 play 용도로 사용된다.
AVAsset load media data asynchronously
- AVAsset 을 load 하는 것은 asset 의 tracks property 를 비동기적으로 load 하는 것이다.
- asset 에 따라 혹은 네트워크 환경에 따라 loading 시간이 오래 걸릴 수 있어 비동기 방식으로 가져와야한다.
- asset 의 일부 track 을 기준에 따라 load 하면 시간을 단축할 수 있으며,
- 그 기준은 identifier / media type / characteristic 에 따라 track 이 구분된다.
- load properties asynchronously
- DEPRECATED 예정asset.loadValuesAsynchronously(forKeys: "playable") { var error: NSError? = nil let status = asset.statusOfValue(forKey: "playable", error: &error) if status == .loaded { let isPlayble = asset.isPlayable *// ...* } }
- loadValuesAsynchronously 와 statusOfValue 사용.
- IOS 15 이상let (isPlayable) = try await asset.load(.isPlayable)(단, load 함수의 파라미터로 사용되는 AVAsyncProperty 는 IOS 15 이상)
- AVAsynchronousKeyValueLoading protocol 사용
- property 값을 가져올 때, loaded 된 asset 임을 보장할 수 있다.
AVAsset 의 metadata, AVMetadataItem
- 메타데이터 : 정보의 정보. 정보를 나타내는 부가 정보를 의미.
- asset 또는 track 의 metadata 를 구성하는 item. metadata 는 [AVMetadataItem] 로 구성됨.
- key-value 형식
- Format-specific key spaces”metadata” key 로 value 가져올 수 있음.
- ex) QuickTime 파일의 경우 metadata, user data 를 가짐.
- 특정 파일 포맷에 해당하는 metadata key 값들.
- Common key space”commonMetadata” key 로 value 가져올 수 있음.
- ex) 생성일, 설명
- 공통 metadata key 값들.
- 가져오기let (formats) = try await asset.load(.availableMetadataFormats) for format in formats { let metadata = try await asset.loadMetadata(for: format) for data in metadata { print("[metadata]", data.keySpace?.rawValue, data.stringValue) } }// metadata, commonMetadata 모두 [AVMetadataItem] 타입! let (metadata, commonMetadata) = try await asset.load(.metadata, .commonMetadata) // Format-specific key spaces for data in metadata { print("[metadata]", data.keySpace?.rawValue, data.stringValue) } // Common key space for data in commonMetadata { print("[commonMetadata]", data.keySpace?.rawValue, data.stringValue) }// 방법 2
- // 방법 1
- metadata 필터링, 값 찾기let metadata = try await asset.load(.metadata) *// filtering metadata collection* let items = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: AVMetadataIdentifier(rawValue: "itsk/gsst")) let items = AVMetadataItem.metadataItems(from: metadata, withKey: nil, keySpace: AVMetadataKeySpace(rawValue: "itsk")) *// find specific value* for (index, item) in items.enumerated() { let data = try await item.load(.stringValue) print("###[\\(index)]", data ?? "null") }
AVPlayer
- media asset 의 재생 및 녹화 와 타이밍을 관리할 수 있게해주는 컨트롤러.
- player 는 한번에 하나의 media asset 을 사용.
- replaceCurrentItem(with:) 로 AVPlayerItem 을 대체해 AVPlayer 를 재활용할 수 있다.
AVQueuePlayer TEST 소스 참고
- AVPlayer 의 하위 class.
- AVPlayer 내에서 여러개의 AVPlayerItem 을 연속적으로 재생하는 경우 사용할 수 있다.
AVPlayerLooper TEST 소스 참고
- observeValue 없이 비디오 무한 loop 가능.
AVPlayerItem
- AVAsset 은 단순히 데이터 그 자체의 정적인것으로, AVPlayer 에 담기 위해선 duration/ presentation state 등의 상태값을 갖는 AVPlayerItem 인스턴스가 필요.
- AVPlayer 는 AVPlayerItem 의 상태값을 관리.
- AVPlayerItem 은 최대갯수 제한이 있으며 일부 기기에서는 crash 가 발생할 수 있다.
AVPlayer 과 state observe 방식
- General State Observation
- key-value observing(KVO) 방식
- ex) currentItem, rate TEST 소스 참고
- Timed State Observation
- 위 방식과 다르게 플레이 타임과 같이 지속적으로 변하는 스테이트를 감지.
- addPeriodicTimeObserver(forInterval:queue:using:) TEST 소스 참고
- 특정 기간마다 completion 호출 됨.
- addBoundaryTimeObserver(forTimes:queue:using:)
- 특정 시각에 completion 호출 됨.
AVKit
- video content 를 나타내기위한 framework.
- AVPlayerViewController(iOS, tvOS), AVPlayerView(MacOS)
AVPlayerLayer
- 비디오 컨텐츠 자체를 보여주기 위한 layer이며, 재생/일시정지/재생위치 이동 등의 컨트롤러는 직접 구현해줘야함.
- 플레이어의 타이밍과 동기화를 위해 AVSynchronizedLayer 를 사용할 수도 있으며, AVPlayer 의 currentPlayerItem 과 동기화 된다.
CMTime
- CMTime(value: CMTimeValue, timeScale: CMTimeScale)
- 초를 나타내는 단위로 value / timeScale 초 로 계산된다.
- 프레임 단위로 표기하기위해 timeScale 을 사용하며,extension CMTime { static func seconds(value: Double) -> CMTime { let framePerSeconds: Double = 600 return CMTime(value: value * framePerSeconds, timeScale: framePerSeconds) } }
- 일반적으로 사용되는 24, 25, 30 프레임에 대응하기 위해 600 값을 주로 사용한다.
AVPlayerPlaybackCoordinator
여러 플레이어 인스턴스 간의 동기화된 재생을 관리하는 데 사용됩니다. 이 클래스는 여러 장치에서의 미디어 재생을 조정하거나 여러 AVPlayer 인스턴스 간의 일관된 재생 경험을 제공하는 데 유용합니다.
'기타' 카테고리의 다른 글
[카카오] 실패율 (0) | 2020.10.01 |
---|---|
[카카오] 오픈채팅방 (0) | 2020.10.01 |
[카카오] 크레인 인형뽑기 게임 (0) | 2020.10.01 |
[프로그래머스] 스택/큐 - 프린터 (0) | 2020.10.01 |
[프로그래머스] 해시 - 위장 (0) | 2020.10.01 |