Basics of Using QTKit Capture

OSXDEV

Jump to: navigation, 찾기

QTKit Capture Programming Guide로 이동


QuickTime Kit 프레임워크는 코코아와 퀵타임 개발자들의 일반적인 미디어 관련 과제 대부분을 지원하기 위해 애플에 의해 개발되었다. 이는 코코아 개발자들에게 익숙한 개념과 데이터 타입을 통해 구현 가능하며, 꼭 필요한 경우에만 새로 정의된 개념과 데이터 타입을 사용했다. 목표는 다양한 타입의 미디어를 재생, 편집, import, export 하기 위한 하이-레벨의 코코아 인터페이스를 제공하는 것이다. 개발자 커뮤니티로부터의 요구가 증가하여 , 프레임워크를 구성하는 다섯가지 기반 클래스에 새로운 메소드들이 더해졌다.


Mac OS X 10.5가 소개되고, 퀵타입 7의 최신판이 나오면서, QuickTime Kit 프레임워크는 카메라나 마이크 같은 외부 소스로부터 미디어를 캡처하는 기능을 제공하고, 미디어를 퀵타임 무비로 뽑아내는 중요한 도약을 이뤄냈다. 15개의 새로운 클래스가 프레임워크의 기존의 다섯개 기반에 더해졌다. 어플리케이션이 비디오 보드 같은 외부 장비로부터 디지타이즈 된 데이터를 얻어올 수 밖에 없었던 시퀀스 그래버 API의 C 프로시져 사용에 대한 확실하고 실용적인 대안을 코코아와 퀵타임 개발자들에게 제공하는 것을 목표로 하고 있다. 이제 미디어 캡처와 녹화를 지원하는 어플리케이션에서는 QTKit 캡처 API 사용을 권장한다.


이번 챕터에서는 QTKit 캡처 아키텍처와 Mac OS X 10.5에서 구현 가능한 부분에 대한 기본적인 설명을 한다. 이 챕터를 읽으면 어떻게 캡처, 레코드하고, 다양한 위치에 출력을 하는 지에 대한 이해를 얻게 될 것이다. 예를 들어, iSight 카메라나 다른 DV 장비로부터 퀵타임 파일로 레코딩하는 것은 퀵타임 캡처 API의 가장 일반적인 활용이다.

새로운 API를 이용하기 위해서는 이 챕터를 먼저 읽고, QTKit 캡처 플레이어 어플리케이션을 설명하는 다음 챕터로 넘어가야 할 것이다.


목차

[편집] Tasks Supported by QTKit Capture Classes

하이-레벨의 Objective-C 프레임워크 답게, QuickTime Kit은 퀵타임, 코어 이미지, 코어 오디오, 코어 애니메이션, 쿼츠 2D, OpenGL과 같은 수 많은 Mac OS X의 그래픽스와 이미징 기술 위에 만들어졌다. 이것은 당신의 어플리케이션에서 비디오, 오디오 그리고 이미지 미디어들을 처리하는 작업들은 이미 하부의 Mac OS X 그래픽스와 이미징 엔진에 의해 이미 제공되는 것이며, 그로인해 Xcode 프로젝트에 부하를 줄 수 있는 사용자 코드를 줄여줄 수 있는 것이다.

QuickTime Kit에서 사용가능한 캡처 클래스와 메소드들은 정확한 프레임의 오디오/비디오 싱크, 정확한 프레임의 캡처를 지원하다. 이는 캡처를 시작할 때 -타임코드에 기반하여- 정확히 지정할 수 있다는 것이다. 캠코더의 제어를 전달 할 수도 있으므로, 테잎을 빨리감거나 되감을 수도 있다.

이 클래스와 메소드를 사용하면 다음 중 하나 이상의 외부 소스로부터 미디어를 캡처할 수 있다

  • 카메라
  • 마이크
  • 캡처 카드나 테잎 데크 같은 다른 외부 미디어 장비

