먹고 기도하고 코딩하라

AVAssetDownloadTask와 AVAggregateAssetDownloadTask 차이점 본문

앱/Swift

AVAssetDownloadTask와 AVAggregateAssetDownloadTask 차이점

사과먹는사람 2023. 2. 3. 23:10
728x90
728x90

 

요즘 회사에서 다운로드 작업을 하고 있다. 까다로운데, 또 까다로운만큼 해결할 때의 쾌감이 장난 아닌 작업이다.

정처기 공부할 때 DRM 봤을 때는 이게 나랑 연관 있는 얘기 될 줄 몰랐지.. 팔자에도 없는 줄 알았더니 -_-

 

아무튼 이 태스크 때문에 이슈가 조금 있어서, 왜 iOS 버전에 따라 태스크를 달리 써야 하는지, 또 이 태스크가 근본적으로 무슨 차이가 있는지 좀 알아봤다.

사실 AVAssetDownloadTask는 iOS 9+, AVAggregateAssetDownloadTask는 iOS 11+ 이상을 지원해서 11 이상을 지원하는 우리 앱에서는 사실 일괄적으로 Aggregate 써도 상관없긴 한데, 또 이게 으른의 사정과 내부적인 이슈가 있어서 버전별로 태스크를 나눠 쓰고 있다. 

 

 

Swift로 통신하는 제일 기본적인 방법은 URLSessionTask를 사용하는 것이다.

그 중에서도 HTTP Live Streaming(이하 HLS) 다운로드에 쓰이는 태스크가 따로 있다. HLS란 말하자면 인터넷으로 시청각 미디어를 청크 단위로 나눠 전송하는 것이다. 라이브 방송이나 녹화된 콘텐츠 등을 받는 작업이 바로 이것이다.

HLS 스트림을 다운로드하려면 URLSessionTask를 생성해야 하는데, AVAssetDownloadURLSession은 일반 AVAssetDownloadTask AVAggregateAssetDownloadTask, 2가지 타입의 DownloadTask를 제공한다. 이 2가지 모두 URLSessionTask를 상속받고 있다.

 

 

차이점이 뭔가?

AVAssetDownloadTask는 HLS 스트림을 타입별로 단일 미디어 selections(오디오 트랙, 자막 등)만 다운로드받을 수 있고, AVAggregateDownloadTask는 여러 미디어 selections를 다운로드받을 수 있다. 

(selections를 정확히 뭐라고 해석해야 할지.. 옵션 같은 거라고 생각하면 될 것 같다)

In essence, the difference is between the two comes down to AVAssetDownloadTask only allowing you to download the HLS stream with a single media selections per type (such as audio tracks and subtitles), where AVAggregateAssetDownloadTask allows you to include multiple media selections.

두 downloadtask 모두 생성하는 데에 AVURLAsset이 필요하고, String 타입의 title이 필요하다.

여기에 덧붙여 AVAggregateAssetDownloadTask를 생성할 때는 적어도 하나 이상의 AVMediaSelection이 필요하다.

 

HLS 스트림은 대체 가능한 audible(듣는) 트랙이나 자막 트랙 등 여러 재생 트랙을 포함할 수 있다.

AVAssetDownloadTask를 사용해 HLS 스트림을 다운로드할 때는 기본 default 재생 트랙만 포함한다.

AVAssetDownloadTask에 media selections를 포함시키려면 추가 옵션을 붙여야 한다.

public let AVAssetDownloadTaskMediaSelectionKey: String

그런데 이 때 기본 재생 트랙 외에 대체로 쓸 수 있는 media selection은 딱 1개만 추가할 수 있다. 요게 단점이 될 수 있을 듯.  

AVAssetDownloadTask를 이용해서 여러 재생 트랙을 다운로드하려면, 다운로드 태스크를 연속적으로 실행해서 하나하나 받아야 한다.

 

반면 AVAggregateAssetDownloadTask는 [AVMediaSelection]을 넘겨서 다수 개의 media selections를 한 태스크로 다운로드하는 것을 지원한다.

AVURLAsset은 다음의 2가지 옵션을 제공하고 있다.

// The media selection preferred by the stream
let preferredMediaSelections: AVMediaSelection = asset.preferredMediaSelection
// All available media selections
let allMediaSelections: [AVMediaSelection] = asset.allMediaSelections
 

 

 

AVAssetDownloadTask

  • HTTP 라이브 스트리밍 (이하 HLS) assets을 다운로드받는 데 쓰이는 세션
  • URLSessionTask을 상속받는 서브 클래스.
  • 다운로드 세션의 makeAssetDownloadTask(downloadConfiguration:) 호출해서 객체 생성 가능
    • urlAsset: AVURLAsset
      • AVAssetDownloadTask가 다운로드받는 asset
    • loadedTimeRanges: [NSValue]
      • 다운받아서 재생 준비된 미디어의 시간 범위
    • options: [String: Any]?
      • 태스크에 대한 설정 옵션

 

AVAggregateAssetDownloadTask

  • asset에 대한 여러 media selection을 다운로드하는 태스크
    • urlAsset: AVURLAsset
      • 부모 태스크가 다운로드받는 asset

 

AVMediaSelection

  • (이 짧은 문장을 읽다가 여러 번 미궁에 빠져서 결국 파파고 돌림..)
    • An object that represents a complete rendition of media selection options on an asset.
    • asset에 대한 미디어 선택 옵션의 전체 버전을 나타내는 개체
  • AVMediaSelectionOption이 갖는 mediaType(:AVMediaType)은 audio, subtitle 등이다.

 

 

 

References

 

 

728x90
반응형
Comments