팟캐스트 모션 그래픽
Motion 5.9에는 AppleScript 사전이나 CLI 렌더러가 없습니다. 여기의 모든 작업은
Motion 파일을 XML(ozml)로 취급하고, 설치된 타이틀 템플릿을 참조하는 Final Cut Pro FCPXML을
만들어 처리합니다. Final Cut이 렌더링을 수행합니다.
도구는 agent-motion/에 있습니다:
| 도구 | 기능 |
|---|---|
motionkit.py inspect FILE [--json] | 레이어 트리, 텍스트 레이어(텍스트/폰트/크기/위치), 초 단위 타이밍, FCP에 게시된 항목, 미디어 참조 |
motionkit.py set-text IN OUT --set "KEY=TEXT" ... | 텍스트 레이어를 다시 작성합니다. KEY = 레이어 id, 레이어 이름 또는 현재 텍스트. 줄 바꿈은 \n. styleRun 길이(UTF-16)를 수정하여 Motion이 오류를 내지 않도록 합니다 |
motionkit.py keyframes FILE [--grep X] [--all] | 모든 애니메이션 파라미터와 키프레임 시간/값 (회전은 라디안) |
motionkit.py preview FILE --at 1.9 3.2 [--open] | 지정된 시간에 복사본을 저장합니다. --open은 백그라운드에서 Motion으로 엽니다(open -g), app_screenshot 용도 |
motionkit.py install FILE --name NAME | 프로젝트를 Motion의 Titles 폴더에 FCP 타이틀 템플릿으로 복사합니다 |
titles_fcpxml.py SPEC.json -o OUT.fcpxml | 큐 목록 → 적절한 시간에 타이틀이 포함되고 텍스트가 채워진 FCPXML 프로젝트 |
쇼의 템플릿
~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/ 아래에 설치됨
(FCP uid 형식: ~/Titles.localized/Templates/<Name>/<Name>.moti). 두 가지 주요 템플릿의 스냅샷이
agent-motion/*.motn에 있습니다.
- TF_Podcast_title: 메인 타이틀 카드, 5초, 29.97fps, 1080p. 텍스트 레이어:
Tiersias Foundation Podcast(화면에는 "Tiresias Foundation Podcast"로 표시됨; 레이어 이름에 오타가 있으므로 그대로 키로 사용) 및Episode 4: Carl Schmitt(에피소드별 줄, Futura Medium). 하나의 Drop Zone을 게시합니다. - Citation v2: 인용문 및 출처용 하단 자막, PT Serif. 텍스트 레이어:
~Author Lastname(기울임꼴; 쇼에서는 접두사~사용),Person Writes Silly Headline to(작품 제목, 두 줄 가능),20 Apr, 1969(날짜),Publication. - Citation v2 no pub: 출처 줄이 없는 동일한 템플릿. Citation v1, Black/Orange/Yellow/PeeTitle, Minister_Types도 있음.
과거 사용 예(Podcast3/4 라이브러리): Timothy Snyder, Carl Schmitt, Xunzi,
~Eric L. Hutton, trans., ~Armando Iannucci, dir., 95 U.S. 602. 번역가와 감독은 역할 접미사를 받습니다.
법원 판례는 저자 슬롯에 들어갑니다.
워크플로우
python3 agent-motion/motionkit.py inspect "<template>.moti"로 텍스트 레이어 키를 가져옵니다.- 큐 JSON을 작성합니다(
agent-motion/examples/ep_demo.json참조):template,at(에피소드 타임라인 기준 초), 선택적duration,texts맵. python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxml, 그런 다음 검증:xmllint --noout --dtdvalid <FCPXMLv1_11.dtd 복사본> titles.fcpxml. DTD는/Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versions/A/Resources/에 있습니다. xmllint가 공백이 포함된 경로에서 실패하므로 먼저 복사하세요.- 적용:
--library <번들> --push추가 (클릭 불필요).--library없이 실행하면 FCP가 라이브러리 선택기를 표시하므로 사용자에게 맡깁니다. 타이틀은 갭 위에 연결되어 실제 편집본에 복사할 수 있습니다.
일회성으로 제작된 카드(예: 썸네일 또는 FCP가 재정의할 수 없는 스타일 변경이 있는 카드)의 경우
.motn 파일에 set-text를 사용하고 사용자가 확인하거나 내보낼 수 있도록 open -g -a Motion OUT.motn을 실행합니다.
FCP 11.0.1에서 확인됨 (2026-10-18)
- 제로 클릭 임포트 작동:
titles_fcpxml.py cues.json -o x.fcpxml --library path/To.fcpbundle --push<import-options>(라이브러리 위치, 에셋 연결, 경고 표시 안 함)를 추가하고open -g로 보냅니다. FCP가 백그라운드에서 임포트하며 라이브러리가 없으면 생성합니다. 테스트는scratch/fcp-test/아래의 임시 라이브러리를 사용하고, 사용자의 실제 라이브러리는 절대 묻지 않고 사용하지 마세요. <text>순서 = Motion 문서의 Text 레이어 순서. 확인 완료: Citation v2의 저자, 제목, 날짜, 출처가 모두 올바른 슬롯에 배치됩니다.- 기본 텍스트 전송 (
--style none사용). 그러면 템플릿이 자체 폰트, 크기, 색상, 그림자를 유지합니다.--style font는 family/face/size와 함께text-style-def를 전송합니다. 스타일 정의는 템플릿을 재정의하며,Size파라미터가 없는 레이어(Motion 기본값 48)는 48 폴백이 추가되기 전에 매우 작게 나왔습니다.--style font는 의도적으로 스타일을 변경할 때만 사용하세요. - 메인 타이틀 카드(TF_Podcast_title)는 애니메이션이 그대로 유지된 상태로 임포트됩니다.
com.apple.FinalCut에서app_screenshot으로 FCP 상태를 읽습니다: 이벤트 클릭, 브라우저에서 프로젝트 아이콘 클릭 (이름을 두 번 클릭하면 이름 바꾸기가 시작되므로 Escape 키 누름), 그런 다음 눈금자.
미리보기 및 렌더링 (2026-10-18 확인)
- 프레임 미리보기:
motionkit.py preview FILE --at T --open실행 후, Motion(번들com.apple.motionapp)에서app_screenshot을 컴퓨터 사용, 캔버스 확대.app_menu File > Close로 창을 닫습니다. 백그라운드에서 Motion의 재생 헤드 필드에 입력해도 재생 헤드가 이동하지 않습니다.<currentFrame>복사본이 신뢰할 수 있는 방법입니다. - 렌더링: 컴퓨터 사용으로 File > Share(Export Movie, Save Current Frame)를 누를 수 없습니다.
사용자에게 Export를 클릭하도록 요청하세요. 셸
screencapture에는 Screen Recording 권한이 없습니다. -g없이open -a를 사용하지 마세요. 사용자는 같은 화면에서 작업 중입니다.
애니메이션 (XML이 노출하는 내용)
키프레임은 모든 파라미터(Transform Position/Rotation/Scale, Blending Opacity, 필터 파라미터) 아래에
curve > keypoint{time, value, in/out tangents} 형태로 있습니다. 비헤이비어(Gather In, Pen Speed/Pressure)는
자체 노드로 타이밍과 Controls 파라미터를 가집니다. 따라서 전체 동작을 읽고, 프로그래밍 방식으로 재타이밍, 오프셋,
키프레임 추가가 가능합니다. 그런 다음 미리보기 및 스크린샷으로 확인합니다.
TF_Podcast_title 동작: Tiresias 피규어(Group 1/2)가 ±400 px에서 1.5초까지 슬라이드 인한 후, 4.87초까지
±10 px / ±2°로 흔들립니다. 뱀 이미지 쌍은 1.74초에 나타나서(scale 0.17→0.62 by 2.1초, 둥근 사각형으로 마스킹)
2.1/3.17/4.14/4.87초의 키프레임 사이에서 움직입니다. 타이틀 줄은 1.5~1.7초에 페이드 인하고 Gather In은 1.0초부터,
에피소드 줄은 2.37초에 Gather In 됩니다.
ozml 참고 사항
- 시간:
"value timescale flags epoch"; 초 = value / timescale. - 텍스트 콘텐츠:
scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text. 스타일링은styleRun style=ID offset length이므로 길이 불일치는 스타일링을 깨뜨립니다. - 최상위 factory는
factoryID→ 종류(Text, Shape, Replicator, Image...)를 매핑합니다. id는 파일마다 다르므로 항상 factory 테이블을 통해 확인하세요. - Apple의 (오래되었지만 대부분 여전히 유효한) 참조: developer.apple.com 아카이브의 Motion XML 가이드.