미디어를 캡처한 후에, 다음을 포함하는 다양한 하나 이상의 출력 대상에 레코드 할 수 있다:

  • 퀵타임 무비(.mov)파일
  • 입력 소스로부터 캡처한 비디오 미디어를 프리뷰하는 코코아 뷰

일단, 미디어를 캡처하면, 그 출력을 커스텀하게 만든 어플리케이션과 커스텀한 처리를 위해 다른 대상에도 레코드 할 수 있다.이 기능은 QTCaptureDecompressedVideoOutput과 QTCaptureVideoPreviewOutput 클래스에 있는 메소드에 의해 제공된다.

다음 섹션에서는 QuickTime Kit 프레임워크에서 함께 하게 될 캡처 오브젝트의 타입에 대해 이야기 할 것이다. QTKit 캡처 어플리케이션 플레이어를 만들기 위해 그 오브젝트들에 대한 기본적 이해가 중요하다.


[편집] How QTKit Capture Works

모든 QTKit 캡처 어플리케이션은 세가지 기본적 오브젝트 타입을 사용한다: 캡처 입력, 캡처 출력, 그리고 캡처 세션이다. 캡처 입력은 QTCaptureInput의 서브클래스로서, 캡처된 미디어의 서로 다른 소스에 대한 필수적인 인터페이스를 제공한다.


캡처 장비 입력은 QTCaptureDeviceInput-QTCaptureInput의 서브클래스-의 오브젝트로서,카메라나 마이크 같은 다양한 오디오/비디오 하드웨어로부터 캡처하는 인터페이스를 제공한다. 캡처 출력은 QTCaptureOutput의 서브클래스로서, 퀵타임 무비파일이나 비디오,오디오 프리뷰 같은 다양한 미디어 목적지에 대한 필수적인 인터페이스를 제공한다.


캡처 세션은 QTCaptureSession 오브젝트로서, 연결된 입력소스로부터 캡처된 미디어가 연결된 출력 목적지로 뿌려지는 방법을 관리한다. 각각의 입력과 출력은 하나 이상의 연결을 가지고 있으며, 그 연결은 비디오나 오디오 미디어 같은 특정한 퀵타임 미디어 타입의 미디어 스트림을 나타낸다.

그림 1-1에서처럼, 캡처 세션은 카메라로 부터의 비디오를 프리뷰하고 레코드하기 위해 입력과 출력을 연결하는 일을 한다.

 그림 1-1 캡처 세션에서 입력과 출력을 연결하기

그림 1-1 캡처 세션에서 입력과 출력을 연결하기

캡처 세션은 하나의 비디오 입력 연결을 각각의 출력이 가진 연결로 뿌려주는 일을 한다. 각각의 출력에 분리된 미디어 스트림을 뿌리는 것 외에도, 캡처 세션은 입력으로 부터 오는 다수개의 오디오를 하나의 스트림으로 믹싱하는 작업도 책임진다.

그림 1-2는 다중 오디오 입력을 다루는 캡쳐 세션을 보여준다.

그림 1-2 캡처세션에서 다중 오디오 입력을 다루기

그림 1-2 캡처세션에서 다중 오디오 입력을 다루기.


그림 1-2에 그려진 것 처럼, 캡처 세션은 입력 비디오 모두를 그것을 수신하는 출력단으로 보내고 모든 입력 오디오를 오디오를 받는 출력단에 보낸다. 그러나, 분리된 오디오를 출력단에 보내기 전에, 그것들을 하나의 스트림으로 믹스해서 하나의 캡처 연결로 보낼 수 있도록 한다.


캡처 세션은 모든 미디어들이 하나의 타임 베이스에 동기화 되도록 보장 함으로서 모든 출력 비디오와 오디오가 동기화 하도록 하는 책임이 있다.


