-
AVFoundation - Introduction카테고리 없음 2022. 7. 22. 15:50
AVFoundation 에 대하여
Apple platform에서 시청각미디어를 다루기위한 프레임워크.
미디어를 검토, 생성, 편집, 재 인코딩하는 등의 작업을 할 수 있다. 또한 디바이스의 Input stream을 가져와서 비디오를 실시간으로 조작할 수도 있다.
Core Audio, Core media, Core Animation을 기반으로 하며, UI와 관련된 기능은 포함되어 있지 않기 때문에 UIKit 보다 낮은 레벨에 위치한 프레임워크이다. 요구사항에 따라 가능하면 가장 높은 레벨의 추상화를 사용하는게 좋다.
- 단순히 비디오 재생을 하고싶다면, AVKit 을 사용
- iOS에서 별로 format control이 많이 필요하지 않은 비디오를 녹화하는 경우, UIKit을 사용 (UIImagePickerController)
At a glance
AVFoundation 프레임워크에는 비디오와 관련된 API, 그리고 오디오에만 관련된 API가 있다. The older audio-related claesses provide easy ways to deal with audio (AVAudoiPlayer, AVAudioRecorder).
어플리케이션의 오디오 동작은 AVAudioSession을 통해서 설정할 수 있다. (Audio Session Programming Guide)
AVFoundation를 이용해서 미디어 보여주고 사용하기
AVAsset?
- AVFoundation 프레임워크가 미디어를 나타내기 위해서 사용하는 주요 클래스
- AVAsset의 구조를 이해하면 AVFoundation의 어떻게 동작하는지 쉽게 이해할 수 있다.
- AVAsset 인스턴스는 오디오 또는 비디오 등의 미디어 데이터를 담아내는 하나의 콜렉션이라고 보면 된다.
- 특정 데이터 포맷에 구애받지 않는다.
- 어떤 URL에서 미디어의 asset instance를 생성하거나 새로운 조합을 만들어 내는 클래스들은 AVAsset을 상속
Asset에 들어있는 미디어 데이터 하나하나는 Track이라고 부른다.
어떤 Asset이나 Track을 초기화했다고 해서 언제나 바로 사용가능 한 것은 아니다. 재생시간(duration) 같은 것 조차도 계산하는데 시간이 걸릴 수 있다. 이런 값들을 계산 중일 때는, 사용 중인 스레드를 블로킹하지말고 계산 로직은 비동기로 실행하고 콜백으로 결과를 받아서 처리하자.
Playback
Asset 재생을 정교하게 관리하기 위해서, Presentation state와 Asset 그 자체를 분리해서 관리한다.
- Presentation state는 player item 객체에 의해 관리된다
Using the player item and player item tracks you can, for example, set the size at which the visual portion of the item is presented by the player, set the audio mix parameters and video composition settings to be applied during playback, or disable components of the asset during playback.
Player 객체로 player item을 재생할 수 있고, player의 아웃풋을 Core Animation layer로 보낼 수 있다.
Player queue를 사용해서 player item 콜렉션을 순서대로 재생할 수 있다.
Reading, Wiriting and Reencoding Assets
AVFoundation 을 통해 어떤 Asset을 여러가지 방법으로 새롭게 표현할 수 있다. 이미 존재하는 Asset을 그저 Reencode할 수도 있고, 특정한 작업들을 통해서 컨텐츠를 편집해 결과를 새로운 Asset으로 저장할 수도 있다.
Export session을 이용해서 preset에 정의된 포맷으로 reencode할 수 있다. 더 많은 조작이 필요하다면 Asset reader와 Asset wirter 객체를 사용할 수 있다.
파형을 시각적으로 나타내야할 필요가 있다면 asset reader로 audio track을 읽으면 된다.
Thumbnails
비디오 Thumbnail을 생성하기 위해서 AVAssetImageGenerator를 사용
Editing
AVFoundation은 원래 존재하던 미디어에서 새로운 asset을 만들때 composition을 이용
Track을 추가/삭제/순서변경을 하기 위해서 mutable composition을 사용한다.
Export session을 사용해서 이 composition을 file로 쓸 수 있다.
Asset writer를 사용해서 샘플 버퍼나 스틸 이미지 같은 미디어로 asset을 만들 수 있다.
Still and Video Media Capture
카메라나 마이크 입력을 녹화/녹음 하는 것은 capture session에 의해 관리된다.
Capture session은 기기 입력부터 파일과 같은 출력까지의 데이터 흐름을 조정한다.
여러 개의 입력/출력을 한 세션에 설정할 수 있다. 어떤 세션이 이미 동작 중일 때도.
세션에 메시지를 데이터 처리를 시작할 수도 멈출 수도 있다.
Preview layer 인스턴스를 통해서 카메라가 녹화중인 것을 보여줄 수 있다.
Concurrent Programming with AVFoundation
AVfoundation의 call back 들은 특정 스레드나 큐에서 만들어진다고 보장된 바 없음.
그냥 callback들을 내부 태스크 동작하던 스레드나 큐에서 실행 함.
- UI 관련 notification은 메인 스레드에서 발생
- Classes or methods that require you create and/or specify a queue will return notifications on that queue.