ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Creating images from a video asset
    iOS Swift/애플 문서 한글화 2023. 6. 7. 20:22

    Article

    애플 공식 문서 Creating images from a video asset을 한글화한 문서입니다.

     

    비디오 에셋에서 이미지 생성  

    비디오 프레임에서 이미지를 생성하여 미디어 타임라인 내의 특정 시간에 대한 이미지를 표시합니다.

     

    Overview

    일반적으로 동영상 앱을 만들 때  일반적인 요구 사항은 비디오 컨테츠의 이미지를 표시하는 것입니다. 비디오 목록에 단일 썸네일을 표시하거나 비디오 파일 로딩 중에 이미지를 보여주고 타임 라인 바를 선택했을 때 해당 지점의 이미지를 보여 주고 선택 시 해당 지점으로 이동 할 수 있도록 할 수 있습니다. AVFoundation을 사용하면 AVAssetImageGenerator를 사용하여 앱의 비디오 컨텐츠에서 이미지를 간단하게 생성할 수 있습니다.

    AVAssetImageGenerator는 하나 이상의 비디오 트랙이 포함된 에셋에서 이미지를 생성하는 유틸리티 클래스입니다. 이를 사용하여 단일 시점에 대한 이미지를 생성하거나 시간 배열을 이용해 일련의 이미지를 생성할 수 있습니다.

     

    Image generator 설정 

    이미지를 검색할 비디오 에셋을 전달하여 AVAssetImageGenerator의 인스턴스를 만듭니다. generator는 로컬 및 원격 파일 기반 미디어와 I-프레임 전용 변환을 제공하는 HLS(HTTP 라이브 스트리밍) 비디오에서 이를 지원합니다. 

    let asset: AVAsset = // A video asset.
    let generator = AVAssetImageGenerator(asset: asset)
    Note
    EXT-X-I-FRAMES-ONLY 태그가 있는 미디어 재생 목록을 제공하는 HLS 스트림에서 이미지를 생성할 수 있습니다. 재생 목록이 I-프레임 간에 지정하는 기간은 이미지 생성 요청의 시간 해상도를 결정합니다.

    generator  생성 시 이미 이미지를 생성할 준비가 되어 있지만  이미지 생성과 관련된 설정들을 추가할 수 있습니다. 일반적으로 설정하는 속성 중 하나는 maximumSize입니다. 기본적으로 generator는 비디오의 기본 해상도로 이미지를 생성하며, 이는 종종 필요한 것보다 크며 CPU 및 메모리를 많이 사용할 수 있습니다. 대신 maximumSize 속성 값을 설정하여 출력 크기를 제한합니다. 예를 들어 다음과 같이 최대 크기를 설정하여 너비를 특정 값으로 제한하고 0을 지정하여 높이를 비례적으로 조정할 수 있습니다.

    // Generate the equivalent of a 150-pixel-wide @2x image.
    generator.maximumSize = CGSize(width: 300, height: 0)

    시간 정밀도 지정 

    기본적으로 generator는 요청한 시간에 가까운 이미지를 생성하지만 실제 시간은 효율성을 위해 약간 전후일 수 있습니다. generator가 요청된 시간에서 벗어날 수 있는 시간을 변경하려면 registeredTimeToleranceBefore 및 registeredTimeToleranceAfter 속성의 값을 통해서 설정합니다. 예를 들어 요청한 시간보다 일찍 시작하고 2초 후에 시작하는 시간 범위에서 이미지 생성이 발생하도록 허용하려면 허용 오차 값을 아래와 같이 설정합니다.

    // Configure the generator's time tolerance values.
    generator.requestedTimeToleranceBefore = .zero
    generator.requestedTimeToleranceAfter = CMTime(seconds: 2, preferredTimescale: 600)

    이미지 생성 

    generator 가 요구된 이미지를 생성하기 위해 미디어 데이터를 탐색하고 디코딩하는 데 정확한 시간을 알 수 없습니다. 이를 동기적으로 수행하게 되면 호출한 스레드가 블럭되고 앱의 사용자 경험이 저하되거나 앱이 죽을 수 있습니다. 따라서 이미지 생성은 비동기적으로 처리해야 합니다. 비디오 타임라인에서 단일 이미지를 생성하려면 비동기 함수 image(at:) 에 요청 시간을 파라미터로 전달해 호출합니다. 아래 예제는 비디오의 첫 프레임을 이미지로 생성합니다.

    // Generate an image at time zero.
    let (image, actualTime) = try await generator.image(at: .zero)

     이미지를 생성한 시간과 요청 시간이 다를 수 있으므로 메서드는 이미지와 함께 실제 이미지 생성 시간을 튜플로 반환합니다.(미디어 파일에 I 프레임을 가지고 이미지를 만들어 내므로 실제 시간과 다를 수 있음). 이 정보가 필요하지 않으면 아래와 같이 더 간결하게 이미지를 가져 올 수 있습니다. 

    // Generate an image at time zero. Access the image alone.
    let image = try await generator.image(at: .zero).image

    generator를 사용하여 비디오 타임라인에서 일련의 이미지를 생성할 수 도 있습니다. 비디오 에셋에서 여러 이미지를 생성하려면 아래와 같이 비동기 함수 images(for:) 함수를 호출합니다. 

    let times: [CMTime] = // An array of times at which to create images.
    for await result in generator.images(for: times) {
        switch result {
        case .success(requestedTime: let requested, image: let image, actualTime: let actual):
            // Process the image for the requested time.
        case .failed(requestedTime: let requested, error: let error):
            // Handle the failure for the requested time.
        }
    }

    이 메서드는  AVAssetImageGenerator.Images 유형의 비동기 시퀀스를 반환합니다. 요청한 이미지 생성이 성공하면 요청한 시간과 실제 이미지 생성 시간과 함께 이미지를 제공합니다. 실패하면 결과는 요청 시간과 실패를 설명하는 에러를 제공합니다.

     

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

    Recording movies in alternative formats  (0) 2023.06.07
    Exporting video to alternative formats  (0) 2023.06.07
    Loading media data asynchronously  (0) 2023.06.07
    NFCNDEFReaderSession  (0) 2023.06.06
    Core NFC  (0) 2023.06.06

    댓글

Designed by Tistory.