-
Creating images from a video assetiOS 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