각각의 입력과 출력에 속하는 연결은 QTCaptureConnection 오브젝트이다. 이것은 입력으로 부터 얻은 혹은 출력으로 보내지는 각각의 스트림에 대한 미디어 타입과 포맷을 나타낸다. 특정 연결을 참조함으로서ㅡ 당신은 어플리케이션의 세션으로 들어오고 나가는 미디어에 대해 보다 미세하게 정제된 제어를 할 수 있다. 즉, 특정 연결을 사용 가능 혹은 불가능 하게 하고, 미디어 entering의 특정 어트리뷰트를 제어할 수 있다(예를 들어, 특정 오디오 채널의 볼륨 조정).


[편집] Using the QTKit Capture API

QTKit 캡처 API는 15개의 새로운 클래스와 수백개의 새로운 메소드, 노티피케이션 그리고 어트리뷰트로 구성된다. 코코아 혹은 퀵타임 어플리케이션에서 이 API를 활용하는 법을 보다 잘 이해하기 위해서, API의 다양한 그룹화에 대해 설명한 이 섹션을 읽어야 할 것이다. 그 클래스들과 해당 메소드들에 대한 완전한 설명은 QuickTime Kit Framework Reference에서 볼 수 있다.

4개의 기반 클래스들이 있으며, 6개의 클래스가 입력과 출력을 담당하며, 다른 3개의 클래스들중 하나는 장비 입력을 다루고, 다른 하나는 사용자 인터페이스를, 마지막 하나는 상수와 에러 메세지들을 가지고 있다.

[편집] Base Classes

기반 클래스라고 이름 붙일 수 있는 클래스가 4개 있다. 그 것들이 어떻게 동작하는 지 이해하는 것은 QTKit 캡처 API 이용에 핵심적이다.

QTCaptureSession클래스는 입력 소스를 출력 목적지로 연결하는 인터페이스를 제공한다. 이 클래스에서 가장 빈번히 사용되는 메소드는 startRunning로서, 리시버에게 입력으로부터 데이터 캡처를 시작하고 그 데이터를 출력으로 보내도록 한다.


[편집] Input and Output Classes

그룹내에는 다섯개의 출력 클래스와 하나의 입력 클래스가 있다.

QTCaptureDeviceInput클래스에 있는 메소드를 이용하여 카메라나 마이크 같은 다양한 미디어 디바이스들을 위한 입력 소스를 다룰 수 있다. 다섯개의 출력 클래스들은 QTCaptureSession 오브젝트의 캡처한 미디어를 퀵타임 무비 같은 곳에 쓰거나 캡처되는 비디오/오디오를 프리뷰 하기 위한 출력 목적지를 제공한다.

추상 슈퍼클래스인, QTCaptureFileOutput은 캡처 세션이 캡처한 미디어를 간단히 파일에 쓸 수 있도록 출력 목적지를 제공한다.

클래스 그룹 태스크 자주 사용하는 메소드
QTCaptureAudioPreviewOutput 입력/출력 캡처중인 오디오를 프리뷰하는 데 사용할 수 있는 QTCaptureSession의 출력 목적지를 나타냄 volume, setVolume:, setOutputDeviceUniqueID:
QTCaptureDecompressedVideoOutput 입력/출력 캡처중인 비디오로부터 압축해제된 프레임을 처리하는데 사용할 수 있는 QTCaptureSession오브젝트의 출력 목적지를 나타낸다 setDelegate:, captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:
QTCaptureDeviceInput 입력/출력 퀵타임 파일과 비디오 프리뷰 같은 QTCaptureSession 에 대한 미디어 장치들을 위한 입력 소스를 나타낸다. initWithDevice: ; 주어진 장치에 대한 QTCaptureDeviceInput 의 인스턴스를 리턴한다.
QTCaptureFileOutput 입력/출력 캡처된 미디어를 파일에 쓰고, 미디어 샘플을 파일에 레코드 하는 출력을 위한 인터페이스를 정의한다. recordToOutputFileURL:, setDelegate:, captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:
QTCaptureMovieFileOutput 입력/출력 캡처된 미디어를 퀵타임 무비 파일에 쓰는 QTCaptureSession을 위한 출력 목적지를 나타낸다. recordToOutputFileURL:, setDelegate:, captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:
QTCaptureVideoPreviewOutput 입력/출력 캡처되고 있는 비디오를 프리뷰 하는 데 사용되는QTCaptureSession을 위한 출력 목적지를 나타낸다. visualContextForConnection:, setDelegate:, captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:


