기타

[AVFoundation]

빨간체리반지 2024. 8. 1. 08:59

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