{"id":5249,"date":"2021-07-11T20:24:24","date_gmt":"2021-07-11T11:24:24","guid":{"rendered":"https:\/\/greentown.tokyo\/?p=5249"},"modified":"2021-12-23T02:51:05","modified_gmt":"2021-12-22T17:51:05","slug":"vue-js-3-camera","status":"publish","type":"post","link":"https:\/\/greentown.tokyo\/?p=5249","title":{"rendered":"Vue.js 3 \u3067\u30ab\u30e1\u30e9\u3092\u4f7f\u3046"},"content":{"rendered":"\n<p><strong>2021\/12\/23 \u8ffd\u8a18\uff1a<\/strong>\u5b9f\u306f\u3082\u3063\u3068\u826f\u3044\u3084\u308a\u304b\u305f\u304c\u3042\u3063\u305f\u3002video\u30bf\u30b0\u3092\u4f7f\u308f\u305ainput\u3067\u3044\u3051\u308b\u3002\u3053\u3093\u3069\u8a18\u4e8b\u3092\u66f8\u3053\u3046\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u3067\u306f\u672c\u7de8<\/p>\n<p>\u64ae\u5f71\u30a2\u30d7\u30ea\u306a\u3089Flutter\u3067\u3084\u308c\u3070\u3044\u3044\u306e\u3067\u306f\uff1f\u3068\u601d\u3063\u305f\u306e\u3067\u3059\u304c\u3001\u9ad8\u9f62\u8005\u5411\u3051\u306e\u30a2\u30d7\u30ea\u306a\u306e\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981\u306eWeb\u30a2\u30d7\u30ea\u3067\u5b9f\u88c5\u3057\u307e\u3057\u3087\u3046\uff01\u3068\u3046\u65b9\u5411\u3067\u3001\u5199\u771f\u30a2\u30d7\u30ea\u3092\u958b\u767a\u3057\u3066\u307e\u3059\u3002<\/p>\n<p>\u3044\u3061\u306b\u3061\u30cf\u30de\u3063\u305f\u306e\u3067\u30e1\u30e2\u3002<\/p>\n<p>\u7d50\u679c&#x1f4f7;<\/p>\n<p><a href=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2021\/07\/cat.jpg\"><img decoding=\"async\" src=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2021\/07\/cat.jpg\" alt=\"\" width=\"397\" height=\"360\" class=\"alignnone  wp-image-5253\" srcset=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2021\/07\/cat.jpg 1198w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2021\/07\/cat-300x272.jpg 300w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2021\/07\/cat-1024x930.jpg 1024w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2021\/07\/cat-768x697.jpg 768w\" sizes=\"(max-width: 397px) 100vw, 397px\" \/><\/a><\/p>\n<h2>ref\u3092\u4f7f\u3063\u305f\u65b9\u6cd5\u3067\u5b9f\u88c5\u3059\u308b<\/h2>\n<p>\u5148\u65e5\u304b\u3089 <span class=\"st-mymarker-s\">$refs<\/span> \u3092 <span class=\"st-mymarker-s\">vue.js3<\/span> \u3067\u66f8\u304f\u65b9\u6cd5\u306b\u82e6\u3057\u3081\u3089\u308c\u3066\u305f\u306e\u3067\u3059\u304c\u3001\u7406\u89e3\u3057\u305f\u3002<span class=\"st-mymarker-s\">\u305f\u3076\u3093\u3002<\/span><\/p>\n<p><a href=\"https:\/\/v3.vuejs.org\/guide\/composition-api-template-refs.html\">Template Refs<\/a> \u3092\u307f\u3066\u3082\u308f\u304b\u3089\u306a\u304b\u3063\u305f\u306e\u3060\u3088\u306d..\uff08\u3042\u304b\u3093..\u307e\u305f\u3001\u5f37\u5f37\u30a8\u30f3\u30b8\u30cb\u30a2\u306b\u52a9\u3051\u3066\u3082\u3089\u3063\u305f\u306e\u3067\u3057\u305f..\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-ts\" data-lang=\"TypeScript\"><code>&lt;template&gt;\n  &lt;div class=&quot;camera&quot;&gt;\n    &lt;video ref=&quot;video&quot; autoplay width=&quot;300&quot; height=&quot;200&quot;&gt;&lt;\/video&gt;\n  &lt;\/div&gt;\n&lt;\/template&gt;\n\n&lt;script lang=&quot;ts&quot;&gt;\nimport { defineComponent, onMounted, ref } from &quot;vue&quot;;\n\nexport default defineComponent({\n  name: &quot;Camera&quot;,\n\n  setup() {\n    const video = ref()\n\n    onMounted(() =&gt; {\n      if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n        navigator.mediaDevices.getUserMedia({\n          video: true,\n          audio: false,\n        }).then(stream =&gt; {\n          if (video.value && video.value !== null) {\n            video.value.srcObject = stream;\n            video.value.play()\n          }\n        });\n      }\n    });\n\n    return {\n      video,\n    };\n  },\n})\n&lt;\/script&gt;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">ref\u3092\u4f7f\u308f\u305a\u306b\u5b9f\u88c5\u3059\u308b<\/h2>\n\n\n\n<p>\u3053\u3061\u3089\u306f\u3001\u5b8c\u5168\u306b<a href=\"https:\/\/tec.tecotec.co.jp\/entry\/2021\/07\/02\/090000\">\u3053\u3053\u306e<\/a>\u5199\u7d4c\u306a\u306e\u3067\u3059\u304c..<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-ts\" data-lang=\"TypeScript\"><code>&lt;template&gt;\n  &lt;div class=&quot;camera&quot;&gt;\n    &lt;video v-if=&quot;captureStream&quot;\n      :srcObject.prop=&quot;captureStream&quot;\n      id=&quot;video&quot;\n      autoplay\n      playsinline\n      muted\n    &gt;&lt;\/video&gt;\n  &lt;\/div&gt;\n&lt;\/template&gt;\n\n&lt;script lang=&quot;ts&quot;&gt;\nimport { defineComponent } from &quot;vue&quot;;\n\nexport default defineComponent({\n  name: &quot;Camera&quot;,\n\n  setup() {\n    const captureStream = ref&lt;MediaStream | undefined&gt;();\n\n    const constraints: MediaStreamConstraints = {\n      video: true,\n      audio: false,\n    }\n\n    const gotStream = (stream: MediaStream) =&gt; {\n      captureStream.value = stream;\n    }\n\n    const handleError = (error: Error) =&gt; {\n      console.error(error.name, error.message);\n    }\n    \n    navigator.mediaDevices\n      .getUserMedia(constraints)\n      .then(gotStream)\n      .catch(handleError);\n\n    return {\n      captureStream\n    };\n  },\n})\n&lt;\/script&gt;\n<\/code><\/pre><\/div>\n\n\n\n<p>\u4eca\u56de\u306fref\u3092\u4f7f\u3063\u305f\u65b9\u6cd5\u3092\u63a1\u7528\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u6b21\u306f\u64ae\u5f71\u6a5f\u80fd\u3060\u301c&#x1f4f7;<\/p>\n<p>\u53c2\u8003\uff1a<\/p>\n<p>\u3044\u308d\u3044\u308d\u5f98\u5f8a\u3057\u305f..<\/p>\n<p><a href=\"https:\/\/v3.vuejs.org\/guide\/composition-api-template-refs.html#usage-with-jsx\">https:\/\/v3.vuejs.org\/guide\/composition-api-template-refs.html#usage-with-jsx<\/a><\/p>\n<p><a href=\"https:\/\/qiita.com\/kino15\/items\/8f8feffca54015555f4b\">https:\/\/qiita.com\/kino15\/items\/8f8feffca54015555f4b<\/a><\/p>\n<p>\r\n\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t<a href=\"https:\/\/tec.tecotec.co.jp\/entry\/2021\/07\/02\/090000\" class=\"st-cardlink st-embed-cardlink has-site\">\r\n\t\t\t\t\t\t<div class=\"kanren st-cardbox\">\r\n\t\t\t\t\t\t\t<dl class=\"clearfix\">\r\n\t\t\t\t\t\t\t\t<dt class=\"st-card-img\">\r\n\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/s.wordpress.com\/mshots\/v1\/https%3A%2F%2Ftec.tecotec.co.jp%2Fentry%2F2021%2F07%2F02%2F090000?w=300&#038;h=300\" alt=\"\" width=\"100\" height=\"100\" \/>\t\t\t\t\t\t\t\t<\/dt>\r\n\t\t\t\t\t\t\t\t<dd>\r\n\t\t\t\t\t\t\t\t\t<p class=\"st-cardbox-t\">Vue3 + WebRTC \u3067\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30ab\u30e1\u30e9\u3092\u6271\u3046\u7c21\u5358\u306a\u30c7\u30e2\u306e\u7d39\u4ecb &#8211; \u30c6\u30b3\u30c6\u30c3\u30af\u958b\u767a\u8005\u30d6\u30ed\u30b0<\/p>\r\n\t\t\t\t\t\t\t\t\t<div class=\"st-card-excerpt smanone\"><p>\u3053\u3093\u306b\u3061\u306f\u3002\u30d6\u30ed\u30c3\u30af\u30c1\u30a7\u30fc\u30f3\u4e8b\u696d\u90e8\u306e\u718a\u8c37\u3067\u3059\u3002 \u666e\u6bb5\u306fWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u958b\u767a\u306b\u643a\u308f\u3063\u3066\u3044\u307e\u3059\u3002 \u3068\u3042\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067WebRTC\u3068\u3044\u3046\u3001Web\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u901a\u4fe1\u3092\u884c\u3046\u3053\u3068 &#8230; <\/p><\/div>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"st-cardbox-site\">\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"st-cardbox-favicon\"><img\r\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=\"https:\/\/www.google.com\/s2\/favicons?domain=tec.tecotec.co.jp\"\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth=\"16\"\r\n\t\t\t\t\t\t\t\t\t\t\t\theight=\"16\"\r\n\t\t\t\t\t\t\t\t\t\t\t\talt=\"\"><\/span><span\r\n\t\t\t\t\t\t\t\t\t\t\tclass=\"st-cardbox-host\">tec.tecotec.co.jp<\/span>\r\n\t\t\t\t\t\t\t\t\t<\/p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/dd>\r\n\t\t\t\t\t\t\t<\/dl>\r\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/a>\r\n\t\t\t\t<\/div>\r\n\t\t\t\r\n\t\t\t<\/p>\n<p>\r\n\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t<a href=\"https:\/\/mebee.info\/2021\/03\/17\/post-28654\/\" class=\"st-cardlink st-embed-cardlink has-site\">\r\n\t\t\t\t\t\t<div class=\"kanren st-cardbox\">\r\n\t\t\t\t\t\t\t<dl class=\"clearfix\">\r\n\t\t\t\t\t\t\t\t<dt class=\"st-card-img\">\r\n\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/s.wordpress.com\/mshots\/v1\/https%3A%2F%2Fmebee.info%2F2021%2F03%2F17%2Fpost-28654?w=300&#038;h=300\" alt=\"\" width=\"100\" height=\"100\" \/>\t\t\t\t\t\t\t\t<\/dt>\r\n\t\t\t\t\t\t\t\t<dd>\r\n\t\t\t\t\t\t\t\t\t<p class=\"st-cardbox-t\">javascript Web\u30ab\u30e1\u30e9\u306bWeb API\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3059\u308b<\/p>\r\n\t\t\t\t\t\t\t\t\t<div class=\"st-card-excerpt smanone\"><p>javascript\u3067\u3001navigator.mediaDevices\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306egetUserMedia\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001Web\u30ab\u30e1\u30e9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u63b2\u8f09\u3057\u3066\u307e\u3059\u3002\u30d6\u30e9\u30a6\u30b6\u306fchro &#8230; <\/p><\/div>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"st-cardbox-site\">\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"st-cardbox-favicon\"><img\r\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=\"https:\/\/www.google.com\/s2\/favicons?domain=mebee.info\"\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth=\"16\"\r\n\t\t\t\t\t\t\t\t\t\t\t\theight=\"16\"\r\n\t\t\t\t\t\t\t\t\t\t\t\talt=\"\"><\/span><span\r\n\t\t\t\t\t\t\t\t\t\t\tclass=\"st-cardbox-host\">mebee.info<\/span>\r\n\t\t\t\t\t\t\t\t\t<\/p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/dd>\r\n\t\t\t\t\t\t\t<\/dl>\r\n\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<\/a>\r\n\t\t\t\t<\/div>\r\n\t\t\t\r\n\t\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&lt;template&gt; &lt;div class=&quot;camera&quot;&gt; &lt;video ref=&quot;video&quot; autoplay width &#8230; <\/p>\n","protected":false},"author":1,"featured_media":5253,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106],"tags":[],"class_list":["post-5249","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vue-js"],"_links":{"self":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts\/5249"}],"collection":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5249"}],"version-history":[{"count":11,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts\/5249\/revisions"}],"predecessor-version":[{"id":5460,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts\/5249\/revisions\/5460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/media\/5253"}],"wp:attachment":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}