rodumani

smilish67/rodumani

3.3

If you are the rightful owner of rodumani and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

The Remotion video editing platform utilizes a Model Context Protocol (MCP) server to provide direct editing capabilities.

Remotion ์˜์ƒํŽธ์ง‘ MCP ์„œ๋ฒ„

Remotion ๊ธฐ๋ฐ˜์˜ ์›น ์˜์ƒํŽธ์ง‘ ํ”Œ๋žซํผ์œผ๋กœ, MCP (Model Context Protocol) ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ง์ ‘์ ์ธ ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๋ฏธ๋””์–ด ํŒŒ์ผ ๊ด€๋ฆฌ

  • ํŒŒ์ผ ์—…๋กœ๋“œ: ๋น„๋””์˜ค, ์˜ค๋””์˜ค, ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ง€์›
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœ: ํ•ด์ƒ๋„, ์ง€์†์‹œ๊ฐ„, ํŒŒ์ผํฌ๊ธฐ ๋“ฑ ์ž๋™ ์ถ”์ถœ
  • ์ธ๋„ค์ผ ์ƒ์„ฑ: ๋น„๋””์˜ค ๋ฐ ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ์ธ๋„ค์ผ ์ž๋™ ์ƒ์„ฑ
  • ํŒŒ์ผ ํ˜•์‹ ์ง€์›: MP4, MOV, AVI, MP3, WAV, JPG, PNG ๋“ฑ

2. ํƒ€์ž„๋ผ์ธ ํŽธ์ง‘

  • ๋ฉ€ํ‹ฐํŠธ๋ž™ ์ง€์›: ๋น„๋””์˜ค, ์˜ค๋””์˜ค, ์ž๋ง‰ ํŠธ๋ž™ ๋…๋ฆฝ ๊ด€๋ฆฌ
  • ์ •๋ฐ€ํ•œ ์‹œ๊ฐ„ ์กฐ์ •: ํ”„๋ ˆ์ž„ ๋‹จ์œ„ ํŽธ์ง‘ ๊ฐ€๋Šฅ
  • ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ: ์ง๊ด€์ ์ธ ๋ฏธ๋””์–ด ๋ฐฐ์น˜
  • ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: ํŽธ์ง‘ ์ค‘ ์ฆ‰์‹œ ๊ฒฐ๊ณผ ํ™•์ธ

3. ํŽธ์ง‘ ์ž‘์—…

  • ํŠธ๋ฆผ: ์‹œ์ž‘/๋์  ์กฐ์ •์œผ๋กœ ํด๋ฆฝ ๊ธธ์ด ํŽธ์ง‘
  • ๋ถ„ํ• : ํŠน์ • ์ง€์ ์—์„œ ํด๋ฆฝ์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ
  • ์ด๋™: ํƒ€์ž„๋ผ์ธ ์ƒ์—์„œ ํด๋ฆฝ ์œ„์น˜ ์ด๋™
  • ๊ฒน์นจ ํ•ด๊ฒฐ: ์ž๋™์œผ๋กœ ์ถฉ๋Œํ•˜๋Š” ํด๋ฆฝ ์ •๋ฆฌ
  • ์‹คํ–‰ ์ทจ์†Œ/๋‹ค์‹œ ์‹คํ–‰: ๋ชจ๋“  ํŽธ์ง‘ ์ž‘์—… ๋˜๋Œ๋ฆฌ๊ธฐ ๊ฐ€๋Šฅ

4. ๋ ˆ์ด์•„์›ƒ ๋ฐ ๋ฐฐ์น˜

  • 2D ๋ณ€ํ™˜: ์œ„์น˜, ํฌ๊ธฐ, ํšŒ์ „, ํˆฌ๋ช…๋„ ์กฐ์ •
  • ๋ ˆ์ด์–ด ๊ด€๋ฆฌ: ์—ฌ๋Ÿฌ ๋ฏธ๋””์–ด์˜ ์ธต๋ณ„ ๋ฐฐ์น˜
  • ํ‚คํ”„๋ ˆ์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜: ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์†์„ฑ ๋ณ€ํ™”
  • ํŠธ๋žœ์ง€์…˜ ํšจ๊ณผ: fadeIn, fadeOut, slide ๋“ฑ

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜

ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ

1. MediaFileManager (src/utils/mediaUtils.ts)
// ๋ฏธ๋””์–ด ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๊ด€๋ฆฌ
const mediaManager = new MediaFileManager();
const mediaFile = await mediaManager.uploadFile(file);
2. TimelineManager (src/utils/timelineUtils.ts)
// ํƒ€์ž„๋ผ์ธ ๋ฐ ํŽธ์ง‘ ์ž‘์—… ๊ด€๋ฆฌ
const timeline = new TimelineManager(30); // 30fps
const track = timeline.createTrack('Video Track', 'video');
timeline.addItemToTrack(trackId, mediaItem);
3. MCPVideoEditingServer (src/api/mcpInterface.ts)
// MCP ์„œ๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค
const server = new MCPVideoEditingServer();
const sessionId = server.createSession();
const response = await server.handleRequest(mcpRequest);

MCP API ์—”๋“œํฌ์ธํŠธ

์„ธ์…˜ ๊ด€๋ฆฌ
  • session.create: ์ƒˆ ํŽธ์ง‘ ์„ธ์…˜ ์ƒ์„ฑ
  • session.delete: ์„ธ์…˜ ์‚ญ์ œ
  • session.list: ํ™œ์„ฑ ์„ธ์…˜ ๋ชฉ๋ก