[편집] Utility Classes

이 그룹에는 3개의 클래스들이 있다; QTCompressionOption, QTFromatDescription 그리고 QTSampleBuffer 이다. 이들은 유틸리티 클래스로서 최대한 특성화 되어서, 특정 미디어를 위한 압축 혹은 다양한 미디어 샘플의 포맷을 묘사하는 등과 같이, representing과 관련된 일을 수행한다.

QTCompressionOption의 compressionOptionsIdentifiersForMediaType:과 mediaType 메소드를 이용해서 모든 종류의 서로 다른 미디어에 대한 압축 옵션을 묘사할 수 있다. 압축 옵션은 identifier 이름으로 키 설정된 프리셋을 이용해 만들어진다. 프리셋 identifier들은 QuickTime Kit Framework Reference의 해당 클래스를 설명한 챕터에 리스트 되어 있다.

QTSampleBuffer 오브젝트를 사용하면, 출력에 필요한 샘플 버퍼 데이터에 대한 정보를 얻거나 버퍼에 있는 미디어 샘플을 처리할 수 있다.

클래스 그룹 태스크 자주 사용하는 메소드
QTCompressionOptions 유틸리티 특정 타입의 미디어를 위한 압축 옵션의 세트를 나타냄 compressionOptionsIdentifiersForMediaType:, mediaType
QTFormatDescription 유틸리티 미디어 샘플과 장치와 캡처 연결과 같은 미디어 소스에 대한 미디어 포맷을 설명한다. localizedFormatSummary. 상수, QTFormatDescriptionVideoCleanApertureDisplaySizeAttribute
QTSampleBuffer 유틸리티 미디어 샘플 버퍼에 대한 포맷 정보, 타이밍 정보 그리고 메타 데이터를 제공한다 formatDescription


[편집] Device Access and User Interface Classes

이 그룹에는 두개의 클래스가 있다; QTCaptureDevice와 QTCaptureView.


QTCaptureDevice 오브젝트를 이용할때, 당신의 어플리케이션은 deviceAttributes와 attributeForKey:메소드를 이용해 이 클래스에서 사용가능한 확장된 어트리뷰트를 개수에 상관없이 읽을 수 있다.

그 뿐 아니라, 키-값 코딩을 이용해서 어트리뷰트를 얻고 설정할 수 있다. 만약 주어진 어트리뷰트의 변화를 관찰하고 싶다면, 키 패쓰를 어트리뷰트 키로 지정하여 키-값 observer를 더할 수 있다. QTCaptureDevice의 인스턴스를 직접 만들 수는 없다는 것을 주의하라.


그 메소드들은 QTCaptureSession의 인스턴스에 의해 처리되는 비디오를 프리뷰 하기 위해 NSView의 서브클래스인 QTCaptureView 클래스에서 사용할 수 있다. 클래스는 캡처 세션에서 필요한 프리뷰 비디오를 얻기 위해 그 자신의 QTCaptureVideoPreviewOutput을 만들고 유지한다.


클래스 그룹 태스크 자주 사용하는 메소드
QTCaptureDevice 장치에 대한 엑세스와 UI 사용가능한 캡처 장치를 나타낸다. inputDevices, open:, isOpen, close, localizedDisplayName
QTCaptureView 장치에 대한 엑세스와 UI 캡처 세션에 대한 비디오 프리뷰를 디스플레이 한다. setCaptureSession: