머신 러닝 기반 비디오 효과로 앱 향상하기
Video Toolbox는 비디오 앱에서 많이 사용되는 프레임워크로 여러 비디오 관련 요구사항을 충족하는 기능을 제공
macOS 15.4부터 Video Toolbox는 VTFrameProcessor API로 개선
해당 API는 Apple Silicon에 최적화된 새로운 ML 기반 비디오 처리 알고리즘을 포함
해당 API를 이제 iOS 26에서도 사용할 수 있음.
목차
- Video effects overview
- 먼저 VTFrameProcessor API를 통해 현재 사용할 수 있는 효과
- Add effects to your app
- 효과를 앱에 통합하는 기본 단계에 대해서 설명
- Example use cases
- 주요 사용 사례를 위한 몇가지 예시를 구현하는 방법 시연

VTFrameProcessor API는 다양하게 사용할 수 있는 여러 효과를 제공하는데
Frame rate conversion, Super resolution, Motion Blur은 고품질 비디오 편집을 위해 설계되었음
특히 Low latency frame interpolation 및 Low latency super resolution은 실시간 처리를 담당하는 애플리케이션에 적합
Temporal noise Filter는 고품질 비디오 편집이나 실시간 처리 애플리케이션 두 경우 모두 사용할 수 있음.

Frame rate conversion은 클립의 초당 프레임 수를 목표 FPS에 맞추기 위해 조정
슬로우 모션 효과를 만들 때도 사용할 수 있음.

Super resolution은 비디오 해상도를 높이고 오래된 비디오의 세밀한 디테일을 복원하는 초고화질 스케일러는 사진 보정 및 미디어 복원과 같은 용도에 적합.
이 예시에서 초고화질 효과를 적용하면 비디오의 선명도와 품질이 개선되어 배의 오른쪽 디테일이 더 풍부하게 표현되어 덜 흐릿하게 보임.
초고화질 효과를 위해 두 개의 ML 모델이 제공되는데, 하나는 이미지용 하나는 비디오용임.


Motion Blur는 영화 제작에서 인기 있는 기능으로 관객이 기대하는 자연스러운 움직임을 생성하는데 필수.
다양한 효과를 생성할 때도 사용할 수 있음. 이 예시에서 오른쪽 비디오에 모션 블러 효과가 적용되었고, 이에 따라서 더 빠르게 이동하는 효과처럼 느껴지게 함. 도한 갑작스러운 움직임을 연속적으로 느끼게 해서 더 부드럽게 느끼도록 함.

Temoporal noise filter도 매우 좋은 기능으로 이는 과거와 미래의 참조 프레임을 활용한 모션 추정을 기반으로 함.
이 효과는 시간에 따라 화면이 바뀔 때 생기는 지저분한 노이즈를 줄이고, 이상한 깨짐이나 잔상 같은 artifact를 없애며, 영상 압축이 더 잘 되게 만들고, 결과적으로 화질도 좋아 보이게 함.
- temporal noise: 한 프레임만 보면 잘 안 보이는데, 영상으로 보면 화면이 자글자글 깜빡이는 노이즈예요. 예를 들어 어두운 장면에서 배경이 계속 미세하게 반짝이는 것.
- 부드럽게 처리: 프레임과 프레임 사이의 변화가 너무 튀지 않게 평균화하거나 안정화
- artifact 영상 처리나 압축 때문에 생긴 부자연스러운 흔적. (블록 깨짐, 링잉, 번짐, 계단 현상, 잔상 같은 것들.)
- 압축이 용이: 노이즈가 많으면 매 프레임이 조금씩 달라 보여서 압축기가 “노이즈도 정보”라고 판단해 데이터를 많이 사용. 노이즈를 줄이면 프레임 간 차이가 줄어들어서 더 적은 용량으로 압축하기 쉬워짐.
- 품질 개선: 자글거림과 깨짐이 줄어드니 사람이 보기에는 더 깔끔하고 안정적인 영상처럼 느껴짐.

Low latency frame interpolation은 실시간으로 프레임 속도를 업샘플링 하며, 옵션으로 해상도도 업샘플링할 수 있음.
차이는 영상이 움직일 때 왼쪽은 끊김이 심한데, 오른쪽은 부드럽게 진행됨.
Frame Interpolation (프레임 보간)은 원본 프레임들 사이에 새로운 프레임을 인공적으로 만들어 끼워 넣는 기술


Low Latency Super Resolution은 가벼우면서도 강력한 성능을 갖춘 실시간 업스케일링 기술
이 스케일러는 네트워크 상태가 좋지 않은 환경에서도 화상 회의 품질을 개선하도록 최적화되어 있음.
낮은 해상도의 비디오 프레임을 더 높은 해상도로 복원하고, 압축 과정에서 생기는 코딩 아티팩트를 줄이며, 흐릿해진 가장자리를 선명하게 보정함.
해당 효과가 적용되면 영상의 해상도가 높아지고 압축 artifact 줄어듦.
또한 가장자리가 또렷해지면서 얼굴 윤곽, 표정, 글자, 물체의 경계처럼 중요한 특징의 디테일이 더 잘 드러나게 됨.

앱에 해당 효과를 통합하는 방법을 코드로 함께 보자
앱이 이러한 효과를 통합하고 프레임워크 간에 데이터가 교환되는 방법을 설명하고 클립을 처리하는 주요 단계도 설명



VTFrameProcessor API에 접근하려면 앱이 Video Toolbox 프레임워크를 우선 가져와야 함.
- 이 단계에서는 앱은 전체 세션 동안 효과를 사용하는 방법을 설명하는 Configuration을 제공하여 처리하는 세션을 시작
- 세션이 생성되면 앱은 프레임을 처리할 준비가 된 VTFrameProcessor 객체를 얻음
- VTFrameProcessor은 프레임 기반 API로 앱은 입력 비디오 프레임과 관련 매개변수를 하나씩 전송해야 함.
- 처리 완료 후 프레임워크는 출력 프레임을 반환


비디오 편집과 실시간 비디오 향상 등 두가지 사례에 초점을 맞춰 예제를 알아볼 것.
비디오 편집에 적한한 기능은 특히 비디오이 중요할 때 유용함
- Frame rate conversion은 비디오 클립의 프레임 수를 늘리는 과정으로 새로운 프레임을 합성하여 기존 프레임 사이에 삽입하는 방식으로 진행.
- 주로 비디오 재생의 부드러움을 개선하기 위해 사용되며 특히 source 및 대상 디스플레이 간의 프레임 속도 불일치로 인한 judder(저더) 현상을 완화하는데 사용됨.
- 누락된 프레임으로 인해 발생한 간격을 채우는 데도 도움이 됨
- 슬로우 모션 효과를 만들 때 사용될 수 있음
- 영화에서는 느린 재생을 통해 시각적으로 더 인상적인 액션 장면을 만들기 위해 이 효과를 자주 활용
- 스포츠에서는 중요한 영역은 강조하고 분석하기 위해 슬로우 모션을 사용

VTFrameProcessor API 사용하여 프레임 전환율을 구현하는 방법을 시연
- Processor 객체 생성
- Configuration 객체 생성


다음으로는
- VTFrameProcessorParameters
타입의 객체를 사용해서 프레임을 처리하는 것
이를 사용하기 전에 매개변수 객체에 필요한 모든 버퍼를 먼저 할당해야 함.
일반적으로 모든 입력 및 풀력 프레임 버퍼는 호출자가 할당함.
Configuration 소스 및 픽셀 버퍼 속성을 사용하여 CVPixelBuffer 풀을 설정할 수 있음.
- 먼저 현재 소스 및 다음 프레임 객체를 생성
- interpolationPhase 배열을 통해 보간된 프레임을 삽입할 위치를 지정
- 배열의 크기는 보간할 프레임 수를 나타냄
- 마지막으로 출력을 받을 버퍼로 구성된 destinationFrames 배열을 생성
- 이 배열의 크기는 interpolationPhase 배열과 동일
버퍼가 준비되었다면 나머지 Parameters를 설정할 수 있음.
- optioncalFlow를 nil로 설정할 경우 프로세서가 흐름을 계산하도록 함.
- submissionMode를 설정하여 프레임이 순서에 따라 전송되는지 혹은 무작위로 전송되는지 지정

정리하자면
- VTFrameProcessorConfiguration 클래스는 효과의 처리 세션을 설정하는 방법을 설명
- VTFrameProcessorParameters 클래스는 입력 및 출력 프레임과 관련된 모든 매개변수를 설명

