ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Loading media data asynchronously
    iOS Swift/애플 문서 한글화 2023. 6. 7. 18:47

    Article

    이 문서는 Loding media data asynchronously 애플 문서를 한글화 합니다. 

    비동기적인 미디어 데이터 로딩

    언어 수준의 동시성 기능을 사용하여 미디어 데이터를 효율적으로 로드하는 반응형 앱 빌드

     

    Overview

    AVFoundation은 AVAsset 클래스를 사용하여 동영상을 모델링합니다. 에셋 생성은 데이터가 필요할 때까지 미디어 로드를 연기하기 때문에 가벼운 작업입니다. 에셋이 데이터를 로드하는 데 걸리는 시간은 미디어 크기, 로컬 장치 기능 및 원격 네트워크 조건을 비롯한 요인에 따라 다릅니다. 호출 스레드를 차단하지 않으려면 미디어 데이터를 비동기적으로 로드해야 합니다.

     

    important
    iOS 16, tvOS 16, MacCatalyst 16 및 macOS 13부터 AVFoundation은 Swift 클라이언트용 AVAsset, AVAssetTrack 및 AVMetadataItem의 동기적으로 동작하는  속성 및 메서드를 사용하지 않습니다. 또한 아래에 설명된 구문 대신 loadValuesAsynchronously(forKeys:completionHandler:) 메서드를 사용하여 속성 값을 비동기식으로 로드하는 것을 더 이상 사용하지 않습니다.

    비동기적으로 속성값 로드 

    프레임워크는 AVAsyncProperty 및 AVAsynchronousKeyValueLoading의 두 가지 주요 유형을 중심으로 비동기 속성 로딩 기능을 구축합니다. 프레임워크는 AVAsyncProperty 클래스를 사용하여 비동기식 로딩이 필요한 값이 있는 속성에 대한 타입 세이프한 식별자를 정의하고 AVAsynchronousKeyValueLoading 프로토콜을 사용하여 속성을 비동기적으로 로드하기 위한 개체의 인터페이스를 정의합니다. AVAsset, AVAssetTrack 및 AVMetadataItem은 이 프로토콜을 채택하여 아래와 같은 비동기 load(_:) 메서드를 제공합니다.

    public func load<T>(_ property: AVAsyncProperty<Self, T>) async throws -> T

    비동기 컨텍스트에서 이 메서드를 호출하고 wait 를 지정하여 데이터 로드가 완료될 때까지 실행을 일시 중단할 수 있습니다. 메소드는 속성을 성공적으로 로드하면 타입 세이프한 값( nil 값이 아닌 값을 의미)을 반환하고 실패하면 오류를 발생시킵니다.

    / A CMTime value.
    let duration = try await asset.load(.duration)
    // An array of AVMetadataItem for the asset.
    let metadata = try await asset.load(.metadata)

    에셋에서 로드해야 할 프로퍼티들을 모두 알고 있는 경우 여러 식별자를 가변적으로 파라미터로 전달하고 결과 값을 튜플로 받아올 수 있습니다. 마찬가지로 여러 속성을 로드하는 것도 타입 세이프한 오퍼레이션입니다. 

    / A CMTime value and an array of AVMetadataItem.
    let (duration, metadata) = try await asset.load(.duration, .metadata)
    여러  프로퍼티를  동시에 로드하면 AV Foundation에서 요청을 일괄 로드하여 성능을 최적화할 수 있습니다.

     

     

     

    프로퍼티 상태 결정 

    AVAsynchronousKeyValueLoading은 속성 식별자의 상태를 리턴하는 status(of:) 메서드도 제공합니다.AVAsyncProperty.Status 값을 반환하는 데 case 문을 이용해 프로퍼티 값을 확인할 수 있습니다. 

    / Determine the loaded status of the metadata property.
    switch asset.status(of: .metadata) {
    case .notYetLoaded:
        // The initial state of a property.
    case .loading:
        // The asset is actively loading the property value.
    case .loaded(let metadata):
        // The property is ready to use.
    case .failed(let error):
        // The property value fails to load.
    }

    .loaded 및 .failed  관련된 값을 제공합니다. .loaded 는 이전에 로드된 속성 값이 포함되어 있고, .failed 는 실패 이유를 나타내는 에러가 포함되어 있습니다. 연결된 값에 액세스할 수 있으면 속성의 상태를 확인하고 해당 값에 액세스하는 등의 작업을 한 번에 수행할 수 있습니다.

    / Verify the metadata property is in a loaded state.
    if case .loaded(let metadata) = asset.status(of: .metadata) {
        // Process the loaded value.
        processMetadata(metadata)
    }

    컬렉션 형태의 프로퍼티 필터링 

    일부 프로퍼티는 에셋의 트랙 또는 메타데이터와 같이 배열을 값으로  제공합니다. 대부분의 경우 전체 배열보다  일부에만 관심이 있을 수 있습니다. AVAsset 및 AVAssetTrack은 필요한 값으로만 배열을 필터링할 수 있는 방법을 제공합니다. 예를 들어 아래 코드 목록은 에셋에 포함된 오디오 샘플링 속도를 결정합니다. 에셋의 loadTracks(MediaType:completionHandler:)를 호출하여 오디오 트랙만 검색합니다. 각 트랙에서 반복적으로 트랙의 트랙의 description을 비동기식으로 로드합니다. 마지막으로 스트림 description 에서 샘플링 속도를 검색하고 결과를 정렬합니다.

    // Load the asset's audio tracks asynchronously.
    let audioTracks = try await asset.loadTracks(withMediaType: .audio)
    var allDescriptions = [CMFormatDescription]()
    for track in audioTracks {
        // Load each audio track's format descriptions asynchronously.
        allDescriptions.append(contentsOf: try await track.load(.formatDescriptions))
    }
    // Collect the unique sample rates, and sort them from highest to lowest.
    let sampleRates = Set(allDescriptions).map {
        Float($0.audioStreamBasicDescription?.mSampleRate ?? 0)
    }.sorted(by: { $0 > $1 })

    Swift Concurrency 및 AVFoundation의 비동기 API를 사용하면 위와 같이 복잡한 검사도 간편하게 수행할 수 있습니다. 

    'iOS Swift > 애플 문서 한글화' 카테고리의 다른 글

    Recording movies in alternative formats  (0) 2023.06.07
    Exporting video to alternative formats  (0) 2023.06.07
    NFCNDEFReaderSession  (0) 2023.06.06
    Core NFC  (0) 2023.06.06
    Building an NFC Tag-Reader App  (0) 2023.06.06

    댓글

Designed by Tistory.