QuickTime Movie Creation Guide
OSXDEV
목차 |
[편집] Introduction to QuickTime Movie Creation Guide
이 책은 당신의 어플리케이션에서 QuickTime 무비를 생성하는 몇가지 다른 방법을 기술한다.
[편집] Organization of This Document
- "Creating Movies"는 새로운 무비를 만드는 법을 보여준다 - "Sequence Grabber Components"는 시퀀스 그래버 컴포넌츠와 채널 컴포넌츠 그리고 (다이얼로그를 제공하기 위해 사용되는) 패널 컴포넌트에 대한 오버뷰를 제공한다. - "Sequence Grabber Components Functions"는 시퀀스 그래버 컴포넌츠에 의해 제공되는 함수를 묘사한다. - "Sequence Grabber Panel Components" 는 시퀀스 그래버 패널 컴포넌츠가 무엇인지, 그리고 어떻게 사용하는지를 묘사한다. - "Sequence Grabber Channel Components"는 흔히 채널 컴포넌츠로 알려진, 시퀀스 그래버 채널 컴포넌츠를 만드는 방법을 묘사한다. - "Using Sequence Grabber Channel Components"당신의 채널 컴포넌트가 제공되기 위해 필요로 하는 서비스들의 오버뷰를 제공한다. - "Text Channel Components"는 퀵타임 무비에서 사용되기 위한 텍스트를 캡쳐하는 시퀀스 그래버 채널 컴포넌트의 타입을 제공한다. - "About Video Digitizer Components"는 퀵타임 에서의 비디오 디지카이저에 대한 일반적인 정보를 제공한다. - "Creating Video Digitizer Components"는 커스텀 비디오 디지타이저 컴포넌트로부터 어떠한 지원이 요구되는 지를 말해준다. - "Video Digitizer Component API"는 비디오 디지타이저 컴포넌츠를 위한 어플리케이션 프로그래밍 인터페이스를 설명한다.
[편집] See Also
[편집] Sequence Grabber Channel Components
[편집] Using Sequence Grabber Channel Components
[편집] Sequence Grabber Component Functions
[편집] Sequence Grabber Panel Components
[편집] Creating Movies
이 챕터는 퀵타임 무비를 설명하고 QuickTime Movie Toolbox를 사용해 새로운 무비를 만드는 법을 보여준다. 샘플프로그램은 필수적인 단계를 자세히 설명한다.: 무비를 보유하기 위한 파일을 생성하고 열기, 오디오와 비디오를 위한 미디어 구조체를 만들고 크랙하기, 샘플 데이타를 더하기, 파일에 무비 리소스를 더하기. 튜토리얼 형식으로 과정을 보여줄 샘플 프로그램을 보기 위해서 이 섹션을 읽어라.
[편집] Movie Structures
퀵타임 무비는 타임 스케일과 기간으로 정의되어 시간 좌표계에 의해 정의되는 시공간을 가진다. 그림 1-1이 보여준다. 무비는 항상 0에서 시작한다. 타임 스케일은 무비의 시간 값에 대한 측정 값을 정의한다. 기간은 무비가 얼마나 지속될지를 정의한다.
무비는 하나 이상의 트랙을 가질 수 있다. 각 트랙은 무비의 시간 좌표계 내로 번역될 수 있는 미디어 데이터를 참조한다. 각 트랙은 무비의 시작점에서 시작한다. 그러나 트랙은 언제든 끝날 수 있다. 추가로, 트랙안의 실제 데이타는 무비의 시작점으로부터 오프셋 될 수 있다.무비의 시작점과 함께하지 않는 데이타를 지닌 트랙은 그 트랙 데이타 앞에 빈 공간을 가진다. 어떠한 시간 점에서든 , 하나 이상의 트랙들은 사용 가능할 수도, 불가일 수도 있다. 참조: 이 책을 통틀어, 사용가능 트랙 이란 말은 무비 타임이 그 트랙을 간섭했을때 활성화 되는 것을 말한다. 사용가능 트랙은 미디어 데이타를 참조하기 위해 미디어를 참조한다.
그러나, 전체 무비동안에 어떠한 트랙도 사용가능해야 하지는 않다. 무비를 훑어오면서, 각각 사용가능으로된 트랙에 묘사된 데이타로의 엑세스를 얻을 것이다. 그림 1-2는 다섯개의 트랙을 가지는 무비를 보여준다. 각 트랙의 밝은 그림자는 무비의 시작점과 트랙의 데이타의 시작점 사이의 타임 옵셋을 나타낸다 (이 밝은 그림자는 각 트랙의 시작점에서의 빈 공간에 해당한다) 무비의 타임 값이 6이면, 세개의 사용가능 트랙이 있다. 비디오1과 오디오1 그리고 이제 막 사용가능하게 된 비디오 2. 나머지 하나의 트랙은 타임 밸류가 8이 될 때 까지는 사용가능 되지 않는다. 오디오 2 트랙은 타임 밸류 10에서 사용가능된다.
무비는 하나 이상의 레이어를 포함 할 수 있다. 각 레이어는 서로 연결될 수 있는 하나 이상의 트랙을 가진다. 무비 툴박스는 무비의 시각적인 표현을 레이어, 레이어를 쌓아 올려 만들어 낸다. 그림 1-2를 예를 들면, 비디오1과 비디오2가 포함하고 있는 이미지가 부분적으로 겹쳐진다면, 사용자는 전면 레이어에 저장된 이미지만 본다. QuickTime Movie Internal Guide에 설명된 무비 툴박스 함수를 이용해 각각의 트랙을 무비 레이어로 할당할 수 있다.
무비 툴박스는 퀵타임 무비의 무비 프리뷰와 무비 포스터 모두를 정의할 수 있도록 한다. 무비 프리뷰는 짧고 동적으로 무비를 표현하는 것이다. 무비 프리뷰는 전형적으로 3에서 5초 이상가지 않으며, 사용자에서 무비가 담고있는 것에 대한 생각을 줄 수 있어야 한다.(무비 프리뷰의 예는 내러티브 트랙이다). 무비의 프리뷰를 시작점, 기간, 그리고 트랙으로 정의할 수있다. 무비는 프리뷰에만 사용되는 트랙을 가질 수 있다.
무비 포스터는 무비를 나타내는 한장의 시각적 이미지 이다. 무비에서의 시간 점으로 포스터를 지정한다. 무비 그 자체와 무비 프리뷰에서, 무비 포스터에서 어떤 트랙이 사용가능일지를 정의할 수 있다.
그림 1-3은 무비의 트랙에 대한 예를 보여준다. 비디오 트랙은 무비와 프리뷰, 포스터를 위해 사용된다. 무비의 오디오 트랙은 무비를 위해서만 사용된다. 프리뷰 오디오 트랙은 프리뷰를 위해서만 사용된다. 포스터 그래칙 트랙은 포스터를 위해서만 사용된다.
[편집] Tracks
무비는 하나 이상의 트랙을 가질 수 있다. 각각의 트랙은 무비에서의 단일 데이터의 스트림을 나타내며 단일 미디어와 연결되어 있다. 미디어는 실제 무비 데이타로의 참조를 하는 컨트롤 정보를 가진다.
무비의 모든 트랙들은 무비의 시 좌표계를 사용한다. 이것은, 무비의 시간 스케일은 각 무비의 트랙에 대해 기본적인 타임 유니트를 정의한다. 각 트랙은 무비의 시작점에서 시작하지만 트랙의 데이타는 0이 아닌 다른 시간 값에서 시작 할 수 있다. 이 intervaning 시간은 빈 공간으로 나타내어진다. 오디오 트랙에서 빈 공간은 정적으로 변환된다. 비디오 트랙에서 빈 공간은 시각적인 이미지가 없는 것으로 생성된다. 각각의 트랙은 그 자신의 기간을 가진다. 이 기간으 ㄴ무비의 기간과 대응될 필요는 없다. 무비 기간은 항상 모든 트랙의 최대 기간과 일치한다. 그림 1-4에 나와있다. 트랙은 항상 하나의 미디어와 연관되어있다. 미디어는 트랙에 constitute하는 데이타를 참조하는 컨트롤 정보를 포함한다. 트랙은 트랙에서 사용되는 미디어의 부분을 정의하는 레퍼런스의 리스트를 포함한다. 핵심적으로, 레퍼런스들은 미디어의 편집 리스트이다. 결과적으로 트랙은 미디어에서의 데이터를 어떤 순서로든 플레이 할 수 있으며 몇번이든 플레이 할 수 있다. 그림 1-5는 트랙이 어떻게 데이타를 미디어로부터 무비로 매핑하는지를 보여준다.
[편집] Media Structures
미디어는 트랙을 위한 데이터를 묘사한다. 데이타는 실제로 미디어에 저장되어 있지는 않다. 차라리, 미디어는 CD-ROM 디스크나 다른 적당한 저장 장치에 저장된 디스크파일에 저장되어 있는 그 미디어 데이타로의 레퍼런스를 가지고 있다. 하나의 미디어에 의해 참조된 데이타는 미디어 그 자체가 재사용되지 않고도 하나 이상의 무비에 사용될 수 있다.
각각의 미디어는 미디어의 타임 스케일과 기간을 정의하는 그 자신의 시 좌표계를 가진다. 미디어의 시간 좌표계 는 항상 0에서 시작하며, 그 데이타를 사용하는 무비의 시좌표 시스템으로부터 독립적이지 못하다. 트랙은 무비의 시 좌표계로부터 미디어의 시 좌표계로 데이타를 매핑한다. 그림 1-6은 트랙이 이 매핑을 어떻게 수행하는 지를 보여준다.
지원되는 각 데이타 타입은 그 자신의 미디어 핸들러를 가진다. 미디어 핸들러는 미디어의 데이타를 번역한다. 미디어 핸들러는 데이타를 랜덤 엑세스 가능해야 하며 무비에 의해 지정된 비율로 세그먼트를 플레이 한다. 트랙은 미디어가 무비에서 플레이 될 순서를 결정하며 무비 시간 값을 미디어 시간 값으로 매핑한다.
그림 1-6은 데이타의 최종 링크를 보여준다. 그림에서의 미디어는 CD-ROM디스크에 있는 디지탈 비디오 프레임을 참조한다.
[편집] 퀵타임 무비 특징
Movie Characteristics 퀵타임 무비는 개별 데이터 구조체로서 표현된다. 당신의 어플리케이션은 그 데이터 구조체에서 개별 필드와 일할 수 없다. 그 대신, 무비 툴박스는 무비의 캐릭터들과 일할 수 있도록 하는 함수를 제공한다. 그림 1-7은 퀵타임 무비의 캐릭터리스틱들을 보여준다. 모든 퀵타임 무비들은 생성일시와 수정 일시같은 몇개의 고정정보를 가진다. 그 시간들은 표준 매킨토시 시간 포맷으로 표현되며, 1904년 1월1일 자정으로 부터의 시간을 초단위로 표현한다.생성일시는 무비가 만들어진 시간을 나타낸다. 수정 일시는 마지막으로 수정되고 저장된 일시를 나타낸다.
각각의 무비는 그 자신의 시 좌표계와 시간 스케일을 가진다. 무비와 관계된 모든 시간 값은 이 시간 스케일로서 정의되어야 하며 0과 무비 기간 사이의값이어야 한다.
무비의 프리뷰는 시작시간과 기간으로 정의된다. 두 시간 값 모두 무비의 시간 스케일의 언어로 표현된다. 무비의 포스터는 그 시간 값으로 정의된다. 다음 장에서 설명되는 무비 툴박스 함수를 이용해 트랙을 무비 프리뷰와 무비 포스터로 할당한다.
무비에서의 현재 위치는 무비의 현 시각으로 정의된다. 무비가 현재 플레이 중이면, 이 시간 값은 변한다. 무비를 무비 파일로 저장하면, 무비 툴박스는 무비의 현재 시각을 현재 위치를 반영하게끔 업데이트 한다. 무비 파일로부터 무비를 로드하면, 무비 툴박스는 무비의 현 시각을 무비 파일에서 찾을 수 있는 값으로 설정한다.
무비 툴박스는 무비의 현재 선택과 함께 일할 수 있는 고차원의 편집 함수를 제공한다. 현재 선택은 선택시간으로 참조되는 시작 시간으로 정의하고 선택 기간이라 불리는 기간으로 무비의 세그먼트를 정의한다. 그 시간 값들은 무비의 시간 스케일을 사용해 표현된다.
현재 사용되고 있는 각각의 무비에 대해, 무비 툴박스는 액티브 무비 세그먼트를 유지한다. 액티브 무비 세그먼트는 당신의 어플리케이션이 플레잉에 관심을 가지는 무비의 파트이다. 디폴트로, 액티브 무비 세그먼트는 전체 무비로 설정된다. 이 것을 무비의 일부 세그먼트로 변경하고 싶을 수 있다. 예를 들어, 사용자의 선택영역을 반복적으로 플레이 하길 원할 경우 처럼. 액티브 무비 세그먼트를 설정함으로서 무비 툴박스는 무비를 플레이 하는 동안 범위 밖에서는 어떤 샘플도 사용하지 않도록 보장할 수 있다.
무비의 디스플레이 특징들은 엘레먼트의 갯수로 지정된다. 무비는 무비 클리핑 영역과 3-3 변환행렬을 가진다. 무비 툴박스는 그 요소들을 이용해서 무비의 공간적인 특징을 결정한다. 그 요소들의 완벽한 설명과 그것들이 무비 툴박스에서 어떻게 이용되는 지에 대한 설명은 "Spatial Properties"를 참조하라.
무비를 저장할 때, 플래이 백 레이트와 볼륨에 대한 원하는 설정을 만들 수 있다. 원하는 플레이백 레이트를 preferred rate라고 하고 원하는 플레이 백 볼륨을 preferred volume이라 한다. 그 세팅값들은 그 무비의 특징에 있어서 가장 자연스러운 값을 나타낸다. 무비 툴박스가 무비파일로 부터 무비를 읽으면, 무비의 볼륨을 preferred 값으로 설정하고, 무비를 플레이 하면, 무비 툴박스는 preferrd rate를 사용한다. 그 후에는 당신이 무비 툴박스 함수를 이용해 플레이 하는 중에 볼륨과 rate를 변경할 수 있다.
무비 툴박스는 당신의 어플리케이션이 그 자신의 데이타를 무비와 함께 저장할 수 있도록 한다. 그 데이타 오브젝트들의 포맷과 내용을 정의한다. 이 어플리케이션-특화된 데이타를 user data라 부른다. 그 데이타 오브젝트들을 텍스트와 바이너리를 저장하는 데 사용할 수 있다. 예를 들어, 텍스트 유저 데이타 아이템을 무비의 저작권과 크레딧 정보를 위해 사용할 수 있다. 무비 툴박스는 무비의 유저 데이타를 설정하고 불러오도록 하는 함수들을 제공한다. 이 데이타는 무비를 저장할 때 무비와 함께 저장된다.
Track Characteristics QuickTime 트랙은 사적인 데이타 구조로서 나타내어진다. 당신의 어플리케이션은 그 데이타 구조체의 개별 필드와 함께 작동할 수 없다. 그것보다, 무비 툴박스가 트랙의 특성과 함께 작동할수 있도록 해주는 함수를 제공한다. 그림 1-8은 QuickTime 트랙의 특성을 보여준다.
무비에 있어서, 각 트랙은 생성일시와 수정일시와 같은 몇개의 상태정보를 가진다. 그 시간들은 표준 매킨토시 시간 포맷으로 표현되며, 1904년 1월1일 자정부터의 시간을 초 단위로 나타낸다. 생성일시는 그 트랙이 만들어진 때를 가르킨다. 수정 일시는 그 트랙이 마지막 수정되고 저장된 때를 가르킨다.
각 트랙은 그 트랙이 포함하고 있는 무비의 타임 스케일로 표현되는 그 자신의 기간 값을 가진다.
논의된대로, 무비는 하나 이상의 트랙을 가질 수 있다. 사실, 무비는 주어진 타입에서 하나 이상의 트랙을 포함할 수 있다. 각각 다른 언어로 된 몇개의 사운드 트랙을 가진 무비를 만들고 사용자의 모국어에 해당하는 사운드 트랙을 활성화하고 싶을 수 있다. 당신의 어플리케이션은 alternate group이라는 타입을 각각의 트랙에 할당함으로서 그러한 트랙의 집합을 관리할 수 있다. 어떠한 때라도 그룹 내에서 하나의 트랙만을 선택할 수 있다. 얼터너티브 그룹에서 언어 혹은 playback quality에 기초하여 트랙을 선택할 수 있다. 트랙의 재생 퀄리티는 주어진 환경에서 재생하기 적당한 트랙의 재생 품질을 가르킨다. 얼터너티브 그룹 내의 모든 트랙들은 같은 타입의 데이타를 참조해야 한다.
트랙의 디스플레이 특징들은 트랙 너비, 트랙 높이, 변환 행렬 그리고 클리핑 영역들 몇개의 요소로 지정된다. 각 요소들에 대한 자세한 설명과 그것들이 무비 툴박스에서 어떻게 사용되는지에 대해서는 "Spatial Properties"를 보라.
각각의 트랙은 현재 볼륨 세팅을 가진다. 이 값은 무비 볼륨에 상대적으로 그 트랙을 크게 플레이 할 것인지를 제어한다.
각각의 트랙은 미디어 편집 리스트를 포함한다. 그 편집 리스트는 트랙의 미디어가 그 트랙을 포함하는 무비에서 어떻게 사용될지를 정의하는 엔트리들을 가진다. 에딧 리스트에서 각각의 엔트리는 미디어 세그먼트의 시작 시각과 기간을 재생 rate와 함께 나타낸다.
무비 툴박스는 당신의 어플리케이션으로 하여금 사용자 고유의 데이타와 트랙을 함께 저장할 수 있도록 한다. 그 데이타 오브젝트들의 포맷과 컨텐트은 당신이 정의해야 한다. 무비 툴박스는 트랙의 유저 데이타를 설정하고 불러낼 수 있게 해주는 함수를 제공한다. 이 데이타는 무비를 저장할 때 함께 저장된다.
Media Characteristics 무비와 트랙의 경우에서, QuickTime 미디어는 개별적인 데이타 구조체로 나타내어진다. 당신의 어플리케이션은 그 데이타 구조체의 개별 필드로 함께 작업할 수 없다. 그대신 무비툴박스는 미디어의 특징들을 통해 작업 할수 있는 함수들을 제공한다. 그림 1-9는 QuickTime 미디어의 특징들을 보여준다.
각각의 QuickTime미디어는 생성일시와 수정일시와 같은 몇개의 상태정보를 가진다. 그 시간들은 표준 매킨토시 시간 포맷으로 표현되며, 1904년 1월1일 자정부터의 시간을 초 단위로 나타낸다. 생성일시는 그 트랙이 만들어진 때를 가르킨다. 수정 일시는 그 트랙이 마지막 수정되고 저장된 때를 가르킨다.
각각의 미디어는 타임 스케일과 기간으로 정의되는 고유의 시좌표계가 있다. 미디어와 관련된 모든 시간 값들은 이 타임 스케일에 근거해서 정의되어야하며 0에서 미디어의 기간 이내에 있어야 한다.
미디어는 그 언어와 재생 퀄리티를 정의하는 정보를 포함한다. 그 값들은 얼터너티브 그룹에서 실제로 나타낼 하나의 트랙을 선택하는 데 사용된다.
미디어는 로딩과 저장, 그리고 미디어 데이타를 플레이 하는 책임을 지는 미디어 핸들러를 지정한다. 미디어 핸들러는 미디어에 상태 정보를 저장할 수 있다. 이 정보는 media information으로 참조된다. 미디어 정보는 미디어의 데이타가 어디로 저장될 지와 그 데이터를 어떻게 번역할지를 지정한다. 전형적으로, 이 데이타는 데이타를 포함하는 파일과 그 파일에 저장된 데이타의 타입을 정의하는 data reference에 저장된다.
무비 툴박스는 당신의 어플리케이션이 고유의 유저 데이타를 미디어와 함께 저장 할 수 있도록 한다.
Spatial Properties 시각적인 데이타를 가진 무비를 재생할 때, 무비 툴박스는 적당한 트랙과 미디어 구조체로부터 무비의 데이터를 긁어모아, 그 데이타를 알맞게 변환하고 그 결과를 윈도우로 표시한다. 무비 툴박스는 다음과 같은 트랙들만 사용한다. - 비어있지 않은 - 지정된 시각에 데이터를 참조하는 미디어 구조체를 가진 - 현재 무비 모드(표준 재생, 포스터 모드, 프리뷰 모드)에서 활성화된
결과적으로, 그 수많은 영역들의 사이즈, 모양 그리고 위치는 무비 재생중 변경될 수 있다. 이 프로세스는 매우 복잡하고 몇회의 클리핑과 리사이징이 연관된다.
무비툴박스는 디스플레이 좌표계에서 지정도니 위치에 무비 박스를 위치시키는 두개의 고차원적인 함수, GetMovieBox와 SetMovieBox를 제공함으로서 이 복잡한 절차로부터 당신을 보호한다. 이 함수들을 사용할 때, 무비 툴박스는 자동적으로 무비의 매트릭스를 당신의 요청에 맞게 조정한다.
그림 1-10은 시각적인 데이타를 수집하고, 변형하고, 표시하는 전체 과정의 오버뷰를 보여준다. 각 트랙은 차후에 무비의 공간적 특징의 컨텍스트 안으로 번역되어질 그 자신의 공간적 특징을 정의한다.
이 섹션은 무비 툴박스가 무비를 디스플레이 하기 위해 사용하는 프로세스를 설명한다. 프로세스는 무비 데이타로 시작해서 최종 무비 디스플레이로 끝난다. 이 섹션에서 설명되는 용어들은 다음을 포함한다.
- 트랙 사각형의 생성 (그림 1-11) - 트랙 이미지의 클리핑 (그림 1-12) - 트랙을 무비 좌표계로 변환하기 (그림 1-13) - 무비 이미지를 클리핑 (그림 1-14) - 무비를 디스플레이 좌표계로 변환 (그림 1-15) - 최종 디스플레이를 위해 무비를 클리핑 (그림 1-16)
Note:이 책에서, 시 좌표계는 QuickTime의 시간 기반 시스템을 의미하고 다른 모든 좌표계는 그래픽 좌표를 의미한다.
각 트랙은 그 미디어가 디스플레이 되는 사각형을 정의한다. 이 사각형은 track rectangle로 참조되며, 트랙에 할당된 트랙 너비와 트랙 높이 값으로 정의된다. 이 사각형의 좌상단 모서리는 트랙의 좌표계의 원점을 정의한다.
트랙의 미디어와 연결된 미디어 핸들러는 이미지를 이 사각형안에 디스플레이 할 책임이 있다. 이 과정은 그림 1-11에 나타난다.
그런 다음 무비 툴박스는 트랙 사각형 안의 이미지를 트랙 매트와 트랙 클리핑 영역을 적용함으로서 매트한다. 이것은 이미지의 형태에는 아무런 영향을 미치지 않는 다. 디스플레이에만 영향을 미친다. 트랙 매트와 트랙 클리핑 영역은 부가적인 것이다.
track matte는 이미지 믹싱을 위한 매카니즘을 제공한다. 매트는 픽셀당 몇 비트씩을 가지고 있으며 트랙의 좌표계에 정의되어 있다.매트는 트랙 사각형 내의 이미지에 대해 딥-마스크 동작을 위해 사용될 수 있다. 무비 툴박스는 트랙과 매트에서의 해당 픽셀값을 기반한 평균값을 디스플레이 한다.
track clipping region은 유지할 트랙 사각형 부분을 정의한 QuickDraw영역이다. 트랙 클리핑 영역은 트랙의 좌표계에서 정의된다. 클리핑 동작은 트랙 사각형과 트랙 클리핑 영역의 중첩인 track boundary region을 만들어 낸다.
이 프로세스와 그 결과는 그림 1-12에 보여진다.
트랙의 이미지를 클리핑하고 매핑한 후, 무비 툴박스는 결과 이미지를 무비의 좌표계로 변환한다. 무비 툴박스는 3-3 변환행렬을 이용해 이 동작을 실행한다.(무비 툴박스의 행렬에 대한 논의는 "The Transformation Matrix" 를 보라)트랙 경계 영역내의 이미지는 트랙의 행렬에 의해 무비 좌표계로 변환된다. 결과 영역은 track movie boundary region에 의해 둘러싸인다.
그림 1-13은 이 변환 동작의 결과를 보여준다.
무비 툴박스는 이 부분의 프로세스를 무비의 각 트랙마다 수행한다. 모든 무비의 트랙이 처리되었으면, 무비 툴박스는 디스플레이를 위한 완전한 무비 이미지를 변환하기 위한 단계로 넘어간다.
무비를 위한 모든 트랙 무비의 경계 영역의 결합은 무비의 movie boundary region을 정의한다. 무비 툴박스는 무비의 트랙을 레이어가 적용된 이 하나의 영역으로 결합한다. 그러므로, 백 레이어에 있는 트랙들은 부분적으로 혹은 전체적으로 앞의 레이어에 의해 가려진다. 무비 툴박스는 이 영역을 잘라내어 clipped movie boundary region을 얻는다. 무비의 무비 클리핑영역은 사용될 무비 경계 영역의 부분을 정의한다. 그림 1-14는 무비가 클립되는 프로세스와 클립된 무비 경계 영역 결과를 보여준다.
무비의 이미지를 클립핑 한 후, 무비 툴박스는 결과 이미지를 디스플레이 좌표계로 변환한다. 무비 툴박스는 3-3 변환행렬을 사용해 이 동작을 실행한다.(무비 툴박스에서의 행렬 연산에 대한 완전한 설명은 "The Transformation Matrix"를 보라) 클립된 무비 경계 영역 내의 이미지는 무비의 행렬로부터 디스플레이 좌표계로 변환된다. 결과영역은 무비 디스플레이 경계 영역으로 경계지어진다. 그림 1-15는 이 단계의 결과를 보여준다.
그림 1-16에서 보이는 것 처럼, 무비 디스플레이 경계영역을 둘러싼 사각형을 movie box라 한다. 무비의 무비 박스의 위치를 무비의 변환행렬을 수정함으로서 조정할 수 있다.
무비가 display coordinate system(즉, 퀵 드로우 그래픽 월드)에 있는 이상, Movie Toolbox는 디스플레이 되는 이미지를 생성하기 위한 최종 클리칭 동작을 실행한다. 무비가 디스플레이 되면, 무비툴박스는 그래픽스 포트의 클리핑 영역을 무시한다; 이는 무비 디스플레이 클리핑 영역이 존자해는 이유이다. 그림 1-16이 이 동작을 보여준다.
The Transfomation Matrix 무비 툴박스는 디스플레이 될 때 무비에 적용될 그래픽적인 동작을 정의하기 위해 변환 행렬들을 광범위하게 사용한다. transformation matrix는 하나의 점을 하나의 좌표공간에서 다른 좌표공간으로 매핑하는 법을 정의한다. 변환 매트릭스의 컨텐츠를 수정함으로서, 이동, 회전, 스케일링 같은 몇가지 표준 그래픽 디스플레이 동작을 실행할 수 있다. 무비 툴박스는 이동 행렬들을 손 쉽게 곱할 수 있는 함수 세트를 제공한다. 그들 함수들은 QuickTime Movie Internals Guide에 논의되어 있다. 이 섹션의 나머지 부분은 그래픽적인 환경에서의 행렬 동작에 대한 소개이다.
행렬은 3-3행렬로써 수학적으로 묘사되는 2차원 변환을 실행하기 위해서 사용된다. 그림 1-17은 3-3행렬의 샘플을 보여준다. QuickTime은 행렬 요소 u와 v는 항상 0.0으로, w는 항상 1.0으로 가정한다는 것을 명심하라.
디스플레이 동작중에, 3-3행렬의 컨텐트는 다음과 같은 등식을 이용해서 (x,y)점을 (x', y')로 변환한다. x' = ax + cy + t(x) y' = bx + dy + t(y) 예를 들어, 그림 1-18의 매트릭스는 아무런 변환을 하지 않는다. 이것은 identity matrix로서 참조된다.
앞에서 논의 되었던 등식을 사용하면, 이 매트릭스가 이전의 점 (x,y)와 동일한 새 점 (x', y')를 만들어 낼 것이라는 것을 볼 수 있다.
x' = 1x + 0y + 0 y' = 0x + 1y + 0 x' = x이고 y' = y
이미지를 지정된 디스플레이스먼트로 움직이기 위해서, 이동 오퍼레이션을 실행해야 한다. 이 동작은 각 포인트에 대해 지정된 만큼 x와 y 좌표를 수정한다. 그림 1-19의 행렬은 이동 동작을 나타낸다.
스케일 동작을 실행함으로서 이미지를 늘리거나 줄일 수 있다. 이 동작은 일정 팩터로 x와 y좌표를 수정한다. x와 y 팩터의 크고 작음은 새로운 이미지가 원 이미지보다 클 것인지 작을 것인지를 통제한다. 추가로, x 팩터를 음수로 하면, 이미지를 x축을 기준으로 뒤집을 수 있고; 유사하게 y 팩터를 음수로 해서 이미지를 수평으로 뒤집을 수 있다. 그림 1-20의 행렬은 스케일링 동작을 보여준다.
마지막으로, 회전 동작을 실행함으로서 지정한 각도로 이미지를 회전할 수 있다. x와 y의 팩터를 설정하여 회전의 크고작음과 방향을 설정할 수 있다. 그림 1-21 행렬은 각 쎄타만큼 반 시계 방향으로의 회전을 나타낸다.
다른 변환을 나타내는 행렬들을 결합해서 하나의 행렬로 만들 수 있다. 결과로 나오는 행렬은 두개 행렬 모두의 속성을 유지한다. 예를 들어, 그림 1-22에서처럼 이미지의 스케일링과 이동을 함께 하는 행렬을 만들 수 있다.
두개의 행렬을 이어붙임으로서 결합할 수 있다. 수학적으로, 두개의 행렬은 매트릭스의 곱셈으로 결합될 수 있다. 당신이 행렬을 이어붙인 순서가 중요하다는 것을 명심하라; 행렬 오퍼레이션은 치환될 수 없다.
변환 행렬들은 다음과 같은 데이타 타입을 포함하고 무비툴박스에서 사용된다.
[0] [0] Fixed [1] [0] Fixed [2] [0] Fract [0] [1] Fixed [1] [1] Fixed [2] [1] Fract [0] [2] Fixed [1] [2] Fixed [2] [2] Fract
테이블내 각각의 셀들 3-3 행렬에서 해당 요소의 데이타 타입을 나타낸다. 행렬의 첫 두개 컬럼의 모든 요소들은 Fixed 값으로 나타내어진다. 세번째 컬럼은 Fract 값으로 나타내어진다. Fract 데이타 타입은 2개의 인테저 비트와 30개의 분수값 비트를 가지는 32비트의, 고정 소숫점 값이다. 이러한 데이타 타입은 -2와 2사이의 값을 정확하게 나타낼 때 유용하다.
Audio Properties
Sample Programs
무비를 만드는 것은 몇 단계를 거쳐야 한다. 먼저 무비를 포함 할 무비파일을 생성하고 열어야 한다. 그 후 무비를 위한 트랙과 미디어 구조체를 만든다. 그런다음 미디어 구조체에 샘플들을 더한다. 마지막으로, 무비파일에 무비 리소스를 더한다. 이 섹션에서의 샘플 프로그램 CreateWayCoolMovie는 이 과정을 보여준다.
이 프로그램은 몇개의 세그먼트로 나뉘어져 있다. 메인 세그먼트인 CreateMyCoolMovieMovie 툴박스가 무비파일을 만들고 오픈하면, 다른 함수들을 발생시켜 무비 그 자체를 만든다. 데이타가 무비로 더해지면, 이 함수는 무비파일로 무비를 저장하고 파일을 닫는다.
CreateMyCoolMovie 함수는 CreateMyVideoTrack과 CreateMySoundTrack 함수를 이용해 무비의 트랙들을 만든다. CreateMyVideoTrack함수는 트랙과 트랙의 데이타를 가지는 미디어를 만든다. 그 후 AddVideoSamplesToMedia 함수를 호출해 미디어 안의 샘플 데이타를 모은다. 이 함수는 ImageCompressionManager를 이용한다는 것을 명심하라. CreateMySoundTrack 함수는 사운드 트랙과 사운드를 포함하는 미디어를 만든다. 그 후 AddSoundSamplesToMedia함수를 호출하여 샘플 데이타를 모은다.
Main Function CreateWayCoolMovie 프로그램은 몇개의 세그먼트로 구성되어 있으며, 많은 부분은 이 샘플에 포함되어 있지 않다. 생략된 세그먼트들은 일반적인 초기화 로직과 다른 보편적인 매킨토시 프로그래밍의 면모를 가진다. 보기 1-1의 메인 함수는 무비툴박스의 다양한 파트를 어떻게 초기화 하는 지와 EnterMovies 함수를 호출하는 법을 보여준다.
Listing 5-1
#include <Types.h>
#include <Traps.h>
#include <Menus.h>
#include
#include <Memory.h>
#include <Errors.h>
#include <Fonts.h>
#include <QuickDraw.h>
#include <Resources.h>
#include <GestaltEqu.h>
#include <FixMath.h>
#include <Sound.h>
#include <string.h>
#include "Movies.h"
#include "ImageCompression.h"
void CheckError(OSErr error, Str255 displayString)
{
if (error == noErr) return;
if (displayString[0] > 0)
DebugStr(displayString);
ExitToShell();
}
void InitMovieToolbox (void)
{
OSErr err;
InitGraf (&qd.thePort);
InitFonts ();
InitWindows ();
InitMenus ();
TEInit ();
InitDialogs (nil);
err = EnterMovies ();
CheckError (err, "\pEnterMovies" );
}
void main( void )
{
InitMovieToolbox ();
CreateMyCoolMovie ();
}
Creating and Opening a Movie File 보기 1-2의 CreateMyCoolMovie 함수는 이 프로그램의 주 로직을 가진다. 이 함수는 새로운 무비를 위한 무비파일을 생성하고 연다. 그 후 무비 데이타를 위한 데이타 레퍼런스를 세운다(만일 무비의 데이타가 무비 그 자체와 같은 파일에 저장되어 있다면, 데이타 레퍼런스를 만들어야 할 필요는 없다; 데이타 레퍼런스를 0으로 설정하라). 그 후 이 함수는 두개의 다른 함수 CreateMuVideoTrack과 CreateMySoundTrack을 호출하여 새 무비의 트랙을 만든다. 트랙이 생성되면, CreateMyCoolMovie는 무비 파일에 새로운 리소스를 더하고 무비 파일을 닫는다.
Listing 5-2
#define kMyCreatorType 'TVOD' /* Sample Player's creator type, the
movie player of choice. You can
also use your own creator type. */
#define kPrompt "\pEnter movie file name"
void CreateMyCoolMovie (void)
{
Point where = {100,100};
SFReply theSFReply;
Movie theMovie = nil;
FSSpec mySpec;
short resRefNum = 0;
short resId = 0;
OSErr err = noErr;
SFPutFile (where, "\pEnter movie file name",
"\pMovie File", nil, &theSFReply);
if (!theSFReply.good) return;
FSMakeFSSpec(theSFReply.vRefNum, 0,
theSFReply.fName, &mySpec);
err = CreateMovieFile (&mySpec,
'TVOD',
smCurrentScript,
createMovieFileDeleteCurFile,
&resRefNum,
&theMovie );
CheckError(err, "\pCreateMovieFile");
CreateMyVideoTrack (theMovie);
CreateMySoundTrack (theMovie);
err = AddMovieResource (theMovie, resRefNum, &resId,
theSFReply.fName);
CheckError(err, "\pAddMovieResource");
if (resRefNum) CloseMovieFile (resRefNum);
DisposeMovie (theMovie);
}
위에서 보여진 코드에서는 자신이 만든 파일의 리소스 포크에 무비를 더한다. 리소스 포크없이 무비 파일을 만드는 것과 파일의 데이타 포크에 무비를 저장하는 것이 가능하다.
리소스 포크없이 무비 파일을 만드려면 CreateMovieFile을 호출할 때 createMovieFileDontCreateResFile 플래그를 넘겨라. 파일의 데이타 포크에 무비를 저장하기 위해서는 보여진 대로 resRefNum 매개변수로 kResFileNotOpened를 , ResID 매개변수로 movieInDataForkResID를 넘기며 AddMovieResource를 호출한다.
Creating a Video Track in a New Movie 보기 1-3의 CreateMyVideoTrack 함수는 새 무비에 비디오 트랙을 만든다. 이 함수는 트랙과 그 미디어를 각각 NewMovieTrack과 NewTrackMedia 함수를 호출함으로서 만든다. 그 후 이 함수는 미디어-편집 세션을 형성하고 무비의 데이타를 미디어로 더한다. 이 작업의 대부분은 AddVideoSamplesToMedia 서브루틴을 통해 이루어진다. 데이타가 미디어에 더해지면, 이 함수는 무비툴박스의 InsertMediaIntoTrack 함수를 호출해 미디어를 트랙에 더한다.
Listing 5-3.
#define kVideoTimeScale 600
#define kTrackStart 0
#define kMediaStart 0
#define kFix1 0x00010000
void CreateMyVideoTrack (Movie theMovie)
{
Track theTrack;
Media theMedia;
OSErr err = noErr;
Rect trackFrame = {0,0,100,320};
theTrack = NewMovieTrack (theMovie,
FixRatio(trackFrame.right,1),
FixRatio(trackFrame.bottom,1),
kNoVolume);
CheckError( GetMoviesError(), "\pNewMovieTrack" );
theMedia = NewTrackMedia (theTrack, VideoMediaType,
600, // Video Time Scale
nil, 0);
CheckError( GetMoviesError(), "\pNewTrackMedia" );
err = BeginMediaEdits (theMedia);
CheckError( err, "\pBeginMediaEdits" );
AddVideoSamplesToMedia (theMedia, &trackFrame);
err = EndMediaEdits (theMedia);
CheckError( err, "\pEndMediaEdits" );
err = InsertMediaIntoTrack (theTrack, 0, /* track start time */
0, /* media start time */
GetMediaDuration (theMedia),
kFix1);
CheckError( err, "\pInsertMediaIntoTrack" );
}
Adding Video Samples to a Media
보기 1-4의 AddVideoSamplesToMedia 함수는 비디오 데이타 프레임들을 만들고, 각 프레임을 압축하며, 그 프레임들을 미디어에 더한다. 이 함수는 DrawAFrame 함수를 호출하여 자신의 비디오 데이타를 만든다. 이 함수가 시간적으로 이미지 시퀀스를 압축하는 것이 아니라 각 프레임 개별적으로 공간적인 압축만을 한다는 것을 알아두길 바란다.
Listing 5-4.
#define kSampleDuration 240
/* video frames last 240 * 1/600th of a second */
#define kNumVideoFrames 29
#define kNoOffset 0
#define kMgrChoose 0
#define kSyncSample 0
#define kAddOneVideoSample 1
#define kPixelDepth 16
void AddVideoSamplesToMedia (Media theMedia,
const Rect *trackFrame)
{
long maxCompressedSize;
GWorldPtr theGWorld = nil;
long curSample;
Handle compressedData = nil;
Ptr compressedDataPtr;
ImageDescriptionHandle imageDesc = nil;
CGrafPtr oldPort;
GDHandle oldGDeviceH;
OSErr err = noErr;
err = NewGWorld (&theGWorld,
16, /* pixel depth */
trackFrame,
nil,
nil,
(GWorldFlags) 0 );
CheckError (err, "\pNewGWorld");
LockPixels (theGWorld->portPixMap);
err = GetMaxCompressionSize (theGWorld->portPixMap,
trackFrame,
0, /* let ICM choose depth */
codecNormalQuality,
'rle ',
(CompressorComponent) anyCodec,
&maxCompressedSize);
CheckError (err, "\pGetMaxCompressionSize" );
compressedData = NewHandle(maxCompressedSize);
CheckError( MemError(), "\pNewHandle" );
MoveHHi( compressedData );
HLock( compressedData );
compressedDataPtr = StripAddress( *compressedData );
imageDesc = (ImageDescriptionHandle)NewHandle(4);
CheckError( MemError(), "\pNewHandle" );
GetGWorld (&oldPort, &oldGDeviceH);
SetGWorld (theGWorld, nil);
for (curSample = 1; curSample < 30; curSample++)
{
EraseRect (trackFrame);
DrawFrame(trackFrame, curSample);
err = CompressImage (theGWorld->portPixMap,
trackFrame,
codecNormalQuality,
'rle ',
imageDesc,
compressedDataPtr );
CheckError( err, "\pCompressImage" );
err = AddMediaSample(theMedia,
compressedData,
0, /* no offset in data */
(**imageDesc).dataSize,
60, /* frame duration = 1/10 sec */
(SampleDescriptionHandle)imageDesc,
1, /* one sample */
0, /* self-contained samples */
nil);
CheckError( err, "\pAddMediaSample" );
}
SetGWorld (oldPort, oldGDeviceH);
if (imageDesc) DisposeHandle ((Handle)imageDesc);
if (compressedData) DisposeHandle (compressedData);
if (theGWorld) DisposeGWorld (theGWorld);
}
Creating Video Data for a Movie 보기 1-5의 DrawAFrame 함수는 이 무비를 위한 비디오 데이타를 만든다. 이 함수는 발생될 때마다 매개변수로 넘겨지는 샘플 숫자에 기반해 다른 프레임들을 그려낸다.
Listing 1-5.
void DrawFrame (const Rect *trackFrame, long curSample)
{
Str255 numStr;
ForeColor( redColor );
PaintRect( trackFrame );
ForeColor( blueColor );
NumToString (curSample, numStr);
MoveTo ( trackFrame->right / 2, trackFrame->bottom / 2);
TextSize ( trackFrame->bottom / 3);
DrawString (numStr);
}
Creating a Sound Track 일단 생략
Creating a Sound Description Structure 일단 생략
Parsing a Sound Resource 일단 생략




