ããŒãã¬ãŒã ã·ã¹ãã ãšééãããªãšã¯ã¹ããŒãæ©èœãåããWebããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ãšãã£ã¿ãŒ
ã¯ãªãšã€ãã£ãããŒã«ããŒã ã¯ããã¶ã€ããŒãè€æ°ã®ãªããžã§ã¯ãã䜿çšããŠã¹ã ãŒãºãªããŒãã¬ãŒã é§ååã¢ãã¡ãŒã·ã§ã³ãäœæããå®å šãªã¢ã«ãã¡ãã£ãã«ééæ§ãæã€ãããªãšããŠãšã¯ã¹ããŒãã§ãããã©ãŠã¶ããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ãšãã£ã¿ãŒãå¿ èŠãšããŠããŸãããããã«ãããä»ã®ãããªã³ã³ãã³ããžã®ã·ãŒã ã¬ã¹ãªãªãŒããŒã¬ã€ãå¯èœã«ãªããŸãã
ãããžã§ã¯ããçžè«ãã
課é¡
ãããªå¶äœã®ããã®éæãªèæ¯ãæã€ã¢ãã¡ãŒã·ã§ã³ã¢ã»ããã®äœæã¯ãé¢åãªãã®ã§ããã
- ãã¹ã¯ãããå°çšããŒã« â æ¢åã®ã¢ãã¡ãŒã·ã§ã³ããŒã« (After Effects, Motion) ã¯é«äŸ¡ãªã©ã€ã»ã³ã¹ãšãã¹ã¯ããããžã®ã€ã³ã¹ããŒã«ãå¿ èŠã§ãã
- ã¢ã«ãã¡ãã£ãã«ãšã¯ã¹ããŒãã®æ¬ åŠ â ã»ãšãã©ã®WebããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ããŒã«ã¯ãééæ§ããµããŒãããªãäžéæãªãããªããšã¯ã¹ããŒãããŠããŸãã
- è€éãªããŒãã¬ãŒãã³ã° â ãã¶ã€ããŒã¯CSSãã©ã³ãžã·ã§ã³ã ãã§ãªããã€ãŒãžã³ã°å¶åŸ¡ãåããçŽæçãªããŒãã¬ãŒã ããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ãå¿ èŠãšããŠããŸãã
- ãªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒ â ãšãã£ã¿ãŒã¯ãšã¯ã¹ããŒãåã«ã¢ãã¡ãŒã·ã§ã³ãã¹ã ãŒãºã«åçãããããšã確èªããå¿ èŠããããŸãã
- è€æ°ã®ãªããžã§ã¯ãã¿ã€ã â ã¢ãã¡ãŒã·ã§ã³ã«ã¯ãç¬ç«ããã¢ãã¡ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ãæã€å³åœ¢ãšããã¹ããå¿ èŠã§ãã
- ãšã¯ã¹ããŒãå質 â åºåã¯ããã®ç·šéã¯ãŒã¯ãããŒã§äœ¿çšã§ãããããã¯ã·ã§ã³å質ã®ãããªãã¡ã€ã«ã§ããå¿ èŠããããŸãã
ç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³
åœç€Ÿã¯ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¬ã³ããªã³ã°ã®ããã« React ãš Pixi.js ã䜿çšãã30以äžã®ã€ãŒãžã³ã°é¢æ°ãåããããŒãã¬ãŒã ãšã³ãžã³ããããŠå®å šãª VP9 ã¢ã«ãã¡ãã£ãã«ãµããŒãä»ã WebM ãããªãšã¯ã¹ããŒãã®ããã® FFmpeg ãå©çšããããã¯ãšã³ããåããWebããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ãšãã£ã¿ãŒãæ§ç¯ããŸããã
ã¢ãŒããã¯ãã£
- ããã³ããšã³ã: TypeScript ã䜿çšãã ReactãWebGL ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãã£ã³ãã¹ã¬ã³ããªã³ã°ã®ããã® Pixi.js
- ç¶æ 管ç: äžå åãããã·ãŒã³ã®ç¶æ ã®ããã® Zustand
- ã¢ãã¡ãŒã·ã§ã³ãšã³ãžã³: ã€ãŒãžã³ã°ã©ã€ãã©ãªãåããã«ã¹ã¿ã ããŒãã¬ãŒã è£éãšã³ãžã³
- ããã¯ãšã³ã: ãªã¢ã«ã¿ã€ã ãã¬ãŒã ã¹ããªãŒãã³ã°ã®ããã® WebSocket ãµããŒããåãã Express.js
- ãããªãšã³ã³ãŒãã£ã³ã°: ã¢ã«ãã¡ãã£ãã«ä»ã VP9 WebM ãšã³ã³ãŒãã£ã³ã°ã®ããã® FFmpeg (fluent-ffmpeg çµç±)
- ã¢ãã¬ã: ããã³ããšã³ããšããã¯ãšã³ãéã§ TypeScript ã®åãå ±æãã pnpm workspace
ã¢ãã¡ãŒã·ã§ã³ãšã³ãžã³
ããŒãã¬ãŒã ã·ã¹ãã
ã³ã¢ã¢ãã¡ãŒã·ã§ã³ãšã³ãžã³ã¯ãè€æ°ã®ããããã£ã«ãããããŒãã¬ãŒã ããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ããµããŒãããŠããŸãã
- äœçœ® â ç§»åãã¹ã®ããã®X/Y座æš
- å転 â 床æ°ããŒã¹ã®å転ã¢ãã¡ãŒã·ã§ã³
- è² â æ»ãããªãã©ã³ãžã·ã§ã³ã䌎ã16é²ã«ã©ãŒè£é
- ã¢ã«ãã¡ â ãã§ãŒã广ã®ããã®äžéæåºŠã¢ãã¡ãŒã·ã§ã³
- ãµã€ãº â å¹ ãé«ããååŸã®ã¹ã±ãŒãªã³ã°
åããŒãã¬ãŒã ã¯ãæé (ããªç§åäœ)ãã¢ãã¡ãŒã·ã§ã³ããããã£ã®ãµãã»ãããããã³éžæãããã€ãŒãžã³ã°é¢æ°ãä¿åããŸãããšã³ãžã³ã¯ãä»»æã®æç¹ã«ãããŠåšå²ã®ããŒãã¬ãŒã éãè£éããé©åãªã€ãŒãžã³ã°ã«ãŒããé©çšããŸãã
ã€ãŒãžã³ã°ã©ã€ãã©ãª (30以äžã®é¢æ°)
ãã¹ãŠã®æšæºçãªã¢ãã¡ãŒã·ã§ã³ã«ãŒããç¶²çŸ ããå æ¬çãªã€ãŒãžã³ã°ã©ã€ãã©ãªã§ãã
- Linear, Quadratic, Cubic, Quartic, Quintic
- Sinusoidal, Exponential, Circular
- Elastic (ããã®ãããªãªãŒããŒã·ã¥ãŒã), Back (äºæ), Bounce
- ãããã ease-inãease-outãease-in-out ã®ããªã¢ã³ãã§å©çšå¯èœ
è£é
ä»»æã®ã¿ã€ã ã¹ã¿ã³ãã«å¯ŸããŠããšã³ãžã³ã¯ä»¥äžã®åŠçãè¡ããŸãã
- åšå²ã®ããŒãã¬ãŒã (ååŸ) ãèŠã€ããŸã
- ãããã®éã®æ£èŠåãããé²è¡ç¶æ³ (0ãã1) ãèšç®ããŸã
- éžæãããã€ãŒãžã³ã°é¢æ°ãé²è¡å€ã«é©çšããŸã
- ããããã£å€ (æ°å€ã¯ç·åœ¢ã16é²å€ã¯ã«ã©ãŒ lerp) ãè£éããŸã
- ã¬ã³ããªã³ã°çšã®ã¢ãã¡ãŒã·ã§ã³ããããã£ã®å®å šãªã»ãããè¿ããŸã
ãã£ã³ãã¹ãšã¬ã³ããªã³ã°
ãªããžã§ã¯ãã¿ã€ã
- é·æ¹åœ¢ â å¹ ãé«ããè²ãã¢ã«ãã¡ãå転ãèšå®å¯èœ
- å â ååŸãè²ãã¢ã«ãã¡ãå転ãèšå®å¯èœ
- ããã¹ã â ãã©ã³ããã¡ããªãŒããã©ã³ããµã€ãºãå 容ãè²ãã¢ã«ãã¡ãèšå®å¯èœ
ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¬ã³ããªã³ã°
- ã¹ã ãŒãºãª 60fps ãã¬ãã¥ãŒåçã®ããã® Pixi.js WebGL ã¬ã³ããªã³ã°
- èšå®å¯èœãªãã£ã³ãã¹è§£å床 (ããã©ã«ã 1920x1080ã30fps)
- 調æŽå¯èœãªèæ¯ã¢ã«ãã¡ãåããéæãªèæ¯ãµããŒã
- èŠèŠçãªãã€ã©ã€ã衚瀺ã䌎ãã€ã³ã¿ã©ã¯ãã£ããªãªããžã§ã¯ãéžæ
- åçãäžæåæ¢ãã¿ã€ã ã©ã€ã³ã¹ã¯ã©ãã«ãããªã¢ã«ã¿ã€ã ã¢ãã¡ãŒã·ã§ã³åç
ãšãã£ã¿ãŒã€ã³ã¿ãŒãã§ãŒã¹
ããŒã«ããŒ
é·æ¹åœ¢ãåãããã¹ããã·ãŒã³ã«è¿œå ããããã®ãªããžã§ã¯ãäœæãã¿ã³ãããã©ã«ãããããã£ã¯ããã«ã«ã¹ã¿ãã€ãºã§ããŸãã
ããããã£ããã«
éžæããããªããžã§ã¯ãã®ããããã£ã¯ãªã¢ã«ã¿ã€ã ã§ç·šéå¯èœ: äœçœ®ããµã€ãºãè²ãã¢ã«ãã¡ãå転ãããã³ã¿ã€ãåºæã®ãããã㣠(ããã¹ãã³ã³ãã³ãããã©ã³ãèšå®)ã
ã¿ã€ã ã©ã€ã³
èŠèŠçãªã¿ã€ã ã©ã€ã³è¡šç€º:
- ãªããžã§ã¯ãããšã®æéäœçœ®ã«ããããŒãã¬ãŒã ããŒã«ãŒ
- ã¹ã¯ã©ãæ©èœä»ãã®çŸåšã®æéã瀺ããã¬ã€ããã
- ããŒãã¬ãŒã ããšã®ã€ãŒãžã³ã°é¢æ°éžæ
- çŸåšã®ãã¬ã€ãããäœçœ®ã§ã®ããŒãã¬ãŒã 远å /åé€ã³ã³ãããŒã«
ãããªãšã¯ã¹ããŒããã€ãã©ã€ã³
ãã¬ãŒã ãã£ããã£
- ã¢ãã¡ãŒã·ã§ã³ã®é·ããš FPS ãç·ãã¬ãŒã æ°ã決å®ããŸã
- åãã¬ãŒã ã¯ãã«è§£å床ã§åå¥ã«ã¬ã³ããªã³ã°ãããŸã
- ãã£ã³ãã¹ã®å 容ã¯ãã¬ãŒã ããšã« PNG blob ãšããŠãã£ããã£ãããŸã
- ãšã³ã³ãŒãã£ã³ã°ããã¯ãšã³ããžã®ã¢ããããŒãã®ããã«ãã¬ãŒã ãåéãããŸã
ãšã³ã³ãŒãã£ã³ã°ããã¯ãšã³ã
Express.js ããã¯ãšã³ãã¯ããžã§ãããŒã¹ã®ã·ã¹ãã ãéããŠãããªãšã³ã³ãŒãã£ã³ã°ãåŠçããŸãã
- ãžã§ãäœæ â ã¯ã©ã€ã¢ã³ããæ°ãããšã¯ã¹ããŒããžã§ãããªã¯ãšã¹ãããŸã (UUIDããŒã¹)
- ãã¬ãŒã ã¢ããããŒã â ãã¬ãŒã ã¯ãããã§ã¢ããããŒããããã (ãŸã㯠WebSocket çµç±ã§ã¹ããªãŒã ãããŸã)
- FFmpeg ãšã³ã³ãŒãã£ã³ã° â ãã¬ãŒã 㯠VP9 ã³ãŒããã¯ã® WebM ãããªã«çµã¿ç«ãŠãããŸã
- ã¢ã«ãã¡ãã£ãã« â å®å šãªééæ§ãµããŒãã®ããã« yuva420p ãã¯ã»ã«ãã©ãŒãããã䜿çšããŸã
- é²è¡ç¶æ³è¿œè·¡ â ãšã³ã³ãŒãã£ã³ã°äžã®ãªã¢ã«ã¿ã€ã é²è¡ç¶æ³æŽæ°
- ããŠã³ããŒã â 宿ãããããªã¯ééæ§æ€èšŒåŸãããŠã³ããŒãå¯èœã«ãªããŸã
WebSocketã®ä»£æ¿æ¡
ãªã¢ã«ã¿ã€ã ãšã¯ã¹ããŒãã®å Žåããã¬ãŒã 㯠HTTP ãããã¢ããããŒãã®ä»£ããã« WebSocket çµç±ã§çŽæ¥ã¹ããªãŒãã³ã°ã§ãããã£ããã£ãã¢ããããŒãããšã³ã³ãŒãã£ã³ã°ã®åãã§ãŒãºå šäœã§ã©ã€ãé²è¡ç¶æ³ãæŽæ°ãããŸãã
äž»ãªæ©èœ
- ããŒãã¬ãŒã ã¢ãã¡ãŒã·ã§ã³ â ããããã£ããšã®ããŒãã¬ãŒã ãåããã¿ã€ã ã©ã€ã³ããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³
- 30以äžã®ã€ãŒãžã³ã°é¢æ° â ãããã§ãã·ã§ãã«ãªã¢ãã¡ãŒã·ã§ã³ã«ãŒãã®ããã®å®å šãªã€ãŒãžã³ã°ã©ã€ãã©ãª
- ééãããªãšã¯ã¹ããŒã â å®å šãªã¢ã«ãã¡ãã£ãã«ãµããŒããåãã VP9 WebM
- ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãã£ã³ãã¹ â ã¹ã ãŒãºãªãªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒã®ããã® Pixi.js WebGL ã¬ã³ããªã³ã°
- è€æ°ã®ãªããžã§ã¯ãã¿ã€ã â é·æ¹åœ¢ãåãããã¹ãã®ç¬ç«ããã¢ãã¡ãŒã·ã§ã³
- ãªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒ â ã¢ãã¡ãŒã·ã§ã³ã®åçãäžæåæ¢ãã¹ã¯ã©ããå³åº§ã«å®è¡
- ãããïŒã¹ããªãŒãã³ã°ãšã¯ã¹ããŒã â HTTP ãããã¢ããããŒããŸã㯠WebSocket ãªã¢ã«ã¿ã€ã ãã¬ãŒã ã¹ããªãŒãã³ã°
- èšå®å¯èœãªåºå â ãšã¯ã¹ããŒãã®ããã®è§£å床ãFPSããããã¬ãŒãèšå®
- åå®å šãªã¢ãã¬ã â ããã³ããšã³ããšããã¯ãšã³ãéã§å ±æããã TypeScript ã®å
- ã«ã¹ã¿ã èæ¯ â ç»å/ãããªãµããŒããåãã調æŽå¯èœãªèæ¯è²ãšã¢ã«ãã¡
ææ
æè¡ã¹ã¿ãã¯
caseStudyDetail.more ã±ãŒã¹ã¹ã¿ãã£
ãã®ä»ã®æè¡å®è£ äºäŸãã芧ãã ãã
AIãæŽ»çšããOCRã«ããè«æ±æžåŠçãšQuickBooks飿º
æ¯ææ°çŸä»¶ã®ä»å ¥å è«æ±æžãåŠçããäžèŠæš¡äŒæ¥ããAI/OCRã䜿çšããŠè«æ±æžããŒã¿ãèªåæœåºãããããèšåž³ãšæ¯æè¿œè·¡ã®ããã«QuickBooksã«çŽæ¥åæãããããšã§ãæåããŒã¿å ¥åãæé€ããå¿ èŠããããŸããã
SCTE-35ããŒã«ãŒè§£æãšãã«ããã©ãããã©ãŒã ãã¬ã€ã€ãŒçµ±åã«ããã¯ã©ã€ã¢ã³ããµã€ãåºåæ¿å ¥ (CSAI)
ãããããªã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã¯ããŠã§ããã¢ãã€ã«ãã³ãã¯ãããTVã¢ããªå šäœã§ã¯ã©ã€ã¢ã³ããµã€ãåºåæ¿å ¥ (CSAI) ãå®è£ ããå¿ èŠããããŸãããããã«ããããµãŒããŒãµã€ãæ¿å ¥ã§ã¯æäŸã§ããªããå®å šãªåºåã€ã³ã¿ã©ã¯ã·ã§ã³ãµããŒãïŒã¯ãªãã¯å¯èœãªãªãŒããŒã¬ã€ãã³ã³ãããªã³ãããŒãã¹ããããã¿ã³ïŒãåãããããŒãœãã©ã€ãºãããããã€ã¹ã¬ãã«ã®åºåäœéšãå¯èœã«ãªããŸãã
ãããã質å
MicrocosmWorksã¯ãããŒãã¬ãŒã éã«èšå®å¯èœãªã€ãŒãžã³ã°ã«ãŒããåãããã£ã³ãã¹ããŒã¹ã®ã¬ã³ããªã³ã°ãšã³ãžã³ãå®è£ ããŸããããã®ãšã³ãžã³ã¯ãäœçœ®ãã¹ã±ãŒã«ãå転ãããã³äžéæåºŠããããã£ã«å¯ŸããŠãç·åœ¢ãbezierãease-in-outãããã³ã«ã¹ã¿ã ã«ãŒãè£éããµããŒãããŠããŸãããšãã£ã¿ã¯ãã©ãŠã¶ã§æå€§60fpsã§ãªã¢ã«ã¿ã€ã ã«ãã¬ãŒã ããšã®ãã¬ãã¥ãŒãã¬ã³ããªã³ã°ãããã¶ã€ããŒãã³ã³ãããŒã«ãã€ã³ãããã©ãã°ããŠããŒãã¬ãŒã ã®äœçœ®ãšã€ãŒãžã³ã°ã«ãŒããèŠèŠçã«èª¿æŽã§ããã€ã³ã¿ã©ã¯ãã£ããªã¿ã€ã ã©ã€ã³ãå«ãã§ããŸãã
MicrocosmWorks ã¯ãFFmpeg ã䜿çšã㊠alpha channel ãä¿æãããŸãŸåãã¬ãŒã ãåæããWebM (VP9 alpha) ãŸã㯠Apple ProRes 4444 (ééæ§ãã) ãšããŠãšã¯ã¹ããŒããããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãæ§ç¯ããŸããããã㯠H.264 ã³ãŒããã¯ããã€ãã£ãã§ alpha channel ããµããŒãããŠããªãããã§ãããã©ãŠã¶ããŒã¹ã®ãšãã£ã¿ã§ã¯ãééæ§ã瀺ãåžæŸæš¡æ§ã®èæ¯ãšãšãã«ãªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒã衚瀺ãããæçµçãªã¬ã³ããªã³ã°ã¯ãã¹ãŠã®ãã¬ãŒã ã§äžè²«ããå質ãä¿èšŒããããã«ãµãŒããŒãµã€ãã§åŠçãããŸãã
ã¯ããMicrocosmWorksã¯ãã«ã¹ã¿ã ãã©ã³ããã©ã¹ã¿ãŒããã³ãã¯ã¿ãŒç»åããããªã¯ãªãããå³åœ¢ããªããã£ããå«ãZãªãŒããŒã®ã¬ã€ã€ãŒããµããŒããããã«ãã¬ã€ã€ãŒã³ã³ããžã·ã§ã³ãšã³ãžã³ãæ§ç¯ããŸããããããã®åã¬ã€ã€ãŒã¯ç¬ç«ããããŒãã¬ãŒã ã¢ãã¡ãŒã·ã§ã³ãã©ãã¯ãæã¡ãŸããã¬ã€ã€ãŒããã«ã«ã¯ã衚瀺åãæ¿ããäžéæåºŠã¹ã©ã€ããŒããã¬ã³ãã¢ãŒããã°ã«ãŒãåãšãã£ããPhotoshopã®ãããªäœ¿ãæ £ããã³ã³ãããŒã«ãçšæãããŠãããAdobeã¯ãŒã¯ãããŒã«æ £ããŠãããã¶ã€ããŒã«ãšã£ãŠçŽæçã«æäœã§ããŸãã
MicrocosmWorks ã¯ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã³ã³ããžããã«ã¯ WebGL ãããã³ããããã³ã°ãªããŒãã¬ãŒã èšç®ã«ã¯ Web Workers ã䜿çšãããããšãã£ã¿ãŒãæé©åããææ°ã®ããŒããŠã§ã¢ã«ãããŠæå€§20ã30ã¬ã€ã€ãŒã®ã³ã³ããžã·ã§ã³ã§ã¹ã ãŒãºãªãªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒæ§èœãéæããŸãããæçµçãªãšã¯ã¹ããŒãã¬ã³ããªã³ã°ã«é¢ããŠã¯ãéãåŠçã¯ãµãŒããŒåŽã§è¡ãããå°çšã® GPU ãªãœãŒã¹ããŠãŒã¶ãŒã®ããã€ã¹èœåã«é¢ãããäžè²«ããåºåå質ãä¿èšŒããŸãã
MicrocosmWorksã¯ãã«ã¹ã¿ã ã¢ãã¡ãŒã·ã§ã³ãšãã£ã¿ãŒãããžã§ã¯ããã1æéããã$20ã$40ã®éçºã¬ãŒãã§æäŸããŸããããŒãã¬ãŒã ã¿ã€ã ã©ã€ã³ããã«ãã¬ã€ã€ãŒã³ã³ããžã·ã§ã³ãééãããªãšã¯ã¹ããŒããå«ããã«æ©èœã®ãšãã£ã¿ãŒã®å Žåãéåžž4ã6ã¶æã®éçºæéãèŠããŸããããã¯ããŠãŒã¶ãŒããšã®ã©ã€ã»ã³ã¹æã課ãåçšSDKäžã«æ§ç¯ããããããå€§å¹ ã«è²»çšå¯Ÿå¹æãé«ãã§ãããŸããé·æçãªãããã¯ãéçºã®ããã«ãã³ãŒãããŒã¹ã®å®å šãªæææš©ãã客æ§ã«æäŸããŸãã
ããžãã¹ã®å€é©ã®æºåã¯ã§ããŠããŸããïŒ
ã客æ§ã®èª²é¡ã«é¡äŒŒã®ãœãªã¥ãŒã·ã§ã³ãé©çšããæ¹æ³ã«ã€ããŠè©±ãåããŸãããã