[ios] VideoToolbox를 이용한 비디오 썸네일 생성

iOS 앱을 개발하다 보면 비디오의 썸네일을 생성해야 하는 경우가 많습니다. VideoToolbox는 iOS에서 비디오 프레임을 디코딩하고 처리하는 데 사용되는 프레임워크로, 썸네일 생성에 매우 유용합니다. 이 글에서는 VideoToolbox를 사용하여 iOS 앱에서 비디오 썸네일을 생성하는 방법을 알아보겠습니다.

비디오 프레임 추출

VideoToolbox를 사용하여 비디오의 프레임을 추출하려면 AVAsset, AVAssetImageGenerator 및 AVAssetTrack을 사용하여 비디오 파일에서 이미지를 생성해야 합니다.

아래는 비디오 파일에서 이미지를 생성하는 방법입니다.

import AVFoundation

func generateThumbnailFromVideo(videoURL: URL, completion: @escaping (UIImage?) -> Void) {
    let asset = AVAsset(url: videoURL)
    let imgGenerator = AVAssetImageGenerator(asset: asset)
    imgGenerator.appliesPreferredTrackTransform = true

    let time = CMTimeMake(value: 1, timescale: 2)
    imgGenerator.generateCGImagesAsynchronously(forTimes: [NSValue(time: time)]) { _, cgImage, _, _, _ in
        if let cgImage = cgImage {
            let thumbnail = UIImage(cgImage: cgImage)
            completion(thumbnail)
        } else {
            completion(nil)
        }
    }
}

위 코드에서 generateThumbnailFromVideo 함수는 비디오의 URL을 받아 해당 파일로부터 썸네일 이미지를 생성하는 함수입니다.

VideoToolbox를 사용한 비디오 프레임 디코딩

VideoToolbox를 사용하여 비디오 프레임을 디코딩하려면 AVAsset, AVAssetTrack 및 VTDecompressionSession을 사용하여 프레임을 디코딩해야 합니다.

비디오 프레임을 디코딩하고 이미지를 생성하는 방법은 다음과 같습니다.

import VideoToolbox

func generateThumbnailFromVideoUsingVideoToolbox(videoURL: URL, completion: @escaping (UIImage?) -> Void) {
    let asset = AVAsset(url: videoURL)
    let reader = try? AVAssetReader(asset: asset)
    guard let videoTrack = asset.tracks(withMediaType: .video).first else {
        completion(nil)
        return
    }
    let outputSettings: [String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32ARGB]

    let videoOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: outputSettings)
    reader?.add(videoOutput)

    let sampleBuffer = videoOutput.copyNextSampleBuffer()

    if let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
        let ciImage = CIImage(cvImageBuffer: imageBuffer)
        let context = CIContext()
        if let cgImage = context.createCGImage(ciImage, from: ciImage.extent) {
            let thumbnail = UIImage(cgImage: cgImage)
            completion(thumbnail)
        } else {
            completion(nil)
        }
    } else {
        completion(nil)
    }
}

위 코드에서 generateThumbnailFromVideoUsingVideoToolbox 함수는 VideoToolbox를 사용하여 비디오의 URL을 받아 해당 파일로부터 썸네일 이미지를 생성하는 함수입니다.

결론

VideoToolbox를 사용하여 iOS 앱에서 비디오 썸네일을 생성하는 방법에 대해 다뤄보았습니다. VideoToolbox는 비디오 프레임을 디코딩하는 데 매우 강력하고 유연한 도구입니다. 앱에서 비디오 처리 기능을 구현할 때 VideoToolbox를 활용하여 효율적으로 작업할 수 있습니다.

참고 문헌:

이제 VideoToolbox를 사용하여 iOS 앱에서 비디오 썸네일을 생성하는 작업을 시작할 수 있을 것입니다.