๋ฏธ๋””์–ด ๊ด€๋ฆฌ
  • media.upload: ํŒŒ์ผ ์—…๋กœ๋“œ
  • media.list: ๋ฏธ๋””์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์กฐํšŒ
  • media.delete: ํŒŒ์ผ ์‚ญ์ œ
  • media.get_info: ํŒŒ์ผ ์ •๋ณด ์กฐํšŒ
ํƒ€์ž„๋ผ์ธ ํŽธ์ง‘
  • timeline.create_track: ์ƒˆ ํŠธ๋ž™ ์ƒ์„ฑ
  • timeline.add_item: ๋ฏธ๋””์–ด๋ฅผ ํŠธ๋ž™์— ์ถ”๊ฐ€
  • timeline.move_item: ํด๋ฆฝ ์ด๋™
  • timeline.trim_item: ํด๋ฆฝ ํŠธ๋ฆผ
  • timeline.split_item: ํด๋ฆฝ ๋ถ„ํ• 
  • timeline.get_state: ํ˜„์žฌ ํƒ€์ž„๋ผ์ธ ์ƒํƒœ
ํŽธ์ง‘ ์ž‘์—…
  • edit.undo: ์‹คํ–‰ ์ทจ์†Œ
  • edit.redo: ๋‹ค์‹œ ์‹คํ–‰
  • render.export: ๋น„๋””์˜ค ๋‚ด๋ณด๋‚ด๊ธฐ

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

์„ค์น˜

npm install

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

npm run dev

๋นŒ๋“œ

npm run build

๐Ÿ’ป ์‚ฌ์šฉ ์˜ˆ์‹œ

๊ธฐ๋ณธ ํŽธ์ง‘ ์›Œํฌํ”Œ๋กœ์šฐ

// 1. MCP ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
const client = new MCPClient('http://localhost:3000/mcp');
await client.startSession();

// 2. ๋ฏธ๋””์–ด ํŒŒ์ผ ์—…๋กœ๋“œ
const mediaFile = await client.uploadMedia(fileData, 'video.mp4', 'video/mp4');

// 3. ํŠธ๋ž™ ์ƒ์„ฑ ๋ฐ ๋ฏธ๋””์–ด ์ถ”๊ฐ€
const track = await client.createTrack('Main Video', 'video');
const mediaItem = await client.addToTimeline(track.id, mediaFile.id, 0);

// 4. ํŽธ์ง‘ ์ž‘์—…
await client.trimItem(track.id, mediaItem.id, 30, 180); // 30-180ํ”„๋ ˆ์ž„ ๊ตฌ๊ฐ„๋งŒ ์‚ฌ์šฉ

// 5. ๋‚ด๋ณด๋‚ด๊ธฐ
const exportId = await client.exportVideo('mp4', 'high');

๊ณ ๊ธ‰ ํŽธ์ง‘ ๊ธฐ๋Šฅ

// ํ‚คํ”„๋ ˆ์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜
const keyframeManager = new KeyframeManager();
keyframeManager.addKeyframe(itemId, {
  frame: 0,
  property: 'opacity',
  value: 0,
  easing: 'ease-in'
});
keyframeManager.addKeyframe(itemId, {
  frame: 30,
  property: 'opacity',
  value: 1,
  easing: 'ease-in'
});

// ํ˜„์žฌ ํ”„๋ ˆ์ž„์—์„œ ๊ฐ’ ๊ณ„์‚ฐ
const currentOpacity = keyframeManager.getValue(itemId, 15, 'opacity'); // 0.5

๐ŸŽจ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

MyComposition

๋ฉ”์ธ ๋น„๋””์˜ค ์ปดํฌ์ง€์…˜์œผ๋กœ, ๋ชจ๋“  ๋ฏธ๋””์–ด ์š”์†Œ๋“ค์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

<MyComposition 
  mediaItems={mediaItems}
  timelineControls={timelineControls}
/>

EditorDemo

ํŽธ์ง‘ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ๋ชจ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

<EditorDemo 
  width={1280}
  height={720}
  fps={30}
/>

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/
โ”œโ”€โ”€ Composition.tsx          # ๋ฉ”์ธ ๋น„๋””์˜ค ์ปดํฌ์ง€์…˜
โ”œโ”€โ”€ Root.tsx                 # Remotion ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ utils/
โ”‚   โ”œโ”€โ”€ mediaUtils.ts        # ๋ฏธ๋””์–ด ํŒŒ์ผ ๊ด€๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚   โ””โ”€โ”€ timelineUtils.ts     # ํƒ€์ž„๋ผ์ธ ํŽธ์ง‘ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”œโ”€โ”€ api/
โ”‚   โ””โ”€โ”€ mcpInterface.ts      # MCP ์„œ๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค
โ””โ”€โ”€ demo/
    โ””โ”€โ”€ EditorDemo.tsx       # ํŽธ์ง‘ ๋ฐ๋ชจ ์ปดํฌ๋„ŒํŠธ

๐Ÿ™ Acknowledgments

  • Remotion - React ๊ธฐ๋ฐ˜ ๋น„๋””์˜ค ์ œ์ž‘ ํ”„๋ ˆ์ž„์›Œํฌ
  • Model Context Protocol - AI ์—์ด์ „ํŠธ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