앱을 개발할 때 결정해야 할 중요한 요소 중 하나로 광학 흐름을 사전에 계산할 것인지의 여부임.
광학 흐름 계산에는 비용이 많이 들 수 있으며, 일부 앱은 렌더링 단계의 성능을 개선하기 위해 이를 사전에 처리해야 함.
Optical flow는 광학 흐름을 사전에 계산하기 위해서 VTOpticalFlowConfiguration과 VTOpticalFlowParameters를 사용할 수 있음.
VTOpticalFlowConfiguration에서 사전 계산된 flow 매개변수에 false로 설정하면 프레임워크는 흐름을 실시간으로 계산함
- 1. 사전 계산(Pre-computed) 모드(영상 전체를 미리 분석 -> flow 데이터 저장 -> 필요할 때 꺼내 사용)
- 장점: 재생/처리 시 매우 빠름 (이미 계산되어 있으니까)
- 단점: 초기 분석 시간이 오래 걸림, 메모리/디스크 사용량 큼
- 용도: 영상 편집, 후처리(post-processing), 고품질 슬로우 모션
- 2. 실시간(Real-time) 모드
- 프레임이 들어올 때마다 즉석에서 flow 계산
- 장점: 초기 지연 없음, 라이브 스트림에 적합
- 단점: 매 프레임마다 계산 비용 발생 (성능 부담)
- 용도: 실시간 카메라 효과, 라이브 비디오 처리



모션 블러는 느린 셔터 속도를 시뮬레이션해서 움직이는 물체가 흐려지는 효과를 생성
API를 통해 블러 강도를 조정해서 화면에서의 흘미 강도를 제어할 수 있음.
블러는 동작이 자연스럽게 보이도록 하거나 빠른 물체에 속도감을 추가하는 것처럼 예술적인 이유로 주로 사용됨
타임랩스에 사용하면 더 자연스러운 느낌을 줄 수도 있음.

모션 블러로 처리 세션을 생성하려면 VTMotionBlurConfiguration 클래스를 사용하고 위에서 처리하는 형태와 동일하니 위의 내용 참고
파라미터는 VTMotionBlurParameters를 사용하며 우선 next와 previous 프레임 등 두 개의 참조 프레임이 필요.
첫 클립에는 previous에서 프레임을 nil로 설정하고 또한 최종 프레임에서 next 프레임을 nil로 설정
프레임 버퍼를 확보했으므로 VTMotionBlurParameters를 만들 수 있음
프로세서가 광학 흐름을 계산하도록 OpticalFlow를 nil로 설정하고 strength는 블러 강도를 설정함.


화상 회의나 실시간 스트리밍과 같은 실시간 영상에 사용하는 예제
우측 3개는 모두 실시간 사용을 위해서 설계되었음.
이러한 기능은 성능을 고려하며 비디오를 개선
Low latency frame interpolation은 일반적으로 수신하는 기기에서 진행.

Low latency super resolution은 아래 2개로 구성되면 실시간 화상 회의를 위해 구성
- VTLowLatencySuperResolutionScalerConfiguration
- 프레임 너비, 높이, 스케일링 비율만 필요
- VTLowLatencySuperResolutionScalerParameters
- 소스 및 목적지 프레임 버퍼만 필요

Low latency frame interpolation은 아래 2개로 구성되면 실시간 화상 회의를 위해 구성
특히 이 기술은 연결 속도가 느릴 때 영상 통화 앱에 유용.
Judder를 완화하여 편안한 스트리밍 경험을 제공
해당 API에는 프레임 속도 더블링 및 해상도 업스케일링 기능을 하나로 결합한 유틸리티도 존재
- VTLowLatencyFrameConfiguration
- VTLowLatencyFrameParameters
Video Toolbox 프레임워크는 이미 하드웨어 비디오 인코딩과 디코딩 기능에 대한 직접적인 접근을 비롯해 다양한 기능을 제공
비디오 압축, 압축 해제 픽셀 타입 변환과 같은 서비스를 지원
VTFrameProcessor API를 통해 더 매력적인 애플리케이션을 만들 수 있음.
(참고)
https://www.youtube.com/watch?v=EbRvY6j8d7g&list=PLjODKV8YBFHZ0CMQQU55bE_r6i01KSqCA