ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã https://www.medley.jp/jobs/
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã https://www.medley.jp/jobs/
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
æ ªåŒäŒç€Ÿã¡ãã¬ãŒã®ãšã³ãžãã¢ã®ç¬¹å¡ã§ãã ç§ãéçºãæ
åœããŠãããžã§ãã¡ãã¬ãŒã§ãå
æ 10 æ 23 æ¥ã« WEB 颿¥ã»åç»éžèããªãªãŒã¹ããŸããã job-medley.com WEB 颿¥ãåç»éžèãšãã«ãæšä»ã®é察é¢ã§ã®å°±è·æŽ»åããŒãºã«å¿ããã¹ãéçºããŸããã ãªãªãŒã¹ã¯ 2 ã€ã®æ©èœãåæã§ãããä»å㯠WEB 颿¥ã®è£åŽã«çµã£ãŠã玹ä»ããŸãã WEB 颿¥æŠèŠ WEB 颿¥ãšã¯ããªã¢ã«ã¿ã€ã ã§äºæ¥è
æ§ãšæ±è·è
æ§ãããªã³ã©ã€ã³é¢æ¥ãè¡ãããšãã§ããæ©èœã§ãã å°çšã®ã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããPCãã¹ããŒããã©ã³ã®ãã©ãŠã¶ããå©çšã§ããŸãã ãµãŒãã¹éžå® éçºã«ããããããã€ãã®åè£ãããããŸããããæçµçã«ã¯èªç€Ÿå
ã§ãå°å
¥å®çžŸã®ãã SkyWay ã䜿çšããããšã«ããŸããã SkyWay ãšã¯ WebRTCïŒWeb Real Time CommunicationïŒã䜿çšãããªã³ã©ã€ã³ã®ãããªé話ãããµãŒãã¹ã«å°å
¥ã§ãããã«ããã©ãããã©ãŒã SDK ã§ãã 2020 幎 11 ææç¹ã§ãJavaScript SDKãiOS SDKãAndroid SDK ãæäŸãããŠããŸãã ã·ã°ããªã³ã°ãµãŒããªã©ã® WebRTC ã«å¿
èŠãšãªãã€ã³ãã©æ§ç¯ãäžèŠã§ã 䜿çšäžéã€ãã®ç¡æãã©ã³ããããŸã NTT ã³ãã¥ãã±ãŒã·ã§ã³ãºãéçºããŠããŸã webrtc.ecl.ntt.com WEB 颿¥ã®å¯Ÿå¿ãã©ãŠã¶ããŒãžã§ã³ïŒ2020 幎 11 ææç¹ïŒ ãã©ãããã©ãŒã 察å¿ããŒãžã§ã³ PC: Google Chrome ããŒãžã§ã³ 84 ä»¥äž PC: Microsoft Edge ããŒãžã§ã³ 84 ä»¥äž iOS: Safari iOS12 ä»¥äž Android: Google Chrome ããŒãžã§ã³ 85 ä»¥äž Andoid9 ä»¥äž SkyWay JavaScript SDK ã®åäœç¢ºèªãã©ãŠã¶ãWebRTC ã®å¯Ÿå¿ç¶æ³ãå©çšè
ã®å©çšåŸåãã察å¿ãã©ãŠã¶ã®ããŒãžã§ã³ãäžèšã®ããã«èšå®ããŸããã webrtc.ecl.ntt.com SkyWay ã®æ¥ç¶ã¢ãã« SkyWay ã§ãããªé話ãå®è£
ããå Žåã2 çš®é¡ã®æ¥ç¶ã¢ãã«ããéžã³ãŸãã SkyWay é»è©±ã¢ãã« é»è©±ã®ããã« 1 察 1 ã§ã®ãããªéè©±ãæ³å®ããã¢ãã«ã§ãã Peer ã€ã³ã¹ã¿ã³ã¹(ã·ã°ããªã³ã°ãµãŒãã«ãã£ãŠçºè¡ãããäžæã® PeerID ãæã€)åå£«ã§æ¥ç¶ããŸãã æ¥ç¶ããããã«ã¯ãçžæã® PeerID ãå¿
èŠã«ãªããŸãã SkyWay ã«ãŒã ã¢ãã« åäžã«ãŒã å
ã®å
šãŠã® Peer ã§ãããªé話ããã¢ãã«ã§ãã ã«ãŒã åã䜿çšããŠåå ããŸããçžæã® PeerID ãç¥ãå¿
èŠã¯ãããŸããã ã«ãŒã å㯠API ããŒæ¯ã«ç¬ç«ããŠããŸãã ã«ãŒã ã®æ¥ç¶ã¿ã€ãã¯ãã«ã¡ãã·ã¥ã SFU ã® 2 çš®é¡ããéžã¹ãŸãã åå è
å
šå¡ãžã®ãã£ãããªã©ã®ããŒã¿éä¿¡ãã§ããŸãã ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã ä»åŸã®æ©èœæ¡åŒµãæ³å®ããŠããã¡ãã®ã«ãŒã ã¢ãã«ãæ¡çšããŸããã ã«ãŒã ã®éä¿¡ã¿ã€ã ã«ãŒã ã«è€æ°äººãåå ããŠããå Žåãããããã®éä¿¡ãã©ãè¡ããããã¡ãã·ã¥ãš SFU ããéžã¶ããšãã§ããŸãã ãã«ã¡ãã·ã¥ ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 å
šå¡ãçžäºã«éä¿¡ãè¡ããŸãã人æ°ãå¢ãããšã人æ°å端æ«ã®ãšã³ã³ãŒãè² è·ãšéä¿¡éãå¢å ããŸãã SFU SFU ã®å Žåãäžãã®æ¥ç¶ã¯ 1 æ¬ã«ãªãã®ã§ãã¡ãã·ã¥ããã端æ«ã®ãšã³ã³ãŒãè² è·ããéä¿¡éã®è»œæžãæåŸ
ã§ããŸãã ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 éä¿¡æ¹åŒã®éã㯠SkyWay ãé èœããŠãããã®ã§ãjoinRoom æã® mode ã mesh ãã sfu ã«å€æŽããã ãã§åãæ¿ãããŸãã peer . joinRoom ( roomName , { mode: "mesh ã sfu ãæå®" , stream: mediaStream }); webrtc.ecl.ntt.com ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã颿¥åå 人æ°ãèæ
®ã㊠mesh ã䜿çšããŠããŸãã å®è£
ã€ã¡ãŒãž const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ã«ãŒã åå åŸã«çºçããã€ãã³ã }); room . on ( "peerJoin" , ( peerId : string ) => { // ã«ãŒã ã«èª°ãåå ããå Žåã«çºçããã€ãã³ã }); room . on ( "stream" , ( stream : RoomStream ) => { // stream ãåããå Žåã«çºçããã€ãã³ã }); room . on ( "data" , ({ src , data }) => { // data ãåããå Žåã«çºçããã€ãã³ã }); }); peer . on ( "error" , ( error : Error ) => { // ãšã©ãŒçºçæã«çºçããã€ãã³ã }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer ãäœæã peer.joinRoom() ã§ã«ãŒã ã«åå room.stream ã€ãã³ãã§ä»ã®åå è
ã® stream ãåãåã room.data() ã§ãã£ãããªã©ãããŒã¿éä¿¡ãã§ãã room.close() ã§ã«ãŒã ããéåº ã SkyWay ã® JavaScript SDK ã䜿çšããåºæ¬çãªå®è£
ã«ãªããŸãã ãã®å®è£
ã« navigator.mediaDevices.getUserMedia() ã§ååŸãã stream ã joinRoom ã§æž¡ã steam ã€ãã³ãã§åãåã£ã stream ã video ã§åçãã ã远å ããã°ããªã³ã©ã€ã³ã§ã®ãããªé話ãå¯èœã«ãªããŸãã ã¹ããŒããã©ã³å¯Ÿå¿ PC ãšåæ§ã®ã³ãŒãã§ã»ãŒåäœããŸããããiOS ã Android 端æ«ã§ãæ©çš®äŸåãšæãããæåã®èª¿æ»ãšå¯Ÿå¿ã«æéãããããŸããããã®äžéšã玹ä»ããŸãã ã¿ããç§»åãããšæ åãæ ããªã çºçããåé¡ iOS12ãiOS13 ãªã©ã§ è€æ°ã®ã¿ããã²ãããå Žåã«ãæ åã®ååŸãã§ããªããªã ã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã«ãæ åãååŸã§ããªããªã ãšããåé¡ãèµ·ããŸãããiOS14 ã§ã¯ã¿ãåãæ¿ãæã«æ åãååŸã§ããããã«ãªã£ãŠããŸããããã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã¯æ åãååŸã§ããªããŸãŸã§ããã å¯Ÿå¿ ãã®å¯Ÿå¿ã¯ visibilitychange ã€ãã³ãã§ãã¿ãã®åãæ¿ããšãã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã®ã€ãã³ããæŸã ååŸæžã® stream ã® track ã stop ãã stream ãåãçŽã SkyWay ã® room.replaceStream() ã§ãWebRTC ã§äœ¿çšããŠãã stream ãå·®ãæ¿ãã 以äžã®å®è£
ã«ããã察å¿ããŸããã __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); ã€ã€ãã³ã®æäœã§æ åãæ¢ãŸã çºçããåé¡ iOS12ãiOS13 ã§ã¯èµ·ãããŸããã§ããããiOS14 ã§ãªã³ã©ã€ã³é¢æ¥éäžã«ã€ã€ãã³ãã¹ããŒããã©ã³ããå€ããšãçžæåŽã®æ åãæ¢ãŸãããã«ãªããŸããã å¯Ÿå¿ ãããŸã§ã¯ãçžæã®æ åãšé³å£°ãåçããããã«ãvideo ã¿ã°ã« stream ãæž¡ããŠæ åãšé³å£°ãåçããŠããŸããã video : mute ã«ããŠæ åãåç audio : é³å£°ãåç ãšãé³å£°ãšåçãåãããšãããã€ã€ãã³ãå€ããŠã忢ããããšã¯ãªããªããŸããã å¶çŽèšå® getUserMedia ã§ååŸãã MediaStream ã¯ãå¶çŽãèšå®ããããšã§ããã€ã¹ã®æ¶è²»ãªãœãŒã¹ãæããããšãã§ããŸãã èšå®äŸ: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); â navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); å¶çŽãèšå®å¯èœãã©ããã®ç¢ºèª: getSupportedConstraints() ã§ã察å¿ããŠããå¶çŽåãååŸããããšãã§ããŸãã const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿çšããŠãããã©ãŠã¶ããã®å¶çŽã«å¯Ÿå¿ããŠãããã確èªãã察å¿ããŠããå Žåã®ã¿èšå®ãæå¹ã«ããŸãã äŸãã°ãã¹ããŒããã©ã³ã®å Žåã«ä»¥äžã®èšå®ãããã°ãã€ã³ã«ã¡ã©ã䜿çšãããã¬ãŒã ã¬ãŒãã 20 ã«æãã320x320 ã®è§£å床ã«å¶éããããšãã§ããŸãã const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; æå®ããå¶éãå¿
ã䜿çšãããä¿èšŒã¯ãªããæ©çš®äŸåã®åœ±é¿ãåããèšå®ã§ãããã®ã§ã察象ãšããŠããç°å¢ã«ããããŠæ€èšŒãšèª¿æŽãããå¿
èŠãããç¹ã«ã¯æ³šæãå¿
èŠã§ãã åäœæ€èšŒäžã«ãæ©çš®äŸåãšæãããæåãããäŸã玹ä»ããŸãã ãªãã·ã§ã³ æå frameRate æå®ãããšäžéš Android 端æ«ã§ä»¥äžã®æåãããã 1. Android 端æ«ã§é¢æ¥ã«åå ãã 2. iOS Safari ã§åå ãã 3. Android åŽã®æ åãšé³å£°ã Safari ã«éãããªã Safari ã§å
ã«åå ããå Žåã«ã¯åé¡ããªãã è§£å床æå® äŸ: width: 320, height: 320 frameRate ã ãæå®ããŠãããšãã«äžèšã®æåããã AndroidãiOS Safari ã®çµã¿åããã§åé¡ãèµ·ãããªããªã£ãã è§£å床ãæå®ãããšã€ã³ã«ã¡ã©ã§ã¯ãªãããªã¢ã«ã¡ã©ã䜿ã Android 端æ«ããã£ãã å¶çŽèšå®ã«ã€ããŠã¯ãçŸåšã調æŽäžã§ãã åèæ
å ± SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay ã®ã«ãŒã æ©èœã䜿çšãããã¢ç°å¢ã§ãã GitHub ã«ã³ãŒããå
¬éãããŠããã®ã§ãã«ãŒã ã䜿çšããå Žåã®æåãšå®è£
æ¹æ³ã確èªã§ããŸãã éçºãããŠãããšãå®è£
ã®åé¡ãªã®ããSkyWay ã® SDK ã®ä»æ§ãªã®ããç¹å®ã®ããã€ã¹ã§èµ·ããåé¡ãªã®ãã®åãåãã«æéããããããããã¡ãã®ç°å¢ãåèã«ãªããŸããã ãŸãšã SkyWay ã WebRTC ãšã°ã«ãŒãã§ã®ãããªé話ã®å®è£
ãçµ±åããŠæäŸããŠããããããéçºæã¯ãèªç€ŸãµãŒãã¹ãšããŠã® WEB 颿¥ã®æ©èœã«éäžããããšãã§ããŸããã ã¹ããŒããã©ã³ã®ãã©ãŠã¶å¯Ÿå¿ãšèª¿æ»ã«æéããããããšããããŸãããä»åŸãå©çšè
ããã®ãã£ãŒãããã¯ãåŸãªããæ¹åããŠãããããšæããŸãã ã¡ãã¬ãŒã§ã¯ãããŒãºã«ããããæ°æ©èœã®éçºã«ãåãå
¥ããŠããŸããå€ãã®å©çšè
ã«å®éã«äœ¿ããããµãŒãã¹ã®éçºãããŠã¿ãããšæã£ãæ¹ããã²ãæ°è»œã«ã話ããŸãããïŒ www.medley.jp
æ ªåŒäŒç€Ÿã¡ãã¬ãŒã®ãšã³ãžãã¢ã®ç¬¹å¡ã§ãã ç§ãéçºãæ
åœããŠãããžã§ãã¡ãã¬ãŒã§ãå
æ 10 æ 23 æ¥ã« WEB 颿¥ã»åç»éžèããªãªãŒã¹ããŸããã job-medley.com WEB 颿¥ãåç»éžèãšãã«ãæšä»ã®é察é¢ã§ã®å°±è·æŽ»åããŒãºã«å¿ããã¹ãéçºããŸããã ãªãªãŒã¹ã¯ 2 ã€ã®æ©èœãåæã§ãããä»å㯠WEB 颿¥ã®è£åŽã«çµã£ãŠã玹ä»ããŸãã WEB 颿¥æŠèŠ WEB 颿¥ãšã¯ããªã¢ã«ã¿ã€ã ã§äºæ¥è
æ§ãšæ±è·è
æ§ãããªã³ã©ã€ã³é¢æ¥ãè¡ãããšãã§ããæ©èœã§ãã å°çšã®ã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããPCãã¹ããŒããã©ã³ã®ãã©ãŠã¶ããå©çšã§ããŸãã ãµãŒãã¹éžå® éçºã«ããããããã€ãã®åè£ãããããŸããããæçµçã«ã¯èªç€Ÿå
ã§ãå°å
¥å®çžŸã®ãã SkyWay ã䜿çšããããšã«ããŸããã SkyWay ãšã¯ WebRTCïŒWeb Real Time CommunicationïŒã䜿çšãããªã³ã©ã€ã³ã®ãããªé話ãããµãŒãã¹ã«å°å
¥ã§ãããã«ããã©ãããã©ãŒã SDK ã§ãã 2020 幎 11 ææç¹ã§ãJavaScript SDKãiOS SDKãAndroid SDK ãæäŸãããŠããŸãã ã·ã°ããªã³ã°ãµãŒããªã©ã® WebRTC ã«å¿
èŠãšãªãã€ã³ãã©æ§ç¯ãäžèŠã§ã 䜿çšäžéã€ãã®ç¡æãã©ã³ããããŸã NTT ã³ãã¥ãã±ãŒã·ã§ã³ãºãéçºããŠããŸã webrtc.ecl.ntt.com WEB 颿¥ã®å¯Ÿå¿ãã©ãŠã¶ããŒãžã§ã³ïŒ2020 幎 11 ææç¹ïŒ ãã©ãããã©ãŒã 察å¿ããŒãžã§ã³ PC: Google Chrome ããŒãžã§ã³ 84 ä»¥äž PC: Microsoft Edge ããŒãžã§ã³ 84 ä»¥äž iOS: Safari iOS12 ä»¥äž Android: Google Chrome ããŒãžã§ã³ 85 ä»¥äž Andoid9 ä»¥äž SkyWay JavaScript SDK ã®åäœç¢ºèªãã©ãŠã¶ãWebRTC ã®å¯Ÿå¿ç¶æ³ãå©çšè
ã®å©çšåŸåãã察å¿ãã©ãŠã¶ã®ããŒãžã§ã³ãäžèšã®ããã«èšå®ããŸããã webrtc.ecl.ntt.com SkyWay ã®æ¥ç¶ã¢ãã« SkyWay ã§ãããªé話ãå®è£
ããå Žåã2 çš®é¡ã®æ¥ç¶ã¢ãã«ããéžã³ãŸãã SkyWay é»è©±ã¢ãã« é»è©±ã®ããã« 1 察 1 ã§ã®ãããªéè©±ãæ³å®ããã¢ãã«ã§ãã Peer ã€ã³ã¹ã¿ã³ã¹(ã·ã°ããªã³ã°ãµãŒãã«ãã£ãŠçºè¡ãããäžæã® PeerID ãæã€)åå£«ã§æ¥ç¶ããŸãã æ¥ç¶ããããã«ã¯ãçžæã® PeerID ãå¿
èŠã«ãªããŸãã SkyWay ã«ãŒã ã¢ãã« åäžã«ãŒã å
ã®å
šãŠã® Peer ã§ãããªé話ããã¢ãã«ã§ãã ã«ãŒã åã䜿çšããŠåå ããŸããçžæã® PeerID ãç¥ãå¿
èŠã¯ãããŸããã ã«ãŒã å㯠API ããŒæ¯ã«ç¬ç«ããŠããŸãã ã«ãŒã ã®æ¥ç¶ã¿ã€ãã¯ãã«ã¡ãã·ã¥ã SFU ã® 2 çš®é¡ããéžã¹ãŸãã åå è
å
šå¡ãžã®ãã£ãããªã©ã®ããŒã¿éä¿¡ãã§ããŸãã ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã ä»åŸã®æ©èœæ¡åŒµãæ³å®ããŠããã¡ãã®ã«ãŒã ã¢ãã«ãæ¡çšããŸããã ã«ãŒã ã®éä¿¡ã¿ã€ã ã«ãŒã ã«è€æ°äººãåå ããŠããå Žåãããããã®éä¿¡ãã©ãè¡ããããã¡ãã·ã¥ãš SFU ããéžã¶ããšãã§ããŸãã ãã«ã¡ãã·ã¥ ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 å
šå¡ãçžäºã«éä¿¡ãè¡ããŸãã人æ°ãå¢ãããšã人æ°å端æ«ã®ãšã³ã³ãŒãè² è·ãšéä¿¡éãå¢å ããŸãã SFU SFU ã®å Žåãäžãã®æ¥ç¶ã¯ 1 æ¬ã«ãªãã®ã§ãã¡ãã·ã¥ããã端æ«ã®ãšã³ã³ãŒãè² è·ããéä¿¡éã®è»œæžãæåŸ
ã§ããŸãã ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 éä¿¡æ¹åŒã®éã㯠SkyWay ãé èœããŠãããã®ã§ãjoinRoom æã® mode ã mesh ãã sfu ã«å€æŽããã ãã§åãæ¿ãããŸãã peer . joinRoom ( roomName , { mode: "mesh ã sfu ãæå®" , stream: mediaStream }); webrtc.ecl.ntt.com ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã颿¥åå 人æ°ãèæ
®ã㊠mesh ã䜿çšããŠããŸãã å®è£
ã€ã¡ãŒãž const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ã«ãŒã åå åŸã«çºçããã€ãã³ã }); room . on ( "peerJoin" , ( peerId : string ) => { // ã«ãŒã ã«èª°ãåå ããå Žåã«çºçããã€ãã³ã }); room . on ( "stream" , ( stream : RoomStream ) => { // stream ãåããå Žåã«çºçããã€ãã³ã }); room . on ( "data" , ({ src , data }) => { // data ãåããå Žåã«çºçããã€ãã³ã }); }); peer . on ( "error" , ( error : Error ) => { // ãšã©ãŒçºçæã«çºçããã€ãã³ã }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer ãäœæã peer.joinRoom() ã§ã«ãŒã ã«åå room.stream ã€ãã³ãã§ä»ã®åå è
ã® stream ãåãåã room.data() ã§ãã£ãããªã©ãããŒã¿éä¿¡ãã§ãã room.close() ã§ã«ãŒã ããéåº ã SkyWay ã® JavaScript SDK ã䜿çšããåºæ¬çãªå®è£
ã«ãªããŸãã ãã®å®è£
ã« navigator.mediaDevices.getUserMedia() ã§ååŸãã stream ã joinRoom ã§æž¡ã steam ã€ãã³ãã§åãåã£ã stream ã video ã§åçãã ã远å ããã°ããªã³ã©ã€ã³ã§ã®ãããªé話ãå¯èœã«ãªããŸãã ã¹ããŒããã©ã³å¯Ÿå¿ PC ãšåæ§ã®ã³ãŒãã§ã»ãŒåäœããŸããããiOS ã Android 端æ«ã§ãæ©çš®äŸåãšæãããæåã®èª¿æ»ãšå¯Ÿå¿ã«æéãããããŸããããã®äžéšã玹ä»ããŸãã ã¿ããç§»åãããšæ åãæ ããªã çºçããåé¡ iOS12ãiOS13 ãªã©ã§ è€æ°ã®ã¿ããã²ãããå Žåã«ãæ åã®ååŸãã§ããªããªã ã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã«ãæ åãååŸã§ããªããªã ãšããåé¡ãèµ·ããŸãããiOS14 ã§ã¯ã¿ãåãæ¿ãæã«æ åãååŸã§ããããã«ãªã£ãŠããŸããããã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã¯æ åãååŸã§ããªããŸãŸã§ããã å¯Ÿå¿ ãã®å¯Ÿå¿ã¯ visibilitychange ã€ãã³ãã§ãã¿ãã®åãæ¿ããšãã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã®ã€ãã³ããæŸã ååŸæžã® stream ã® track ã stop ãã stream ãåãçŽã SkyWay ã® room.replaceStream() ã§ãWebRTC ã§äœ¿çšããŠãã stream ãå·®ãæ¿ãã 以äžã®å®è£
ã«ããã察å¿ããŸããã __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); ã€ã€ãã³ã®æäœã§æ åãæ¢ãŸã çºçããåé¡ iOS12ãiOS13 ã§ã¯èµ·ãããŸããã§ããããiOS14 ã§ãªã³ã©ã€ã³é¢æ¥éäžã«ã€ã€ãã³ãã¹ããŒããã©ã³ããå€ããšãçžæåŽã®æ åãæ¢ãŸãããã«ãªããŸããã å¯Ÿå¿ ãããŸã§ã¯ãçžæã®æ åãšé³å£°ãåçããããã«ãvideo ã¿ã°ã« stream ãæž¡ããŠæ åãšé³å£°ãåçããŠããŸããã video : mute ã«ããŠæ åãåç audio : é³å£°ãåç ãšãé³å£°ãšåçãåãããšãããã€ã€ãã³ãå€ããŠã忢ããããšã¯ãªããªããŸããã å¶çŽèšå® getUserMedia ã§ååŸãã MediaStream ã¯ãå¶çŽãèšå®ããããšã§ããã€ã¹ã®æ¶è²»ãªãœãŒã¹ãæããããšãã§ããŸãã èšå®äŸ: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); â navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); å¶çŽãèšå®å¯èœãã©ããã®ç¢ºèª: getSupportedConstraints() ã§ã察å¿ããŠããå¶çŽåãååŸããããšãã§ããŸãã const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿çšããŠãããã©ãŠã¶ããã®å¶çŽã«å¯Ÿå¿ããŠãããã確èªãã察å¿ããŠããå Žåã®ã¿èšå®ãæå¹ã«ããŸãã äŸãã°ãã¹ããŒããã©ã³ã®å Žåã«ä»¥äžã®èšå®ãããã°ãã€ã³ã«ã¡ã©ã䜿çšãããã¬ãŒã ã¬ãŒãã 20 ã«æãã320x320 ã®è§£å床ã«å¶éããããšãã§ããŸãã const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; æå®ããå¶éãå¿
ã䜿çšãããä¿èšŒã¯ãªããæ©çš®äŸåã®åœ±é¿ãåããèšå®ã§ãããã®ã§ã察象ãšããŠããç°å¢ã«ããããŠæ€èšŒãšèª¿æŽãããå¿
èŠãããç¹ã«ã¯æ³šæãå¿
èŠã§ãã åäœæ€èšŒäžã«ãæ©çš®äŸåãšæãããæåãããäŸã玹ä»ããŸãã ãªãã·ã§ã³ æå frameRate æå®ãããšäžéš Android 端æ«ã§ä»¥äžã®æåãããã 1. Android 端æ«ã§é¢æ¥ã«åå ãã 2. iOS Safari ã§åå ãã 3. Android åŽã®æ åãšé³å£°ã Safari ã«éãããªã Safari ã§å
ã«åå ããå Žåã«ã¯åé¡ããªãã è§£å床æå® äŸ: width: 320, height: 320 frameRate ã ãæå®ããŠãããšãã«äžèšã®æåããã AndroidãiOS Safari ã®çµã¿åããã§åé¡ãèµ·ãããªããªã£ãã è§£å床ãæå®ãããšã€ã³ã«ã¡ã©ã§ã¯ãªãããªã¢ã«ã¡ã©ã䜿ã Android 端æ«ããã£ãã å¶çŽèšå®ã«ã€ããŠã¯ãçŸåšã調æŽäžã§ãã åèæ
å ± SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay ã®ã«ãŒã æ©èœã䜿çšãããã¢ç°å¢ã§ãã GitHub ã«ã³ãŒããå
¬éãããŠããã®ã§ãã«ãŒã ã䜿çšããå Žåã®æåãšå®è£
æ¹æ³ã確èªã§ããŸãã éçºãããŠãããšãå®è£
ã®åé¡ãªã®ããSkyWay ã® SDK ã®ä»æ§ãªã®ããç¹å®ã®ããã€ã¹ã§èµ·ããåé¡ãªã®ãã®åãåãã«æéããããããããã¡ãã®ç°å¢ãåèã«ãªããŸããã ãŸãšã SkyWay ã WebRTC ãšã°ã«ãŒãã§ã®ãããªé話ã®å®è£
ãçµ±åããŠæäŸããŠããããããéçºæã¯ãèªç€ŸãµãŒãã¹ãšããŠã® WEB 颿¥ã®æ©èœã«éäžããããšãã§ããŸããã ã¹ããŒããã©ã³ã®ãã©ãŠã¶å¯Ÿå¿ãšèª¿æ»ã«æéããããããšããããŸãããä»åŸãå©çšè
ããã®ãã£ãŒãããã¯ãåŸãªããæ¹åããŠãããããšæããŸãã ã¡ãã¬ãŒã§ã¯ãããŒãºã«ããããæ°æ©èœã®éçºã«ãåãå
¥ããŠããŸããå€ãã®å©çšè
ã«å®éã«äœ¿ããããµãŒãã¹ã®éçºãããŠã¿ãããšæã£ãæ¹ããã²ãæ°è»œã«ã話ããŸãããïŒ www.medley.jp
æ ªåŒäŒç€Ÿã¡ãã¬ãŒã®ãšã³ãžãã¢ã®ç¬¹å¡ã§ãã ç§ãéçºãæ
åœããŠãããžã§ãã¡ãã¬ãŒã§ãå
æ 10 æ 23 æ¥ã« WEB 颿¥ã»åç»éžèããªãªãŒã¹ããŸããã job-medley.com WEB 颿¥ãåç»éžèãšãã«ãæšä»ã®é察é¢ã§ã®å°±è·æŽ»åããŒãºã«å¿ããã¹ãéçºããŸããã ãªãªãŒã¹ã¯ 2 ã€ã®æ©èœãåæã§ãããä»å㯠WEB 颿¥ã®è£åŽã«çµã£ãŠã玹ä»ããŸãã WEB 颿¥æŠèŠ WEB 颿¥ãšã¯ããªã¢ã«ã¿ã€ã ã§äºæ¥è
æ§ãšæ±è·è
æ§ãããªã³ã©ã€ã³é¢æ¥ãè¡ãããšãã§ããæ©èœã§ãã å°çšã®ã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããPCãã¹ããŒããã©ã³ã®ãã©ãŠã¶ããå©çšã§ããŸãã ãµãŒãã¹éžå® éçºã«ããããããã€ãã®åè£ãããããŸããããæçµçã«ã¯èªç€Ÿå
ã§ãå°å
¥å®çžŸã®ãã SkyWay ã䜿çšããããšã«ããŸããã SkyWay ãšã¯ WebRTCïŒWeb Real Time CommunicationïŒã䜿çšãããªã³ã©ã€ã³ã®ãããªé話ãããµãŒãã¹ã«å°å
¥ã§ãããã«ããã©ãããã©ãŒã SDK ã§ãã 2020 幎 11 ææç¹ã§ãJavaScript SDKãiOS SDKãAndroid SDK ãæäŸãããŠããŸãã ã·ã°ããªã³ã°ãµãŒããªã©ã® WebRTC ã«å¿
èŠãšãªãã€ã³ãã©æ§ç¯ãäžèŠã§ã 䜿çšäžéã€ãã®ç¡æãã©ã³ããããŸã NTT ã³ãã¥ãã±ãŒã·ã§ã³ãºãéçºããŠããŸã webrtc.ecl.ntt.com WEB 颿¥ã®å¯Ÿå¿ãã©ãŠã¶ããŒãžã§ã³ïŒ2020 幎 11 ææç¹ïŒ ãã©ãããã©ãŒã 察å¿ããŒãžã§ã³ PC: Google Chrome ããŒãžã§ã³ 84 ä»¥äž PC: Microsoft Edge ããŒãžã§ã³ 84 ä»¥äž iOS: Safari iOS12 ä»¥äž Android: Google Chrome ããŒãžã§ã³ 85 ä»¥äž Andoid9 ä»¥äž SkyWay JavaScript SDK ã®åäœç¢ºèªãã©ãŠã¶ãWebRTC ã®å¯Ÿå¿ç¶æ³ãå©çšè
ã®å©çšåŸåãã察å¿ãã©ãŠã¶ã®ããŒãžã§ã³ãäžèšã®ããã«èšå®ããŸããã webrtc.ecl.ntt.com SkyWay ã®æ¥ç¶ã¢ãã« SkyWay ã§ãããªé話ãå®è£
ããå Žåã2 çš®é¡ã®æ¥ç¶ã¢ãã«ããéžã³ãŸãã SkyWay é»è©±ã¢ãã« é»è©±ã®ããã« 1 察 1 ã§ã®ãããªéè©±ãæ³å®ããã¢ãã«ã§ãã Peer ã€ã³ã¹ã¿ã³ã¹(ã·ã°ããªã³ã°ãµãŒãã«ãã£ãŠçºè¡ãããäžæã® PeerID ãæã€)åå£«ã§æ¥ç¶ããŸãã æ¥ç¶ããããã«ã¯ãçžæã® PeerID ãå¿
èŠã«ãªããŸãã SkyWay ã«ãŒã ã¢ãã« åäžã«ãŒã å
ã®å
šãŠã® Peer ã§ãããªé話ããã¢ãã«ã§ãã ã«ãŒã åã䜿çšããŠåå ããŸããçžæã® PeerID ãç¥ãå¿
èŠã¯ãããŸããã ã«ãŒã å㯠API ããŒæ¯ã«ç¬ç«ããŠããŸãã ã«ãŒã ã®æ¥ç¶ã¿ã€ãã¯ãã«ã¡ãã·ã¥ã SFU ã® 2 çš®é¡ããéžã¹ãŸãã åå è
å
šå¡ãžã®ãã£ãããªã©ã®ããŒã¿éä¿¡ãã§ããŸãã ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã ä»åŸã®æ©èœæ¡åŒµãæ³å®ããŠããã¡ãã®ã«ãŒã ã¢ãã«ãæ¡çšããŸããã ã«ãŒã ã®éä¿¡ã¿ã€ã ã«ãŒã ã«è€æ°äººãåå ããŠããå Žåãããããã®éä¿¡ãã©ãè¡ããããã¡ãã·ã¥ãš SFU ããéžã¶ããšãã§ããŸãã ãã«ã¡ãã·ã¥ ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 å
šå¡ãçžäºã«éä¿¡ãè¡ããŸãã人æ°ãå¢ãããšã人æ°å端æ«ã®ãšã³ã³ãŒãè² è·ãšéä¿¡éãå¢å ããŸãã SFU SFU ã®å Žåãäžãã®æ¥ç¶ã¯ 1 æ¬ã«ãªãã®ã§ãã¡ãã·ã¥ããã端æ«ã®ãšã³ã³ãŒãè² è·ããéä¿¡éã®è»œæžãæåŸ
ã§ããŸãã ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 éä¿¡æ¹åŒã®éã㯠SkyWay ãé èœããŠãããã®ã§ãjoinRoom æã® mode ã mesh ãã sfu ã«å€æŽããã ãã§åãæ¿ãããŸãã peer . joinRoom ( roomName , { mode: "mesh ã sfu ãæå®" , stream: mediaStream }); webrtc.ecl.ntt.com ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã颿¥åå 人æ°ãèæ
®ã㊠mesh ã䜿çšããŠããŸãã å®è£
ã€ã¡ãŒãž const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ã«ãŒã åå åŸã«çºçããã€ãã³ã }); room . on ( "peerJoin" , ( peerId : string ) => { // ã«ãŒã ã«èª°ãåå ããå Žåã«çºçããã€ãã³ã }); room . on ( "stream" , ( stream : RoomStream ) => { // stream ãåããå Žåã«çºçããã€ãã³ã }); room . on ( "data" , ({ src , data }) => { // data ãåããå Žåã«çºçããã€ãã³ã }); }); peer . on ( "error" , ( error : Error ) => { // ãšã©ãŒçºçæã«çºçããã€ãã³ã }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer ãäœæã peer.joinRoom() ã§ã«ãŒã ã«åå room.stream ã€ãã³ãã§ä»ã®åå è
ã® stream ãåãåã room.data() ã§ãã£ãããªã©ãããŒã¿éä¿¡ãã§ãã room.close() ã§ã«ãŒã ããéåº ã SkyWay ã® JavaScript SDK ã䜿çšããåºæ¬çãªå®è£
ã«ãªããŸãã ãã®å®è£
ã« navigator.mediaDevices.getUserMedia() ã§ååŸãã stream ã joinRoom ã§æž¡ã steam ã€ãã³ãã§åãåã£ã stream ã video ã§åçãã ã远å ããã°ããªã³ã©ã€ã³ã§ã®ãããªé話ãå¯èœã«ãªããŸãã ã¹ããŒããã©ã³å¯Ÿå¿ PC ãšåæ§ã®ã³ãŒãã§ã»ãŒåäœããŸããããiOS ã Android 端æ«ã§ãæ©çš®äŸåãšæãããæåã®èª¿æ»ãšå¯Ÿå¿ã«æéãããããŸããããã®äžéšã玹ä»ããŸãã ã¿ããç§»åãããšæ åãæ ããªã çºçããåé¡ iOS12ãiOS13 ãªã©ã§ è€æ°ã®ã¿ããã²ãããå Žåã«ãæ åã®ååŸãã§ããªããªã ã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã«ãæ åãååŸã§ããªããªã ãšããåé¡ãèµ·ããŸãããiOS14 ã§ã¯ã¿ãåãæ¿ãæã«æ åãååŸã§ããããã«ãªã£ãŠããŸããããã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã¯æ åãååŸã§ããªããŸãŸã§ããã å¯Ÿå¿ ãã®å¯Ÿå¿ã¯ visibilitychange ã€ãã³ãã§ãã¿ãã®åãæ¿ããšãã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã®ã€ãã³ããæŸã ååŸæžã® stream ã® track ã stop ãã stream ãåãçŽã SkyWay ã® room.replaceStream() ã§ãWebRTC ã§äœ¿çšããŠãã stream ãå·®ãæ¿ãã 以äžã®å®è£
ã«ããã察å¿ããŸããã __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); ã€ã€ãã³ã®æäœã§æ åãæ¢ãŸã çºçããåé¡ iOS12ãiOS13 ã§ã¯èµ·ãããŸããã§ããããiOS14 ã§ãªã³ã©ã€ã³é¢æ¥éäžã«ã€ã€ãã³ãã¹ããŒããã©ã³ããå€ããšãçžæåŽã®æ åãæ¢ãŸãããã«ãªããŸããã å¯Ÿå¿ ãããŸã§ã¯ãçžæã®æ åãšé³å£°ãåçããããã«ãvideo ã¿ã°ã« stream ãæž¡ããŠæ åãšé³å£°ãåçããŠããŸããã video : mute ã«ããŠæ åãåç audio : é³å£°ãåç ãšãé³å£°ãšåçãåãããšãããã€ã€ãã³ãå€ããŠã忢ããããšã¯ãªããªããŸããã å¶çŽèšå® getUserMedia ã§ååŸãã MediaStream ã¯ãå¶çŽãèšå®ããããšã§ããã€ã¹ã®æ¶è²»ãªãœãŒã¹ãæããããšãã§ããŸãã èšå®äŸ: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); â navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); å¶çŽãèšå®å¯èœãã©ããã®ç¢ºèª: getSupportedConstraints() ã§ã察å¿ããŠããå¶çŽåãååŸããããšãã§ããŸãã const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿çšããŠãããã©ãŠã¶ããã®å¶çŽã«å¯Ÿå¿ããŠãããã確èªãã察å¿ããŠããå Žåã®ã¿èšå®ãæå¹ã«ããŸãã äŸãã°ãã¹ããŒããã©ã³ã®å Žåã«ä»¥äžã®èšå®ãããã°ãã€ã³ã«ã¡ã©ã䜿çšãããã¬ãŒã ã¬ãŒãã 20 ã«æãã320x320 ã®è§£å床ã«å¶éããããšãã§ããŸãã const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; æå®ããå¶éãå¿
ã䜿çšãããä¿èšŒã¯ãªããæ©çš®äŸåã®åœ±é¿ãåããèšå®ã§ãããã®ã§ã察象ãšããŠããç°å¢ã«ããããŠæ€èšŒãšèª¿æŽãããå¿
èŠãããç¹ã«ã¯æ³šæãå¿
èŠã§ãã åäœæ€èšŒäžã«ãæ©çš®äŸåãšæãããæåãããäŸã玹ä»ããŸãã ãªãã·ã§ã³ æå frameRate æå®ãããšäžéš Android 端æ«ã§ä»¥äžã®æåãããã 1. Android 端æ«ã§é¢æ¥ã«åå ãã 2. iOS Safari ã§åå ãã 3. Android åŽã®æ åãšé³å£°ã Safari ã«éãããªã Safari ã§å
ã«åå ããå Žåã«ã¯åé¡ããªãã è§£å床æå® äŸ: width: 320, height: 320 frameRate ã ãæå®ããŠãããšãã«äžèšã®æåããã AndroidãiOS Safari ã®çµã¿åããã§åé¡ãèµ·ãããªããªã£ãã è§£å床ãæå®ãããšã€ã³ã«ã¡ã©ã§ã¯ãªãããªã¢ã«ã¡ã©ã䜿ã Android 端æ«ããã£ãã å¶çŽèšå®ã«ã€ããŠã¯ãçŸåšã調æŽäžã§ãã åèæ
å ± SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay ã®ã«ãŒã æ©èœã䜿çšãããã¢ç°å¢ã§ãã GitHub ã«ã³ãŒããå
¬éãããŠããã®ã§ãã«ãŒã ã䜿çšããå Žåã®æåãšå®è£
æ¹æ³ã確èªã§ããŸãã éçºãããŠãããšãå®è£
ã®åé¡ãªã®ããSkyWay ã® SDK ã®ä»æ§ãªã®ããç¹å®ã®ããã€ã¹ã§èµ·ããåé¡ãªã®ãã®åãåãã«æéããããããããã¡ãã®ç°å¢ãåèã«ãªããŸããã ãŸãšã SkyWay ã WebRTC ãšã°ã«ãŒãã§ã®ãããªé話ã®å®è£
ãçµ±åããŠæäŸããŠããããããéçºæã¯ãèªç€ŸãµãŒãã¹ãšããŠã® WEB 颿¥ã®æ©èœã«éäžããããšãã§ããŸããã ã¹ããŒããã©ã³ã®ãã©ãŠã¶å¯Ÿå¿ãšèª¿æ»ã«æéããããããšããããŸãããä»åŸãå©çšè
ããã®ãã£ãŒãããã¯ãåŸãªããæ¹åããŠãããããšæããŸãã ã¡ãã¬ãŒã§ã¯ãããŒãºã«ããããæ°æ©èœã®éçºã«ãåãå
¥ããŠããŸããå€ãã®å©çšè
ã«å®éã«äœ¿ããããµãŒãã¹ã®éçºãããŠã¿ãããšæã£ãæ¹ããã²ãæ°è»œã«ã話ããŸãããïŒ www.medley.jp
æ ªåŒäŒç€Ÿã¡ãã¬ãŒã®ãšã³ãžãã¢ã®ç¬¹å¡ã§ãã ç§ãéçºãæ
åœããŠãããžã§ãã¡ãã¬ãŒã§ãå
æ 10 æ 23 æ¥ã« WEB 颿¥ã»åç»éžèããªãªãŒã¹ããŸããã job-medley.com WEB 颿¥ãåç»éžèãšãã«ãæšä»ã®é察é¢ã§ã®å°±è·æŽ»åããŒãºã«å¿ããã¹ãéçºããŸããã ãªãªãŒã¹ã¯ 2 ã€ã®æ©èœãåæã§ãããä»å㯠WEB 颿¥ã®è£åŽã«çµã£ãŠã玹ä»ããŸãã WEB 颿¥æŠèŠ WEB 颿¥ãšã¯ããªã¢ã«ã¿ã€ã ã§äºæ¥è
æ§ãšæ±è·è
æ§ãããªã³ã©ã€ã³é¢æ¥ãè¡ãããšãã§ããæ©èœã§ãã å°çšã®ã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããPCãã¹ããŒããã©ã³ã®ãã©ãŠã¶ããå©çšã§ããŸãã ãµãŒãã¹éžå® éçºã«ããããããã€ãã®åè£ãããããŸããããæçµçã«ã¯èªç€Ÿå
ã§ãå°å
¥å®çžŸã®ãã SkyWay ã䜿çšããããšã«ããŸããã SkyWay ãšã¯ WebRTCïŒWeb Real Time CommunicationïŒã䜿çšãããªã³ã©ã€ã³ã®ãããªé話ãããµãŒãã¹ã«å°å
¥ã§ãããã«ããã©ãããã©ãŒã SDK ã§ãã 2020 幎 11 ææç¹ã§ãJavaScript SDKãiOS SDKãAndroid SDK ãæäŸãããŠããŸãã ã·ã°ããªã³ã°ãµãŒããªã©ã® WebRTC ã«å¿
èŠãšãªãã€ã³ãã©æ§ç¯ãäžèŠã§ã 䜿çšäžéã€ãã®ç¡æãã©ã³ããããŸã NTT ã³ãã¥ãã±ãŒã·ã§ã³ãºãéçºããŠããŸã webrtc.ecl.ntt.com WEB 颿¥ã®å¯Ÿå¿ãã©ãŠã¶ããŒãžã§ã³ïŒ2020 幎 11 ææç¹ïŒ ãã©ãããã©ãŒã 察å¿ããŒãžã§ã³ PC: Google Chrome ããŒãžã§ã³ 84 ä»¥äž PC: Microsoft Edge ããŒãžã§ã³ 84 ä»¥äž iOS: Safari iOS12 ä»¥äž Android: Google Chrome ããŒãžã§ã³ 85 ä»¥äž Andoid9 ä»¥äž SkyWay JavaScript SDK ã®åäœç¢ºèªãã©ãŠã¶ãWebRTC ã®å¯Ÿå¿ç¶æ³ãå©çšè
ã®å©çšåŸåãã察å¿ãã©ãŠã¶ã®ããŒãžã§ã³ãäžèšã®ããã«èšå®ããŸããã webrtc.ecl.ntt.com SkyWay ã®æ¥ç¶ã¢ãã« SkyWay ã§ãããªé話ãå®è£
ããå Žåã2 çš®é¡ã®æ¥ç¶ã¢ãã«ããéžã³ãŸãã SkyWay é»è©±ã¢ãã« é»è©±ã®ããã« 1 察 1 ã§ã®ãããªéè©±ãæ³å®ããã¢ãã«ã§ãã Peer ã€ã³ã¹ã¿ã³ã¹(ã·ã°ããªã³ã°ãµãŒãã«ãã£ãŠçºè¡ãããäžæã® PeerID ãæã€)åå£«ã§æ¥ç¶ããŸãã æ¥ç¶ããããã«ã¯ãçžæã® PeerID ãå¿
èŠã«ãªããŸãã SkyWay ã«ãŒã ã¢ãã« åäžã«ãŒã å
ã®å
šãŠã® Peer ã§ãããªé話ããã¢ãã«ã§ãã ã«ãŒã åã䜿çšããŠåå ããŸããçžæã® PeerID ãç¥ãå¿
èŠã¯ãããŸããã ã«ãŒã å㯠API ããŒæ¯ã«ç¬ç«ããŠããŸãã ã«ãŒã ã®æ¥ç¶ã¿ã€ãã¯ãã«ã¡ãã·ã¥ã SFU ã® 2 çš®é¡ããéžã¹ãŸãã åå è
å
šå¡ãžã®ãã£ãããªã©ã®ããŒã¿éä¿¡ãã§ããŸãã ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã ä»åŸã®æ©èœæ¡åŒµãæ³å®ããŠããã¡ãã®ã«ãŒã ã¢ãã«ãæ¡çšããŸããã ã«ãŒã ã®éä¿¡ã¿ã€ã ã«ãŒã ã«è€æ°äººãåå ããŠããå Žåãããããã®éä¿¡ãã©ãè¡ããããã¡ãã·ã¥ãš SFU ããéžã¶ããšãã§ããŸãã ãã«ã¡ãã·ã¥ ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 å
šå¡ãçžäºã«éä¿¡ãè¡ããŸãã人æ°ãå¢ãããšã人æ°å端æ«ã®ãšã³ã³ãŒãè² è·ãšéä¿¡éãå¢å ããŸãã SFU SFU ã®å Žåãäžãã®æ¥ç¶ã¯ 1 æ¬ã«ãªãã®ã§ãã¡ãã·ã¥ããã端æ«ã®ãšã³ã³ãŒãè² è·ããéä¿¡éã®è»œæžãæåŸ
ã§ããŸãã ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 éä¿¡æ¹åŒã®éã㯠SkyWay ãé èœããŠãããã®ã§ãjoinRoom æã® mode ã mesh ãã sfu ã«å€æŽããã ãã§åãæ¿ãããŸãã peer . joinRoom ( roomName , { mode: "mesh ã sfu ãæå®" , stream: mediaStream }); webrtc.ecl.ntt.com ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã颿¥åå 人æ°ãèæ
®ã㊠mesh ã䜿çšããŠããŸãã å®è£
ã€ã¡ãŒãž const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ã«ãŒã åå åŸã«çºçããã€ãã³ã }); room . on ( "peerJoin" , ( peerId : string ) => { // ã«ãŒã ã«èª°ãåå ããå Žåã«çºçããã€ãã³ã }); room . on ( "stream" , ( stream : RoomStream ) => { // stream ãåããå Žåã«çºçããã€ãã³ã }); room . on ( "data" , ({ src , data }) => { // data ãåããå Žåã«çºçããã€ãã³ã }); }); peer . on ( "error" , ( error : Error ) => { // ãšã©ãŒçºçæã«çºçããã€ãã³ã }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer ãäœæã peer.joinRoom() ã§ã«ãŒã ã«åå room.stream ã€ãã³ãã§ä»ã®åå è
ã® stream ãåãåã room.data() ã§ãã£ãããªã©ãããŒã¿éä¿¡ãã§ãã room.close() ã§ã«ãŒã ããéåº ã SkyWay ã® JavaScript SDK ã䜿çšããåºæ¬çãªå®è£
ã«ãªããŸãã ãã®å®è£
ã« navigator.mediaDevices.getUserMedia() ã§ååŸãã stream ã joinRoom ã§æž¡ã steam ã€ãã³ãã§åãåã£ã stream ã video ã§åçãã ã远å ããã°ããªã³ã©ã€ã³ã§ã®ãããªé話ãå¯èœã«ãªããŸãã ã¹ããŒããã©ã³å¯Ÿå¿ PC ãšåæ§ã®ã³ãŒãã§ã»ãŒåäœããŸããããiOS ã Android 端æ«ã§ãæ©çš®äŸåãšæãããæåã®èª¿æ»ãšå¯Ÿå¿ã«æéãããããŸããããã®äžéšã玹ä»ããŸãã ã¿ããç§»åãããšæ åãæ ããªã çºçããåé¡ iOS12ãiOS13 ãªã©ã§ è€æ°ã®ã¿ããã²ãããå Žåã«ãæ åã®ååŸãã§ããªããªã ã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã«ãæ åãååŸã§ããªããªã ãšããåé¡ãèµ·ããŸãããiOS14 ã§ã¯ã¿ãåãæ¿ãæã«æ åãååŸã§ããããã«ãªã£ãŠããŸããããã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã¯æ åãååŸã§ããªããŸãŸã§ããã å¯Ÿå¿ ãã®å¯Ÿå¿ã¯ visibilitychange ã€ãã³ãã§ãã¿ãã®åãæ¿ããšãã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã®ã€ãã³ããæŸã ååŸæžã® stream ã® track ã stop ãã stream ãåãçŽã SkyWay ã® room.replaceStream() ã§ãWebRTC ã§äœ¿çšããŠãã stream ãå·®ãæ¿ãã 以äžã®å®è£
ã«ããã察å¿ããŸããã __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); ã€ã€ãã³ã®æäœã§æ åãæ¢ãŸã çºçããåé¡ iOS12ãiOS13 ã§ã¯èµ·ãããŸããã§ããããiOS14 ã§ãªã³ã©ã€ã³é¢æ¥éäžã«ã€ã€ãã³ãã¹ããŒããã©ã³ããå€ããšãçžæåŽã®æ åãæ¢ãŸãããã«ãªããŸããã å¯Ÿå¿ ãããŸã§ã¯ãçžæã®æ åãšé³å£°ãåçããããã«ãvideo ã¿ã°ã« stream ãæž¡ããŠæ åãšé³å£°ãåçããŠããŸããã video : mute ã«ããŠæ åãåç audio : é³å£°ãåç ãšãé³å£°ãšåçãåãããšãããã€ã€ãã³ãå€ããŠã忢ããããšã¯ãªããªããŸããã å¶çŽèšå® getUserMedia ã§ååŸãã MediaStream ã¯ãå¶çŽãèšå®ããããšã§ããã€ã¹ã®æ¶è²»ãªãœãŒã¹ãæããããšãã§ããŸãã èšå®äŸ: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); â navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); å¶çŽãèšå®å¯èœãã©ããã®ç¢ºèª: getSupportedConstraints() ã§ã察å¿ããŠããå¶çŽåãååŸããããšãã§ããŸãã const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿çšããŠãããã©ãŠã¶ããã®å¶çŽã«å¯Ÿå¿ããŠãããã確èªãã察å¿ããŠããå Žåã®ã¿èšå®ãæå¹ã«ããŸãã äŸãã°ãã¹ããŒããã©ã³ã®å Žåã«ä»¥äžã®èšå®ãããã°ãã€ã³ã«ã¡ã©ã䜿çšãããã¬ãŒã ã¬ãŒãã 20 ã«æãã320x320 ã®è§£å床ã«å¶éããããšãã§ããŸãã const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; æå®ããå¶éãå¿
ã䜿çšãããä¿èšŒã¯ãªããæ©çš®äŸåã®åœ±é¿ãåããèšå®ã§ãããã®ã§ã察象ãšããŠããç°å¢ã«ããããŠæ€èšŒãšèª¿æŽãããå¿
èŠãããç¹ã«ã¯æ³šæãå¿
èŠã§ãã åäœæ€èšŒäžã«ãæ©çš®äŸåãšæãããæåãããäŸã玹ä»ããŸãã ãªãã·ã§ã³ æå frameRate æå®ãããšäžéš Android 端æ«ã§ä»¥äžã®æåãããã 1. Android 端æ«ã§é¢æ¥ã«åå ãã 2. iOS Safari ã§åå ãã 3. Android åŽã®æ åãšé³å£°ã Safari ã«éãããªã Safari ã§å
ã«åå ããå Žåã«ã¯åé¡ããªãã è§£å床æå® äŸ: width: 320, height: 320 frameRate ã ãæå®ããŠãããšãã«äžèšã®æåããã AndroidãiOS Safari ã®çµã¿åããã§åé¡ãèµ·ãããªããªã£ãã è§£å床ãæå®ãããšã€ã³ã«ã¡ã©ã§ã¯ãªãããªã¢ã«ã¡ã©ã䜿ã Android 端æ«ããã£ãã å¶çŽèšå®ã«ã€ããŠã¯ãçŸåšã調æŽäžã§ãã åèæ
å ± SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay ã®ã«ãŒã æ©èœã䜿çšãããã¢ç°å¢ã§ãã GitHub ã«ã³ãŒããå
¬éãããŠããã®ã§ãã«ãŒã ã䜿çšããå Žåã®æåãšå®è£
æ¹æ³ã確èªã§ããŸãã éçºãããŠãããšãå®è£
ã®åé¡ãªã®ããSkyWay ã® SDK ã®ä»æ§ãªã®ããç¹å®ã®ããã€ã¹ã§èµ·ããåé¡ãªã®ãã®åãåãã«æéããããããããã¡ãã®ç°å¢ãåèã«ãªããŸããã ãŸãšã SkyWay ã WebRTC ãšã°ã«ãŒãã§ã®ãããªé話ã®å®è£
ãçµ±åããŠæäŸããŠããããããéçºæã¯ãèªç€ŸãµãŒãã¹ãšããŠã® WEB 颿¥ã®æ©èœã«éäžããããšãã§ããŸããã ã¹ããŒããã©ã³ã®ãã©ãŠã¶å¯Ÿå¿ãšèª¿æ»ã«æéããããããšããããŸãããä»åŸãå©çšè
ããã®ãã£ãŒãããã¯ãåŸãªããæ¹åããŠãããããšæããŸãã ã¡ãã¬ãŒã§ã¯ãããŒãºã«ããããæ°æ©èœã®éçºã«ãåãå
¥ããŠããŸããå€ãã®å©çšè
ã«å®éã«äœ¿ããããµãŒãã¹ã®éçºãããŠã¿ãããšæã£ãæ¹ããã²ãæ°è»œã«ã話ããŸãããïŒ www.medley.jp
æ ªåŒäŒç€Ÿã¡ãã¬ãŒã®ãšã³ãžãã¢ã®ç¬¹å¡ã§ãã ç§ãéçºãæ
åœããŠãããžã§ãã¡ãã¬ãŒã§ãå
æ 10 æ 23 æ¥ã« WEB 颿¥ã»åç»éžèããªãªãŒã¹ããŸããã job-medley.com WEB 颿¥ãåç»éžèãšãã«ãæšä»ã®é察é¢ã§ã®å°±è·æŽ»åããŒãºã«å¿ããã¹ãéçºããŸããã ãªãªãŒã¹ã¯ 2 ã€ã®æ©èœãåæã§ãããä»å㯠WEB 颿¥ã®è£åŽã«çµã£ãŠã玹ä»ããŸãã WEB 颿¥æŠèŠ WEB 颿¥ãšã¯ããªã¢ã«ã¿ã€ã ã§äºæ¥è
æ§ãšæ±è·è
æ§ãããªã³ã©ã€ã³é¢æ¥ãè¡ãããšãã§ããæ©èœã§ãã å°çšã®ã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããPCãã¹ããŒããã©ã³ã®ãã©ãŠã¶ããå©çšã§ããŸãã ãµãŒãã¹éžå® éçºã«ããããããã€ãã®åè£ãããããŸããããæçµçã«ã¯èªç€Ÿå
ã§ãå°å
¥å®çžŸã®ãã SkyWay ã䜿çšããããšã«ããŸããã SkyWay ãšã¯ WebRTCïŒWeb Real Time CommunicationïŒã䜿çšãããªã³ã©ã€ã³ã®ãããªé話ãããµãŒãã¹ã«å°å
¥ã§ãããã«ããã©ãããã©ãŒã SDK ã§ãã 2020 幎 11 ææç¹ã§ãJavaScript SDKãiOS SDKãAndroid SDK ãæäŸãããŠããŸãã ã·ã°ããªã³ã°ãµãŒããªã©ã® WebRTC ã«å¿
èŠãšãªãã€ã³ãã©æ§ç¯ãäžèŠã§ã 䜿çšäžéã€ãã®ç¡æãã©ã³ããããŸã NTT ã³ãã¥ãã±ãŒã·ã§ã³ãºãéçºããŠããŸã webrtc.ecl.ntt.com WEB 颿¥ã®å¯Ÿå¿ãã©ãŠã¶ããŒãžã§ã³ïŒ2020 幎 11 ææç¹ïŒ ãã©ãããã©ãŒã 察å¿ããŒãžã§ã³ PC: Google Chrome ããŒãžã§ã³ 84 ä»¥äž PC: Microsoft Edge ããŒãžã§ã³ 84 ä»¥äž iOS: Safari iOS12 ä»¥äž Android: Google Chrome ããŒãžã§ã³ 85 ä»¥äž Andoid9 ä»¥äž SkyWay JavaScript SDK ã®åäœç¢ºèªãã©ãŠã¶ãWebRTC ã®å¯Ÿå¿ç¶æ³ãå©çšè
ã®å©çšåŸåãã察å¿ãã©ãŠã¶ã®ããŒãžã§ã³ãäžèšã®ããã«èšå®ããŸããã webrtc.ecl.ntt.com SkyWay ã®æ¥ç¶ã¢ãã« SkyWay ã§ãããªé話ãå®è£
ããå Žåã2 çš®é¡ã®æ¥ç¶ã¢ãã«ããéžã³ãŸãã SkyWay é»è©±ã¢ãã« é»è©±ã®ããã« 1 察 1 ã§ã®ãããªéè©±ãæ³å®ããã¢ãã«ã§ãã Peer ã€ã³ã¹ã¿ã³ã¹(ã·ã°ããªã³ã°ãµãŒãã«ãã£ãŠçºè¡ãããäžæã® PeerID ãæã€)åå£«ã§æ¥ç¶ããŸãã æ¥ç¶ããããã«ã¯ãçžæã® PeerID ãå¿
èŠã«ãªããŸãã SkyWay ã«ãŒã ã¢ãã« åäžã«ãŒã å
ã®å
šãŠã® Peer ã§ãããªé話ããã¢ãã«ã§ãã ã«ãŒã åã䜿çšããŠåå ããŸããçžæã® PeerID ãç¥ãå¿
èŠã¯ãããŸããã ã«ãŒã å㯠API ããŒæ¯ã«ç¬ç«ããŠããŸãã ã«ãŒã ã®æ¥ç¶ã¿ã€ãã¯ãã«ã¡ãã·ã¥ã SFU ã® 2 çš®é¡ããéžã¹ãŸãã åå è
å
šå¡ãžã®ãã£ãããªã©ã®ããŒã¿éä¿¡ãã§ããŸãã ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã ä»åŸã®æ©èœæ¡åŒµãæ³å®ããŠããã¡ãã®ã«ãŒã ã¢ãã«ãæ¡çšããŸããã ã«ãŒã ã®éä¿¡ã¿ã€ã ã«ãŒã ã«è€æ°äººãåå ããŠããå Žåãããããã®éä¿¡ãã©ãè¡ããããã¡ãã·ã¥ãš SFU ããéžã¶ããšãã§ããŸãã ãã«ã¡ãã·ã¥ ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 å
šå¡ãçžäºã«éä¿¡ãè¡ããŸãã人æ°ãå¢ãããšã人æ°å端æ«ã®ãšã³ã³ãŒãè² è·ãšéä¿¡éãå¢å ããŸãã SFU SFU ã®å Žåãäžãã®æ¥ç¶ã¯ 1 æ¬ã«ãªãã®ã§ãã¡ãã·ã¥ããã端æ«ã®ãšã³ã³ãŒãè² è·ããéä¿¡éã®è»œæžãæåŸ
ã§ããŸãã ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 éä¿¡æ¹åŒã®éã㯠SkyWay ãé èœããŠãããã®ã§ãjoinRoom æã® mode ã mesh ãã sfu ã«å€æŽããã ãã§åãæ¿ãããŸãã peer . joinRoom ( roomName , { mode: "mesh ã sfu ãæå®" , stream: mediaStream }); webrtc.ecl.ntt.com ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã颿¥åå 人æ°ãèæ
®ã㊠mesh ã䜿çšããŠããŸãã å®è£
ã€ã¡ãŒãž const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ã«ãŒã åå åŸã«çºçããã€ãã³ã }); room . on ( "peerJoin" , ( peerId : string ) => { // ã«ãŒã ã«èª°ãåå ããå Žåã«çºçããã€ãã³ã }); room . on ( "stream" , ( stream : RoomStream ) => { // stream ãåããå Žåã«çºçããã€ãã³ã }); room . on ( "data" , ({ src , data }) => { // data ãåããå Žåã«çºçããã€ãã³ã }); }); peer . on ( "error" , ( error : Error ) => { // ãšã©ãŒçºçæã«çºçããã€ãã³ã }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer ãäœæã peer.joinRoom() ã§ã«ãŒã ã«åå room.stream ã€ãã³ãã§ä»ã®åå è
ã® stream ãåãåã room.data() ã§ãã£ãããªã©ãããŒã¿éä¿¡ãã§ãã room.close() ã§ã«ãŒã ããéåº ã SkyWay ã® JavaScript SDK ã䜿çšããåºæ¬çãªå®è£
ã«ãªããŸãã ãã®å®è£
ã« navigator.mediaDevices.getUserMedia() ã§ååŸãã stream ã joinRoom ã§æž¡ã steam ã€ãã³ãã§åãåã£ã stream ã video ã§åçãã ã远å ããã°ããªã³ã©ã€ã³ã§ã®ãããªé話ãå¯èœã«ãªããŸãã ã¹ããŒããã©ã³å¯Ÿå¿ PC ãšåæ§ã®ã³ãŒãã§ã»ãŒåäœããŸããããiOS ã Android 端æ«ã§ãæ©çš®äŸåãšæãããæåã®èª¿æ»ãšå¯Ÿå¿ã«æéãããããŸããããã®äžéšã玹ä»ããŸãã ã¿ããç§»åãããšæ åãæ ããªã çºçããåé¡ iOS12ãiOS13 ãªã©ã§ è€æ°ã®ã¿ããã²ãããå Žåã«ãæ åã®ååŸãã§ããªããªã ã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã«ãæ åãååŸã§ããªããªã ãšããåé¡ãèµ·ããŸãããiOS14 ã§ã¯ã¿ãåãæ¿ãæã«æ åãååŸã§ããããã«ãªã£ãŠããŸããããã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã¯æ åãååŸã§ããªããŸãŸã§ããã å¯Ÿå¿ ãã®å¯Ÿå¿ã¯ visibilitychange ã€ãã³ãã§ãã¿ãã®åãæ¿ããšãã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã®ã€ãã³ããæŸã ååŸæžã® stream ã® track ã stop ãã stream ãåãçŽã SkyWay ã® room.replaceStream() ã§ãWebRTC ã§äœ¿çšããŠãã stream ãå·®ãæ¿ãã 以äžã®å®è£
ã«ããã察å¿ããŸããã __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); ã€ã€ãã³ã®æäœã§æ åãæ¢ãŸã çºçããåé¡ iOS12ãiOS13 ã§ã¯èµ·ãããŸããã§ããããiOS14 ã§ãªã³ã©ã€ã³é¢æ¥éäžã«ã€ã€ãã³ãã¹ããŒããã©ã³ããå€ããšãçžæåŽã®æ åãæ¢ãŸãããã«ãªããŸããã å¯Ÿå¿ ãããŸã§ã¯ãçžæã®æ åãšé³å£°ãåçããããã«ãvideo ã¿ã°ã« stream ãæž¡ããŠæ åãšé³å£°ãåçããŠããŸããã video : mute ã«ããŠæ åãåç audio : é³å£°ãåç ãšãé³å£°ãšåçãåãããšãããã€ã€ãã³ãå€ããŠã忢ããããšã¯ãªããªããŸããã å¶çŽèšå® getUserMedia ã§ååŸãã MediaStream ã¯ãå¶çŽãèšå®ããããšã§ããã€ã¹ã®æ¶è²»ãªãœãŒã¹ãæããããšãã§ããŸãã èšå®äŸ: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); â navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); å¶çŽãèšå®å¯èœãã©ããã®ç¢ºèª: getSupportedConstraints() ã§ã察å¿ããŠããå¶çŽåãååŸããããšãã§ããŸãã const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿çšããŠãããã©ãŠã¶ããã®å¶çŽã«å¯Ÿå¿ããŠãããã確èªãã察å¿ããŠããå Žåã®ã¿èšå®ãæå¹ã«ããŸãã äŸãã°ãã¹ããŒããã©ã³ã®å Žåã«ä»¥äžã®èšå®ãããã°ãã€ã³ã«ã¡ã©ã䜿çšãããã¬ãŒã ã¬ãŒãã 20 ã«æãã320x320 ã®è§£å床ã«å¶éããããšãã§ããŸãã const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; æå®ããå¶éãå¿
ã䜿çšãããä¿èšŒã¯ãªããæ©çš®äŸåã®åœ±é¿ãåããèšå®ã§ãããã®ã§ã察象ãšããŠããç°å¢ã«ããããŠæ€èšŒãšèª¿æŽãããå¿
èŠãããç¹ã«ã¯æ³šæãå¿
èŠã§ãã åäœæ€èšŒäžã«ãæ©çš®äŸåãšæãããæåãããäŸã玹ä»ããŸãã ãªãã·ã§ã³ æå frameRate æå®ãããšäžéš Android 端æ«ã§ä»¥äžã®æåãããã 1. Android 端æ«ã§é¢æ¥ã«åå ãã 2. iOS Safari ã§åå ãã 3. Android åŽã®æ åãšé³å£°ã Safari ã«éãããªã Safari ã§å
ã«åå ããå Žåã«ã¯åé¡ããªãã è§£å床æå® äŸ: width: 320, height: 320 frameRate ã ãæå®ããŠãããšãã«äžèšã®æåããã AndroidãiOS Safari ã®çµã¿åããã§åé¡ãèµ·ãããªããªã£ãã è§£å床ãæå®ãããšã€ã³ã«ã¡ã©ã§ã¯ãªãããªã¢ã«ã¡ã©ã䜿ã Android 端æ«ããã£ãã å¶çŽèšå®ã«ã€ããŠã¯ãçŸåšã調æŽäžã§ãã åèæ
å ± SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay ã®ã«ãŒã æ©èœã䜿çšãããã¢ç°å¢ã§ãã GitHub ã«ã³ãŒããå
¬éãããŠããã®ã§ãã«ãŒã ã䜿çšããå Žåã®æåãšå®è£
æ¹æ³ã確èªã§ããŸãã éçºãããŠãããšãå®è£
ã®åé¡ãªã®ããSkyWay ã® SDK ã®ä»æ§ãªã®ããç¹å®ã®ããã€ã¹ã§èµ·ããåé¡ãªã®ãã®åãåãã«æéããããããããã¡ãã®ç°å¢ãåèã«ãªããŸããã ãŸãšã SkyWay ã WebRTC ãšã°ã«ãŒãã§ã®ãããªé話ã®å®è£
ãçµ±åããŠæäŸããŠããããããéçºæã¯ãèªç€ŸãµãŒãã¹ãšããŠã® WEB 颿¥ã®æ©èœã«éäžããããšãã§ããŸããã ã¹ããŒããã©ã³ã®ãã©ãŠã¶å¯Ÿå¿ãšèª¿æ»ã«æéããããããšããããŸãããä»åŸãå©çšè
ããã®ãã£ãŒãããã¯ãåŸãªããæ¹åããŠãããããšæããŸãã ã¡ãã¬ãŒã§ã¯ãããŒãºã«ããããæ°æ©èœã®éçºã«ãåãå
¥ããŠããŸããå€ãã®å©çšè
ã«å®éã«äœ¿ããããµãŒãã¹ã®éçºãããŠã¿ãããšæã£ãæ¹ããã²ãæ°è»œã«ã話ããŸãããïŒ www.medley.jp
æ ªåŒäŒç€Ÿã¡ãã¬ãŒã®ãšã³ãžãã¢ã®ç¬¹å¡ã§ãã ç§ãéçºãæ
åœããŠãããžã§ãã¡ãã¬ãŒã§ãå
æ 10 æ 23 æ¥ã« WEB 颿¥ã»åç»éžèããªãªãŒã¹ããŸããã job-medley.com WEB 颿¥ãåç»éžèãšãã«ãæšä»ã®é察é¢ã§ã®å°±è·æŽ»åããŒãºã«å¿ããã¹ãéçºããŸããã ãªãªãŒã¹ã¯ 2 ã€ã®æ©èœãåæã§ãããä»å㯠WEB 颿¥ã®è£åŽã«çµã£ãŠã玹ä»ããŸãã WEB 颿¥æŠèŠ WEB 颿¥ãšã¯ããªã¢ã«ã¿ã€ã ã§äºæ¥è
æ§ãšæ±è·è
æ§ãããªã³ã©ã€ã³é¢æ¥ãè¡ãããšãã§ããæ©èœã§ãã å°çšã®ã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããPCãã¹ããŒããã©ã³ã®ãã©ãŠã¶ããå©çšã§ããŸãã ãµãŒãã¹éžå® éçºã«ããããããã€ãã®åè£ãããããŸããããæçµçã«ã¯èªç€Ÿå
ã§ãå°å
¥å®çžŸã®ãã SkyWay ã䜿çšããããšã«ããŸããã SkyWay ãšã¯ WebRTCïŒWeb Real Time CommunicationïŒã䜿çšãããªã³ã©ã€ã³ã®ãããªé話ãããµãŒãã¹ã«å°å
¥ã§ãããã«ããã©ãããã©ãŒã SDK ã§ãã 2020 幎 11 ææç¹ã§ãJavaScript SDKãiOS SDKãAndroid SDK ãæäŸãããŠããŸãã ã·ã°ããªã³ã°ãµãŒããªã©ã® WebRTC ã«å¿
èŠãšãªãã€ã³ãã©æ§ç¯ãäžèŠã§ã 䜿çšäžéã€ãã®ç¡æãã©ã³ããããŸã NTT ã³ãã¥ãã±ãŒã·ã§ã³ãºãéçºããŠããŸã webrtc.ecl.ntt.com WEB 颿¥ã®å¯Ÿå¿ãã©ãŠã¶ããŒãžã§ã³ïŒ2020 幎 11 ææç¹ïŒ ãã©ãããã©ãŒã 察å¿ããŒãžã§ã³ PC: Google Chrome ããŒãžã§ã³ 84 ä»¥äž PC: Microsoft Edge ããŒãžã§ã³ 84 ä»¥äž iOS: Safari iOS12 ä»¥äž Android: Google Chrome ããŒãžã§ã³ 85 ä»¥äž Andoid9 ä»¥äž SkyWay JavaScript SDK ã®åäœç¢ºèªãã©ãŠã¶ãWebRTC ã®å¯Ÿå¿ç¶æ³ãå©çšè
ã®å©çšåŸåãã察å¿ãã©ãŠã¶ã®ããŒãžã§ã³ãäžèšã®ããã«èšå®ããŸããã webrtc.ecl.ntt.com SkyWay ã®æ¥ç¶ã¢ãã« SkyWay ã§ãããªé話ãå®è£
ããå Žåã2 çš®é¡ã®æ¥ç¶ã¢ãã«ããéžã³ãŸãã SkyWay é»è©±ã¢ãã« é»è©±ã®ããã« 1 察 1 ã§ã®ãããªéè©±ãæ³å®ããã¢ãã«ã§ãã Peer ã€ã³ã¹ã¿ã³ã¹(ã·ã°ããªã³ã°ãµãŒãã«ãã£ãŠçºè¡ãããäžæã® PeerID ãæã€)åå£«ã§æ¥ç¶ããŸãã æ¥ç¶ããããã«ã¯ãçžæã® PeerID ãå¿
èŠã«ãªããŸãã SkyWay ã«ãŒã ã¢ãã« åäžã«ãŒã å
ã®å
šãŠã® Peer ã§ãããªé話ããã¢ãã«ã§ãã ã«ãŒã åã䜿çšããŠåå ããŸããçžæã® PeerID ãç¥ãå¿
èŠã¯ãããŸããã ã«ãŒã å㯠API ããŒæ¯ã«ç¬ç«ããŠããŸãã ã«ãŒã ã®æ¥ç¶ã¿ã€ãã¯ãã«ã¡ãã·ã¥ã SFU ã® 2 çš®é¡ããéžã¹ãŸãã åå è
å
šå¡ãžã®ãã£ãããªã©ã®ããŒã¿éä¿¡ãã§ããŸãã ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã ä»åŸã®æ©èœæ¡åŒµãæ³å®ããŠããã¡ãã®ã«ãŒã ã¢ãã«ãæ¡çšããŸããã ã«ãŒã ã®éä¿¡ã¿ã€ã ã«ãŒã ã«è€æ°äººãåå ããŠããå Žåãããããã®éä¿¡ãã©ãè¡ããããã¡ãã·ã¥ãš SFU ããéžã¶ããšãã§ããŸãã ãã«ã¡ãã·ã¥ ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 å
šå¡ãçžäºã«éä¿¡ãè¡ããŸãã人æ°ãå¢ãããšã人æ°å端æ«ã®ãšã³ã³ãŒãè² è·ãšéä¿¡éãå¢å ããŸãã SFU SFU ã®å Žåãäžãã®æ¥ç¶ã¯ 1 æ¬ã«ãªãã®ã§ãã¡ãã·ã¥ããã端æ«ã®ãšã³ã³ãŒãè² è·ããéä¿¡éã®è»œæžãæåŸ
ã§ããŸãã ç»ååŒçšå
: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 éä¿¡æ¹åŒã®éã㯠SkyWay ãé èœããŠãããã®ã§ãjoinRoom æã® mode ã mesh ãã sfu ã«å€æŽããã ãã§åãæ¿ãããŸãã peer . joinRoom ( roomName , { mode: "mesh ã sfu ãæå®" , stream: mediaStream }); webrtc.ecl.ntt.com ãžã§ãã¡ãã¬ãŒã® WEB 颿¥ã§ã¯ã颿¥åå 人æ°ãèæ
®ã㊠mesh ã䜿çšããŠããŸãã å®è£
ã€ã¡ãŒãž const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ã«ãŒã åå åŸã«çºçããã€ãã³ã }); room . on ( "peerJoin" , ( peerId : string ) => { // ã«ãŒã ã«èª°ãåå ããå Žåã«çºçããã€ãã³ã }); room . on ( "stream" , ( stream : RoomStream ) => { // stream ãåããå Žåã«çºçããã€ãã³ã }); room . on ( "data" , ({ src , data }) => { // data ãåããå Žåã«çºçããã€ãã³ã }); }); peer . on ( "error" , ( error : Error ) => { // ãšã©ãŒçºçæã«çºçããã€ãã³ã }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer ãäœæã peer.joinRoom() ã§ã«ãŒã ã«åå room.stream ã€ãã³ãã§ä»ã®åå è
ã® stream ãåãåã room.data() ã§ãã£ãããªã©ãããŒã¿éä¿¡ãã§ãã room.close() ã§ã«ãŒã ããéåº ã SkyWay ã® JavaScript SDK ã䜿çšããåºæ¬çãªå®è£
ã«ãªããŸãã ãã®å®è£
ã« navigator.mediaDevices.getUserMedia() ã§ååŸãã stream ã joinRoom ã§æž¡ã steam ã€ãã³ãã§åãåã£ã stream ã video ã§åçãã ã远å ããã°ããªã³ã©ã€ã³ã§ã®ãããªé話ãå¯èœã«ãªããŸãã ã¹ããŒããã©ã³å¯Ÿå¿ PC ãšåæ§ã®ã³ãŒãã§ã»ãŒåäœããŸããããiOS ã Android 端æ«ã§ãæ©çš®äŸåãšæãããæåã®èª¿æ»ãšå¯Ÿå¿ã«æéãããããŸããããã®äžéšã玹ä»ããŸãã ã¿ããç§»åãããšæ åãæ ããªã çºçããåé¡ iOS12ãiOS13 ãªã©ã§ è€æ°ã®ã¿ããã²ãããå Žåã«ãæ åã®ååŸãã§ããªããªã ã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã«ãæ åãååŸã§ããªããªã ãšããåé¡ãèµ·ããŸãããiOS14 ã§ã¯ã¿ãåãæ¿ãæã«æ åãååŸã§ããããã«ãªã£ãŠããŸããããã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã¯æ åãååŸã§ããªããŸãŸã§ããã å¯Ÿå¿ ãã®å¯Ÿå¿ã¯ visibilitychange ã€ãã³ãã§ãã¿ãã®åãæ¿ããšãã¹ã¯ãªãŒã³ããã¯ããã®åŸ©åž°æã®ã€ãã³ããæŸã ååŸæžã® stream ã® track ã stop ãã stream ãåãçŽã SkyWay ã® room.replaceStream() ã§ãWebRTC ã§äœ¿çšããŠãã stream ãå·®ãæ¿ãã 以äžã®å®è£
ã«ããã察å¿ããŸããã __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); ã€ã€ãã³ã®æäœã§æ åãæ¢ãŸã çºçããåé¡ iOS12ãiOS13 ã§ã¯èµ·ãããŸããã§ããããiOS14 ã§ãªã³ã©ã€ã³é¢æ¥éäžã«ã€ã€ãã³ãã¹ããŒããã©ã³ããå€ããšãçžæåŽã®æ åãæ¢ãŸãããã«ãªããŸããã å¯Ÿå¿ ãããŸã§ã¯ãçžæã®æ åãšé³å£°ãåçããããã«ãvideo ã¿ã°ã« stream ãæž¡ããŠæ åãšé³å£°ãåçããŠããŸããã video : mute ã«ããŠæ åãåç audio : é³å£°ãåç ãšãé³å£°ãšåçãåãããšãããã€ã€ãã³ãå€ããŠã忢ããããšã¯ãªããªããŸããã å¶çŽèšå® getUserMedia ã§ååŸãã MediaStream ã¯ãå¶çŽãèšå®ããããšã§ããã€ã¹ã®æ¶è²»ãªãœãŒã¹ãæããããšãã§ããŸãã èšå®äŸ: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); â navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); å¶çŽãèšå®å¯èœãã©ããã®ç¢ºèª: getSupportedConstraints() ã§ã察å¿ããŠããå¶çŽåãååŸããããšãã§ããŸãã const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿çšããŠãããã©ãŠã¶ããã®å¶çŽã«å¯Ÿå¿ããŠãããã確èªãã察å¿ããŠããå Žåã®ã¿èšå®ãæå¹ã«ããŸãã äŸãã°ãã¹ããŒããã©ã³ã®å Žåã«ä»¥äžã®èšå®ãããã°ãã€ã³ã«ã¡ã©ã䜿çšãããã¬ãŒã ã¬ãŒãã 20 ã«æãã320x320 ã®è§£å床ã«å¶éããããšãã§ããŸãã const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; æå®ããå¶éãå¿
ã䜿çšãããä¿èšŒã¯ãªããæ©çš®äŸåã®åœ±é¿ãåããèšå®ã§ãããã®ã§ã察象ãšããŠããç°å¢ã«ããããŠæ€èšŒãšèª¿æŽãããå¿
èŠãããç¹ã«ã¯æ³šæãå¿
èŠã§ãã åäœæ€èšŒäžã«ãæ©çš®äŸåãšæãããæåãããäŸã玹ä»ããŸãã ãªãã·ã§ã³ æå frameRate æå®ãããšäžéš Android 端æ«ã§ä»¥äžã®æåãããã 1. Android 端æ«ã§é¢æ¥ã«åå ãã 2. iOS Safari ã§åå ãã 3. Android åŽã®æ åãšé³å£°ã Safari ã«éãããªã Safari ã§å
ã«åå ããå Žåã«ã¯åé¡ããªãã è§£å床æå® äŸ: width: 320, height: 320 frameRate ã ãæå®ããŠãããšãã«äžèšã®æåããã AndroidãiOS Safari ã®çµã¿åããã§åé¡ãèµ·ãããªããªã£ãã è§£å床ãæå®ãããšã€ã³ã«ã¡ã©ã§ã¯ãªãããªã¢ã«ã¡ã©ã䜿ã Android 端æ«ããã£ãã å¶çŽèšå®ã«ã€ããŠã¯ãçŸåšã調æŽäžã§ãã åèæ
å ± SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay ã®ã«ãŒã æ©èœã䜿çšãããã¢ç°å¢ã§ãã GitHub ã«ã³ãŒããå
¬éãããŠããã®ã§ãã«ãŒã ã䜿çšããå Žåã®æåãšå®è£
æ¹æ³ã確èªã§ããŸãã éçºãããŠãããšãå®è£
ã®åé¡ãªã®ããSkyWay ã® SDK ã®ä»æ§ãªã®ããç¹å®ã®ããã€ã¹ã§èµ·ããåé¡ãªã®ãã®åãåãã«æéããããããããã¡ãã®ç°å¢ãåèã«ãªããŸããã ãŸãšã SkyWay ã WebRTC ãšã°ã«ãŒãã§ã®ãããªé話ã®å®è£
ãçµ±åããŠæäŸããŠããããããéçºæã¯ãèªç€ŸãµãŒãã¹ãšããŠã® WEB 颿¥ã®æ©èœã«éäžããããšãã§ããŸããã ã¹ããŒããã©ã³ã®ãã©ãŠã¶å¯Ÿå¿ãšèª¿æ»ã«æéããããããšããããŸãããä»åŸãå©çšè
ããã®ãã£ãŒãããã¯ãåŸãªããæ¹åããŠãããããšæããŸãã ã¡ãã¬ãŒã§ã¯ãããŒãºã«ããããæ°æ©èœã®éçºã«ãåãå
¥ããŠããŸããå€ãã®å©çšè
ã«å®éã«äœ¿ããããµãŒãã¹ã®éçºãããŠã¿ãããšæã£ãæ¹ããã²ãæ°è»œã«ã話ããŸãããïŒ www.medley.jp