CINXE.COM

画面キャプチャ API の使用 - Web API | MDN

<!doctype html><html lang="en-US" prefix="og: https://ogp.me/ns#"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="icon" href="https://developer.mozilla.org/favicon-48x48.bc390275e955dacb2e65.png"/><link rel="apple-touch-icon" href="https://developer.mozilla.org/apple-touch-icon.528534bba673c38049c2.png"/><meta name="theme-color" content="#ffffff"/><link rel="manifest" href="https://developer.mozilla.org/manifest.f42880861b394dd4dc9b.json"/><link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="MDN Web Docs"/><title>画面キャプチャ API の使用 - Web API | MDN</title><link rel="alternate" title="Verwendung der Screen Capture API" href="https://developer.mozilla.org/de/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" hrefLang="de"/><link rel="alternate" title="Using the Screen Capture API" href="https://developer.mozilla.org/en-US/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" hrefLang="en"/><link rel="alternate" title="Uso de la API de captura de pantalla" href="https://developer.mozilla.org/es/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" hrefLang="es"/><link rel="alternate" title="Использование интерфейса Screen Capture API" href="https://developer.mozilla.org/ru/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" hrefLang="ru"/><link rel="alternate" title="画面キャプチャ API の使用" href="https://developer.mozilla.org/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" hrefLang="ja"/><link rel="preload" as="font" type="font/woff2" href="/static/media/Inter.var.c2fe3cb2b7c746f7966a.woff2" crossorigin=""/><link rel="alternate" type="application/rss+xml" title="MDN Blog RSS Feed" href="https://developer.mozilla.org/en-US/blog/rss.xml" hrefLang="en"/><meta name="description" content="この記事では、画面キャプチャ API とその getDisplayMedia() メソッドを使用して、 WebRTC 会議セッション中に画面の一部または全部をストリーミング、録音、共有用に取得する方法を検証していきます。"/><meta property="og:url" content="https://developer.mozilla.org/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture"/><meta property="og:title" content="画面キャプチャ API の使用 - Web API | MDN"/><meta property="og:type" content="website"/><meta property="og:locale" content="ja"/><meta property="og:description" content="この記事では、画面キャプチャ API とその getDisplayMedia() メソッドを使用して、 WebRTC 会議セッション中に画面の一部または全部をストリーミング、録音、共有用に取得する方法を検証していきます。"/><meta property="og:image" content="https://developer.mozilla.org/mdn-social-share.d893525a4fb5fb1f67a2.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:height" content="1080"/><meta property="og:image:width" content="1920"/><meta property="og:image:alt" content="The MDN Web Docs logo, featuring a blue accent color, displayed on a solid black background."/><meta property="og:site_name" content="MDN Web Docs"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:creator" content="MozDevNet"/><link rel="canonical" href="https://developer.mozilla.org/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture"/><style media="print">.article-actions-container,.document-toc-container,.language-menu,.main-menu-toggle,.on-github,.page-footer,.place,.sidebar,.top-banner,.top-navigation-main,ul.prev-next{display:none!important}.main-page-content,.main-page-content pre{padding:2px}.main-page-content pre{border-left-width:2px}</style><script src="/static/js/gtag.js" defer=""></script><script defer="" src="/static/js/main.1a183c7d.js"></script><link href="/static/css/main.27d5b2a8.css" rel="stylesheet"/></head><body><script>if(document.body.addEventListener("load",(t=>{t.target.classList.contains("interactive")&&t.target.setAttribute("data-readystate","complete")}),{capture:!0}),window&&document.documentElement){const t={light:"#ffffff",dark:"#1b1b1b"};try{const e=window.localStorage.getItem("theme");e&&(document.documentElement.className=e,document.documentElement.style.backgroundColor=t[e]);const o=window.localStorage.getItem("nop");o&&(document.documentElement.dataset.nop=o)}catch(t){console.warn("Unable to read theme from localStorage",t)}}</script><div id="root"><ul id="nav-access" class="a11y-nav"><li><a id="skip-main" href="#content">Skip to main content</a></li><li><a id="skip-search" href="#top-nav-search-input">Skip to search</a></li><li><a id="skip-select-language" href="#languages-switcher-button">Skip to select language</a></li></ul><div class="page-wrapper category-api document-page"><div class="top-banner loading"><section class="place top container"></section></div><div class="sticky-header-container"><header class="top-navigation "><div class="container "><div class="top-navigation-wrap"><a href="/ja/" class="logo" aria-label="MDN homepage"><svg id="mdn-docs-logo" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 694.9 104.4" style="enable-background:new 0 0 694.9 104.4" xml:space="preserve" role="img"><title>MDN Web Docs</title><path d="M40.3 0 11.7 92.1H0L28.5 0h11.8zm10.4 0v92.1H40.3V0h10.4zM91 0 62.5 92.1H50.8L79.3 0H91zm10.4 0v92.1H91V0h10.4z" class="logo-m"></path><path d="M627.9 95.6h67v8.8h-67v-8.8z" class="logo-_"></path><path d="M367 42h-4l-10.7 30.8h-5.5l-10.8-26h-.4l-10.5 26h-5.2L308.7 42h-3.8v-5.6H323V42h-6.5l6.8 20.4h.4l10.3-26h4.7l11.2 26h.5l5.7-20.3h-6.2v-5.6H367V42zm34.9 20c-.4 3.2-2 5.9-4.7 8.2-2.8 2.3-6.5 3.4-11.3 3.4-5.4 0-9.7-1.6-13.1-4.7-3.3-3.2-5-7.7-5-13.7 0-5.7 1.6-10.3 4.7-14s7.4-5.5 12.9-5.5c5.1 0 9.1 1.6 11.9 4.7s4.3 6.9 4.3 11.3c0 1.5-.2 3-.5 4.7h-25.6c.3 7.7 4 11.6 10.9 11.6 2.9 0 5.1-.7 6.5-2 1.5-1.4 2.5-3 3-4.9l6 .9zM394 51.3c.2-2.4-.4-4.7-1.8-6.9s-3.8-3.3-7-3.3c-3.1 0-5.3 1-6.9 3-1.5 2-2.5 4.4-2.8 7.2H394zm51 2.4c0 5-1.3 9.5-4 13.7s-6.9 6.2-12.7 6.2c-6 0-10.3-2.2-12.7-6.7-.1.4-.2 1.4-.4 2.9s-.3 2.5-.4 2.9h-7.3c.3-1.7.6-3.5.8-5.3.3-1.8.4-3.7.4-5.5V22.3h-6v-5.6H416v27c1.1-2.2 2.7-4.1 4.7-5.7 2-1.6 4.8-2.4 8.4-2.4 4.6 0 8.4 1.6 11.4 4.7 3 3.2 4.5 7.6 4.5 13.4zm-7.7.6c0-4.2-1-7.4-3-9.5-2-2.2-4.4-3.3-7.4-3.3-3.4 0-6 1.2-8 3.7-1.9 2.4-2.9 5-3 7.7V57c0 3 1 5.6 3 7.7s4.5 3.1 7.6 3.1c3.6 0 6.3-1.3 8.1-3.9 1.8-2.7 2.7-5.9 2.7-9.6zm69.2 18.5h-13.2v-7.2c-1.2 2.2-2.8 4.1-4.9 5.6-2.1 1.6-4.8 2.4-8.3 2.4-4.8 0-8.7-1.6-11.6-4.9-2.9-3.2-4.3-7.7-4.3-13.3 0-5 1.3-9.6 4-13.7 2.6-4.1 6.9-6.2 12.8-6.2 5.7 0 9.8 2.2 12.3 6.5V22.3h-8.6v-5.6h15.8v50.6h6v5.5zM493.2 56v-4.4c-.1-3-1.2-5.5-3.2-7.3s-4.4-2.8-7.2-2.8c-3.6 0-6.3 1.3-8.2 3.9-1.9 2.6-2.8 5.8-2.8 9.6 0 4.1 1 7.3 3 9.5s4.5 3.3 7.4 3.3c3.2 0 5.8-1.3 7.8-3.8 2.1-2.6 3.1-5.3 3.2-8zm53.1-1.4c0 5.6-1.8 10.2-5.3 13.7s-8.2 5.3-13.9 5.3-10.1-1.7-13.4-5.1c-3.3-3.4-5-7.9-5-13.5 0-5.3 1.6-9.9 4.7-13.7 3.2-3.8 7.9-5.7 14.2-5.7s11 1.9 14.1 5.7c3 3.7 4.6 8.1 4.6 13.3zm-7.7-.2c0-4-1-7.2-3-9.5s-4.8-3.5-8.2-3.5c-3.6 0-6.4 1.2-8.3 3.7s-2.9 5.6-2.9 9.5c0 3.7.9 6.8 2.8 9.4 1.9 2.6 4.6 3.9 8.3 3.9 3.6 0 6.4-1.3 8.4-3.8 1.9-2.6 2.9-5.8 2.9-9.7zm45 5.8c-.4 3.2-1.9 6.3-4.4 9.1-2.5 2.9-6.4 4.3-11.8 4.3-5.2 0-9.4-1.6-12.6-4.8-3.2-3.2-4.8-7.7-4.8-13.7 0-5.5 1.6-10.1 4.7-13.9 3.2-3.8 7.6-5.7 13.2-5.7 2.3 0 4.6.3 6.7.8 2.2.5 4.2 1.5 6.2 2.9l1.5 9.5-5.9.7-1.3-6.1c-2.1-1.2-4.5-1.8-7.2-1.8-3.5 0-6.1 1.2-7.7 3.7-1.7 2.5-2.5 5.7-2.5 9.6 0 4.1.9 7.3 2.7 9.5 1.8 2.3 4.4 3.4 7.8 3.4 5.2 0 8.2-2.9 9.2-8.8l6.2 1.3zm34.7 1.9c0 3.6-1.5 6.5-4.6 8.5s-7 3-11.7 3c-5.7 0-10.6-1.2-14.6-3.6l1.2-8.8 5.7.6-.2 4.7c1.1.5 2.3.9 3.6 1.1s2.6.3 3.9.3c2.4 0 4.5-.4 6.5-1.3 1.9-.9 2.9-2.2 2.9-4.1 0-1.8-.8-3.1-2.3-3.8s-3.5-1.3-5.8-1.7-4.6-.9-6.9-1.4c-2.3-.6-4.2-1.6-5.7-2.9-1.6-1.4-2.3-3.5-2.3-6.3 0-4.1 1.5-6.9 4.6-8.5s6.4-2.4 9.9-2.4c2.6 0 5 .3 7.2.9 2.2.6 4.3 1.4 6.1 2.4l.8 8.8-5.8.7-.8-5.7c-2.3-1-4.7-1.6-7.2-1.6-2.1 0-3.7.4-5.1 1.1-1.3.8-2 2-2 3.8 0 1.7.8 2.9 2.3 3.6 1.5.7 3.4 1.2 5.7 1.6 2.2.4 4.5.8 6.7 1.4 2.2.6 4.1 1.6 5.7 3 1.4 1.6 2.2 3.7 2.2 6.6zM197.6 73.2h-17.1v-5.5h3.8V51.9c0-3.7-.7-6.3-2.1-7.9-1.4-1.6-3.3-2.3-5.7-2.3-3.2 0-5.6 1.1-7.2 3.4s-2.4 4.6-2.5 6.9v15.6h6v5.5h-17.1v-5.5h3.8V51.9c0-3.8-.7-6.4-2.1-7.9-1.4-1.5-3.3-2.3-5.6-2.3-3.2 0-5.5 1.1-7.2 3.3-1.6 2.2-2.4 4.5-2.5 6.9v15.8h6.9v5.5h-20.2v-5.5h6V42.4h-6.1v-5.6h13.4v6.4c1.2-2.1 2.7-3.8 4.7-5.2 2-1.3 4.4-2 7.3-2s5.3.7 7.5 2.1c2.2 1.4 3.7 3.5 4.5 6.4 1.1-2.5 2.7-4.5 4.9-6.1s4.8-2.4 7.9-2.4c3.5 0 6.5 1.1 8.9 3.3s3.7 5.6 3.7 10.2v18.2h6.1v5.5zm42.5 0h-13.2V66c-1.2 2.2-2.8 4.1-4.9 5.6-2.1 1.6-4.8 2.4-8.3 2.4-4.8 0-8.7-1.6-11.6-4.9-2.9-3.2-4.3-7.7-4.3-13.3 0-5 1.3-9.6 4-13.7 2.6-4.1 6.9-6.2 12.8-6.2s9.8 2.2 12.3 6.5V22.7h-8.6v-5.6h15.8v50.6h6v5.5zm-13.3-16.8V52c-.1-3-1.2-5.5-3.2-7.3s-4.4-2.8-7.2-2.8c-3.6 0-6.3 1.3-8.2 3.9-1.9 2.6-2.8 5.8-2.8 9.6 0 4.1 1 7.3 3 9.5s4.5 3.3 7.4 3.3c3.2 0 5.8-1.3 7.8-3.8 2.1-2.6 3.1-5.3 3.2-8zm61.5 16.8H269v-5.5h6V51.9c0-3.7-.7-6.3-2.2-7.9-1.4-1.6-3.4-2.3-5.7-2.3-3.1 0-5.6 1-7.4 3s-2.8 4.4-2.9 7v15.9h6v5.5h-19.3v-5.5h6V42.4h-6.2v-5.6h13.6V43c2.6-4.6 6.8-6.9 12.7-6.9 3.6 0 6.7 1.1 9.2 3.3s3.7 5.6 3.7 10.2v18.2h6v5.4h-.2z" class="logo-text"></path></svg></a><button title="Open main menu" type="button" class="button action has-icon main-menu-toggle" aria-haspopup="menu" aria-label="Open main menu" aria-expanded="false"><span class="button-wrap"><span class="icon icon-menu "></span><span class="visually-hidden">Open main menu</span></span></button></div><div class="top-navigation-main"><nav class="main-nav" aria-label="Main menu"><ul class="main-menu nojs"><li class="top-level-entry-container active"><button type="button" id="references-button" class="top-level-entry menu-toggle" aria-controls="references-menu" aria-expanded="false">References</button><a href="/ja/docs/Web" class="top-level-entry">References</a><ul id="references-menu" class="submenu references hidden inline-submenu-lg" aria-labelledby="references-button"><li class="apis-link-container mobile-only "><a href="/ja/docs/Web" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Overview / Web Technology</div><p class="submenu-item-description">Web technology reference for developers</p></div></a></li><li class="html-link-container "><a href="/ja/docs/Web/HTML" class="submenu-item "><div class="submenu-icon html"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTML</div><p class="submenu-item-description">Structure of content on the web</p></div></a></li><li class="css-link-container "><a href="/ja/docs/Web/CSS" class="submenu-item "><div class="submenu-icon css"></div><div class="submenu-content-container"><div class="submenu-item-heading">CSS</div><p class="submenu-item-description">Code used to describe document style</p></div></a></li><li class="javascript-link-container "><a href="/ja/docs/Web/JavaScript" class="submenu-item "><div class="submenu-icon javascript"></div><div class="submenu-content-container"><div class="submenu-item-heading">JavaScript</div><p class="submenu-item-description">General-purpose scripting language</p></div></a></li><li class="http-link-container "><a href="/ja/docs/Web/HTTP" class="submenu-item "><div class="submenu-icon http"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTTP</div><p class="submenu-item-description">Protocol for transmitting web resources</p></div></a></li><li class="apis-link-container "><a href="/ja/docs/Web/API" class="submenu-item "><div class="submenu-icon apis"></div><div class="submenu-content-container"><div class="submenu-item-heading">Web APIs</div><p class="submenu-item-description">Interfaces for building web applications</p></div></a></li><li class="apis-link-container "><a href="/ja/docs/Mozilla/Add-ons/WebExtensions" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Web Extensions</div><p class="submenu-item-description">Developing extensions for web browsers</p></div></a></li><li class="apis-link-container desktop-only "><a href="/ja/docs/Web" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Web Technology</div><p class="submenu-item-description">Web technology reference for developers</p></div></a></li></ul></li><li class="top-level-entry-container "><button type="button" id="guides-button" class="top-level-entry menu-toggle" aria-controls="guides-menu" aria-expanded="false">Guides</button><a href="/ja/docs/Learn" class="top-level-entry">Guides</a><ul id="guides-menu" class="submenu guides hidden inline-submenu-lg" aria-labelledby="guides-button"><li class="apis-link-container mobile-only "><a href="/ja/docs/Learn" class="submenu-item "><div class="submenu-icon learn"></div><div class="submenu-content-container"><div class="submenu-item-heading">Overview / MDN Learning Area</div><p class="submenu-item-description">Learn web development</p></div></a></li><li class="apis-link-container desktop-only "><a href="/ja/docs/Learn" class="submenu-item "><div class="submenu-icon learn"></div><div class="submenu-content-container"><div class="submenu-item-heading">MDN Learning Area</div><p class="submenu-item-description">Learn web development</p></div></a></li><li class="html-link-container "><a href="/ja/docs/Learn/HTML" class="submenu-item "><div class="submenu-icon html"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTML</div><p class="submenu-item-description">Learn to structure web content with HTML</p></div></a></li><li class="css-link-container "><a href="/ja/docs/Learn/CSS" class="submenu-item "><div class="submenu-icon css"></div><div class="submenu-content-container"><div class="submenu-item-heading">CSS</div><p class="submenu-item-description">Learn to style content using CSS</p></div></a></li><li class="javascript-link-container "><a href="/ja/docs/Learn/JavaScript" class="submenu-item "><div class="submenu-icon javascript"></div><div class="submenu-content-container"><div class="submenu-item-heading">JavaScript</div><p class="submenu-item-description">Learn to run scripts in the browser</p></div></a></li><li class=" "><a href="/ja/docs/Web/Accessibility" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Accessibility</div><p class="submenu-item-description">Learn to make the web accessible to all</p></div></a></li></ul></li><li class="top-level-entry-container "><button type="button" id="mdn-plus-button" class="top-level-entry menu-toggle" aria-controls="mdn-plus-menu" aria-expanded="false">Plus</button><a href="/ja/plus" class="top-level-entry">Plus</a><ul id="mdn-plus-menu" class="submenu mdn-plus hidden inline-submenu-lg" aria-labelledby="mdn-plus-button"><li class=" "><a href="/ja/plus" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Overview</div><p class="submenu-item-description">A customized MDN experience</p></div></a></li><li class=" "><a href="/ja/plus/ai-help" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">AI Help</div><p class="submenu-item-description">Get real-time assistance and support</p></div></a></li><li class=" "><a href="/ja/plus/updates" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Updates</div><p class="submenu-item-description">All browser compatibility updates at a glance</p></div></a></li><li class=" "><a href="/en-US/plus/docs/features/overview" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Documentation</div><p class="submenu-item-description">Learn how to use MDN Plus</p></div></a></li><li class=" "><a href="/en-US/plus/docs/faq" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">FAQ</div><p class="submenu-item-description">Frequently asked questions about MDN Plus</p></div></a></li></ul></li><li class="top-level-entry-container "><a class="top-level-entry menu-link" href="/en-US/curriculum/">Curriculum <sup class="new">New</sup></a></li><li class="top-level-entry-container "><a class="top-level-entry menu-link" href="/en-US/blog/">Blog</a></li><li class="top-level-entry-container "><button type="button" id="tools-button" class="top-level-entry menu-toggle" aria-controls="tools-menu" aria-expanded="false">Tools</button><ul id="tools-menu" class="submenu tools hidden inline-submenu-lg" aria-labelledby="tools-button"><li class=" "><a href="/ja/play" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">Playground</div><p class="submenu-item-description">Write, test and share your code</p></div></a></li><li class=" "><a href="/en-US/observatory" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">HTTP Observatory</div><p class="submenu-item-description">Scan a website for free</p></div></a></li><li class=" "><a href="/en-US/plus/ai-help" class="submenu-item "><div class="submenu-icon"></div><div class="submenu-content-container"><div class="submenu-item-heading">AI Help</div><p class="submenu-item-description">Get real-time assistance and support</p></div></a></li></ul></li></ul></nav><div class="header-search"><form action="/ja/search" class="search-form search-widget" id="top-nav-search-form" role="search"><label id="top-nav-search-label" for="top-nav-search-input" class="visually-hidden">Search MDN</label><input aria-activedescendant="" aria-autocomplete="list" aria-controls="top-nav-search-menu" aria-expanded="false" aria-labelledby="top-nav-search-label" autoComplete="off" id="top-nav-search-input" role="combobox" type="search" class="search-input-field" name="q" placeholder="   " required="" value=""/><button type="button" class="button action has-icon clear-search-button"><span class="button-wrap"><span class="icon icon-cancel "></span><span class="visually-hidden">Clear search input</span></span></button><button type="submit" class="button action has-icon search-button"><span class="button-wrap"><span class="icon icon-search "></span><span class="visually-hidden">Search</span></span></button><div id="top-nav-search-menu" role="listbox" aria-labelledby="top-nav-search-label"></div></form></div><div class="theme-switcher-menu"><button type="button" class="button action has-icon theme-switcher-menu small" aria-haspopup="menu"><span class="button-wrap"><span class="icon icon-theme-os-default "></span>Theme</span></button></div><ul class="auth-container"><li><a href="/users/fxa/login/authenticate/?next=%2Fja%2Fdocs%2FWeb%2FAPI%2FScreen_Capture_API%2FUsing_Screen_Capture" class="login-link" rel="nofollow">Log in</a></li><li><a href="/users/fxa/login/authenticate/?next=%2Fja%2Fdocs%2FWeb%2FAPI%2FScreen_Capture_API%2FUsing_Screen_Capture" target="_self" rel="nofollow" class="button primary mdn-plus-subscribe-link"><span class="button-wrap">Sign up for free</span></a></li></ul></div></div></header><div class="article-actions-container"><div class="container"><button type="button" class="button action has-icon sidebar-button" aria-label="Expand sidebar" aria-expanded="false" aria-controls="sidebar-quicklinks"><span class="button-wrap"><span class="icon icon-sidebar "></span></span></button><nav class="breadcrumbs-container" aria-label="Breadcrumb"><ol typeof="BreadcrumbList" vocab="https://schema.org/" aria-label="breadcrumbs"><li property="itemListElement" typeof="ListItem"><a href="/ja/docs/Web" class="breadcrumb" property="item" typeof="WebPage"><span property="name">開発者向けのウェブ技術</span></a><meta property="position" content="1"/></li><li property="itemListElement" typeof="ListItem"><a href="/ja/docs/Web/API" class="breadcrumb" property="item" typeof="WebPage"><span property="name">Web API</span></a><meta property="position" content="2"/></li><li property="itemListElement" typeof="ListItem"><a href="/ja/docs/Web/API/Screen_Capture_API" class="breadcrumb" property="item" typeof="WebPage"><span property="name">画面キャプチャ API</span></a><meta property="position" content="3"/></li><li property="itemListElement" typeof="ListItem"><a href="/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" class="breadcrumb-current-page" property="item" typeof="WebPage"><span property="name">画面キャプチャ API の使用</span></a><meta property="position" content="4"/></li></ol></nav><div class="article-actions"><button type="button" class="button action has-icon article-actions-toggle" aria-label="Article actions"><span class="button-wrap"><span class="icon icon-ellipses "></span><span class="article-actions-dialog-heading">Article Actions</span></span></button><ul class="article-actions-entries"><li class="article-actions-entry"><div class="languages-switcher-menu open-on-focus-within"><button id="languages-switcher-button" type="button" class="button action small has-icon languages-switcher-menu" aria-haspopup="menu"><span class="button-wrap"><span class="icon icon-language "></span>日本語</span></button><div class="hidden"><ul class="submenu language-menu " aria-labelledby="language-menu-button"><li class=" "><form class="submenu-item locale-redirect-setting"><div class="group"><label class="switch"><input type="checkbox" name="locale-redirect"/><span class="slider"></span><span class="label">Remember language</span></label><a href="https://github.com/orgs/mdn/discussions/739" rel="external noopener noreferrer" target="_blank" title="Enable this setting to automatically switch to this language when it&#x27;s available. (Click to learn more.)"><span class="icon icon-question-mark "></span></a></div></form></li><li class=" "><a data-locale="de" href="/de/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" class="button submenu-item"><span>Deutsch</span><span title="Diese Übersetzung ist Teil eines Experiments."><span class="icon icon-experimental "></span></span></a></li><li class=" "><a data-locale="en-US" href="/en-US/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" class="button submenu-item"><span>English (US)</span></a></li><li class=" "><a data-locale="es" href="/es/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" class="button submenu-item"><span>Español</span></a></li><li class=" "><a data-locale="ru" href="/ru/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" class="button submenu-item"><span>Русский</span></a></li></ul></div></div></li></ul></div></div></div></div><div class="container"><div class="notecard localized-content-note"><p><a href="/ja/docs/MDN/Community/Contributing/Translated_content#アクティブなロケール">このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。</a></p></div></div><div class="main-wrapper"><div class="sidebar-container"><aside id="sidebar-quicklinks" class="sidebar" data-macro="DefaultAPISidebar"><button type="button" class="button action backdrop" aria-label="Collapse sidebar"><span class="button-wrap"></span></button><nav aria-label="Related Topics" class="sidebar-inner"><header class="sidebar-actions"><section class="sidebar-filter-container"><div class="sidebar-filter "><label id="sidebar-filter-label" class="sidebar-filter-label" for="sidebar-filter-input"><span class="icon icon-filter"></span><span class="visually-hidden">Filter sidebar</span></label><input id="sidebar-filter-input" autoComplete="off" class="sidebar-filter-input-field false" type="text" placeholder="Filter" value=""/><button type="button" class="button action has-icon clear-sidebar-filter-button"><span class="button-wrap"><span class="icon icon-cancel "></span><span class="visually-hidden">Clear filter input</span></span></button></div></section></header><div class="sidebar-inner-nav"><div class="in-nav-toc"><div class="document-toc-container"><section class="document-toc"><header><h2 class="document-toc-heading">この記事では</h2></header><ul class="document-toc-list"><li class="document-toc-item "><a class="document-toc-link" href="#画面の内容のキャプチャ">画面の内容のキャプチャ</a></li><li class="document-toc-item "><a class="document-toc-link" href="#キャプチャしたストリームの使用">キャプチャしたストリームの使用</a></li><li class="document-toc-item "><a class="document-toc-link" href="#例">例</a></li><li class="document-toc-item "><a class="document-toc-link" href="#セキュリティ">セキュリティ</a></li><li class="document-toc-item "><a class="document-toc-link" href="#ブラウザーの互換性">ブラウザーの互換性</a></li><li class="document-toc-item "><a class="document-toc-link" href="#関連情報">関連情報</a></li></ul></section></div></div><div class="sidebar-body"><ol><li class="section"><a href="/ja/docs/Web/API/Screen_Capture_API">Screen Capture API</a></li><li class="toggle"><details open=""><summary>ガイド</summary><ol><li><em><a href="/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" aria-current="page">画面キャプチャ API の使用</a></em></li></ol></details></li><li class="toggle"><details open=""><summary>インターフェイス</summary><ol><li><a href="/ja/docs/Web/API/CaptureController"><code>CaptureController</code></a></li></ol></details></li><li class="toggle"><details open=""><summary>プロパティ</summary><ol><li><a href="/ja/docs/Web/API/MediaTrackConstraints/displaySurface"><code>MediaTrackConstraints.displaySurface</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackConstraints/logicalSurface"><code>MediaTrackConstraints.logicalSurface</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackConstraints/suppressLocalAudioPlayback"><code>MediaTrackConstraints.suppressLocalAudioPlayback</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSettings/cursor"><code>MediaTrackSettings.cursor</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSettings/displaySurface"><code>MediaTrackSettings.displaySurface</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSettings/logicalSurface"><code>MediaTrackSettings.logicalSurface</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSettings/suppressLocalAudioPlayback"><code>MediaTrackSettings.suppressLocalAudioPlayback</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSupportedConstraints/displaySurface"><code>MediaTrackSupportedConstraints.displaySurface</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSupportedConstraints/logicalSurface"><code>MediaTrackSupportedConstraints.logicalSurface</code></a></li><li><a href="/ja/docs/Web/API/MediaTrackSupportedConstraints/suppressLocalAudioPlayback"><code>MediaTrackSupportedConstraints.suppressLocalAudioPlayback</code></a></li></ol></details></li><li class="toggle"><details open=""><summary>メソッド</summary><ol><li><a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia"><code>MediaDevices.getDisplayMedia()</code></a></li></ol></details></li></ol></div></div><section class="place side"></section></nav></aside><div class="toc-container"><aside class="toc"><nav><div class="document-toc-container"><section class="document-toc"><header><h2 class="document-toc-heading">この記事では</h2></header><ul class="document-toc-list"><li class="document-toc-item "><a class="document-toc-link" href="#画面の内容のキャプチャ">画面の内容のキャプチャ</a></li><li class="document-toc-item "><a class="document-toc-link" href="#キャプチャしたストリームの使用">キャプチャしたストリームの使用</a></li><li class="document-toc-item "><a class="document-toc-link" href="#例">例</a></li><li class="document-toc-item "><a class="document-toc-link" href="#セキュリティ">セキュリティ</a></li><li class="document-toc-item "><a class="document-toc-link" href="#ブラウザーの互換性">ブラウザーの互換性</a></li><li class="document-toc-item "><a class="document-toc-link" href="#関連情報">関連情報</a></li></ul></section></div></nav></aside><section class="place side"></section></div></div><main id="content" class="main-content "><article class="main-page-content" lang="ja"><header><h1>画面キャプチャ API の使用</h1><details class="baseline-indicator not"><summary><span class="indicator" role="img" aria-label="Baseline Cross"></span><h2><span class="not-bold">Limited availability</span></h2><div class="browsers"><span class="engine" title="Not widely supported in Chrome, and supported in Edge"><span class="browser chrome " role="img" aria-label="Chrome cross"></span><span class="browser edge supported" role="img" aria-label="Edge check"></span></span><span class="engine" title="Not widely supported in Firefox"><span class="browser firefox " role="img" aria-label="Firefox cross"></span></span><span class="engine" title="Not widely supported in Safari"><span class="browser safari " role="img" aria-label="Safari cross"></span></span></div><span class="icon icon-chevron "></span></summary><div class="extra"><p>This feature is not Baseline because it does not work in some of the most widely-used browsers.</p><ul><li><a href="/ja/docs/Glossary/Baseline/Compatibility" data-glean="baseline_link_learn_more" target="_blank" class="learn-more">Learn more</a></li><li><a href="#ブラウザーの互換性" data-glean="baseline_link_bcd_table">See full compatibility</a></li><li><a href="https://survey.alchemer.com/s3/7634825/MDN-baseline-feedback?page=%2Fja%2Fdocs%2FWeb%2FAPI%2FScreen_Capture_API%2FUsing_Screen_Capture&amp;level=not" data-glean="baseline_link_feedback" class="feedback-link" target="_blank" rel="noreferrer">Report feedback</a></li></ul></div></details></header><div class="section-content"><p>この記事では、画面キャプチャ API とその <a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="getDisplayMedia()"><code>getDisplayMedia()</code></a> メソッドを使用して、 <a href="/ja/docs/Web/API/WebRTC_API">WebRTC</a> 会議セッション中に画面の一部または全部をストリーミング、録音、共有用に取得する方法を検証していきます。</p> <div class="notecard note"> <p><strong>メモ:</strong> 最近のバージョンの <a href="https://github.com/webrtcHacks/adapter" class="external" target="_blank">WebRTC adapter.js shim</a> には <code>getDisplayMedia()</code> の実装が含まれており、画面共有をサポートしているが現在の標準 API を実装していないブラウザーで画面共有を可能にすることができるので便利かもしれません。これは、少なくとも Chrome、Edge、Firefox で動作します。</p> </div></div><section aria-labelledby="画面の内容のキャプチャ"><h2 id="画面の内容のキャプチャ"><a href="#画面の内容のキャプチャ">画面の内容のキャプチャ</a></h2><div class="section-content"><p>画面の内容をライブの <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> でキャプチャするには、 <a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="navigator.mediaDevices.getDisplayMedia()"><code>navigator.mediaDevices.getDisplayMedia()</code></a> を呼び出すことで開始され、ライブ画面の内容を含むストリームに解決するプロミスが返されます。下記の例で参照されている <code>displayMediaOptions</code> オブジェクトは、このようになるかもしれません。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>const displayMediaOptions = { video: { displaySurface: "browser", }, audio: { suppressLocalAudioPlayback: false, }, preferCurrentTab: false, selfBrowserSurface: "exclude", systemAudio: "include", surfaceSwitching: "include", monitorTypeSurfaces: "include", }; </code></pre></div></div></section><section aria-labelledby="画面キャプチャの開始_asyncawait_スタイル"><h3 id="画面キャプチャの開始_asyncawait_スタイル"><a href="#画面キャプチャの開始_asyncawait_スタイル">画面キャプチャの開始: <code>async</code>/<code>await</code> スタイル</a></h3><div class="section-content"><div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>async function startCapture(displayMediaOptions) { let captureStream = null; try { captureStream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); } catch (err) { console.error(`Error: ${err}`); } return captureStream; } </code></pre></div> <p>このコードは、上記のように非同期関数と <a href="/ja/docs/Web/JavaScript/Reference/Operators/await"><code>await</code></a> 演算子を使うか、下記のように <a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise"><code>Promise</code></a> を直接使って記述することができます。</p></div></section><section aria-labelledby="画面キャプチャの開始_promise_スタイル"><h3 id="画面キャプチャの開始_promise_スタイル"><a href="#画面キャプチャの開始_promise_スタイル">画面キャプチャの開始: <code>Promise</code> スタイル</a></h3><div class="section-content"><div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>function startCapture(displayMediaOptions) { return navigator.mediaDevices .getDisplayMedia(displayMediaOptions) .catch((err) =&gt; { console.error(err); return null; }); } </code></pre></div> <p>いずれにせよ、<a href="/ja/docs/Glossary/User_agent">ユーザーエージェント</a>は、共有する画面領域を選択するようユーザーに促すユーザーインターフェイスを提示して応答します。これらの <code>startCapture()</code> の実装はどちらも、キャプチャされた表示画像を含む <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> を返します。</p> <p>必要な画面の種類を指定する方法と、結果として得られるストリームを調整する他の方法については、以下の<a href="#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E5%88%B6%E7%B4%84">オプションと制約</a>を参照してください。</p></div></section><section aria-labelledby="キャプチャする表示面を選択するウィンドウの例"><h3 id="キャプチャする表示面を選択するウィンドウの例"><a href="#キャプチャする表示面を選択するウィンドウの例">キャプチャする表示面を選択するウィンドウの例</a></h3><div class="section-content"><p> <img src="/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture/chrome-screen-capture-window.png" alt="Chrome のソース面を選ぶウィンドウの画面ショット" width="1239" height="1041" loading="lazy"> </p> <p>そして、キャプチャしたストリーム <code>captureStream</code> を、ストリームを入力として受け付けるあらゆるものに使用することができます。以下の<a href="#%E4%BE%8B">例</a>は、ストリームを利用するためのいくつかの方法を示しています。</p></div></section><section aria-labelledby="可視表示面と論理表示面"><h3 id="可視表示面と論理表示面"><a href="#可視表示面と論理表示面">可視表示面と論理表示面</a></h3><div class="section-content"><p>画面キャプチャ API の用語では、<strong>表示面</strong>は、共有のために API によって選択できる任意のコンテンツオブジェクトです。共有面には、ブラウザータブのコンテンツ、完全なウィンドウ、 1 つの面に結合されたアプリケーションのすべてのウィンドウ、およびモニター(または 1 つの面に結合されたモニターのグループ)が含まれます。</p> <p>表示面には 2 種類あります。<strong>可視表示面</strong>とは、最前面のウィンドウやタブ、あるいは画面全体など、画面上で全体が見える表示面です。</p> <p><strong>論理的表示面</strong>とは、他のオブジェクトとある程度重なっていたり、完全に隠れていたり、画面外にあったりして、部分的または完全に隠されているものです。画面キャプチャ API でこれらをどのように処理するかは、さまざまです。一般にブラウザーは、論理的な表示面の隠れた部分をぼかしたり、色やパターンに置き換えたりして、何らかの方法で隠蔽した画像を提供します。これはセキュリティ上の理由から行われるもので、ユーザーが見ることのできないコンテンツには、共有したくないデータが含まれている可能性があるからです。</p> <p>ユーザーエージェントは,ユーザーから許可を得た上で,不明瞭なウィンドウの全コンテンツのキャプチャを許可するかもしれません。この場合,ユーザーエージェントは,ウィンドウの隠された部分の現在の内容を取得することによって,または現在の内容が利用可能でない場合には最も最近表示された内容を提示することによって,隠された内容を含むことができます。</p></div></section><section aria-labelledby="オプションと制約"><h3 id="オプションと制約"><a href="#オプションと制約">オプションと制約</a></h3><div class="section-content"><p><a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="getDisplayMedia()"><code>getDisplayMedia()</code></a> に渡される制約オブジェクトは、結果のストリームを設定するために使用されるオブジェクトです。</p> <p>options オブジェクトに渡す <code>video</code> と <code>audio</code> オブジェクトには、それらの映像トラックに特定の制約を追加することもできます。<a href="/en-US/docs/Web/API/MediaTrackConstraints" class="only-in-en-us" title="このページは現在、英語のみで利用可能です。">共有画面トラックのプロパティ</a>では、 <a class="only-in-en-us" title="このページは現在、英語のみで利用可能です。" href="/en-US/docs/Web/API/MediaTrackConstraints"><code>MediaTrackConstraints</code></a>、<a href="/ja/docs/Web/API/MediaTrackSupportedConstraints"><code>MediaTrackSupportedConstraints</code></a>、<a class="only-in-en-us" title="このページは現在、英語のみで利用可能です。" href="/en-US/docs/Web/API/MediaTrackSettings"><code>MediaTrackSettings</code></a> に追加された画面キャプチャストリームの構成に関する制約について参照できます。</p> <p>キャプチャするコンテンツが選択されるまで、どのような制約も適用されません。制約は、結果のストリームに表示される内容を変更します。たとえば、動画に <a class="only-in-en-us" title="このページは現在、英語のみで利用可能です。" href="/en-US/docs/Web/API/MediaTrackConstraints/width"><code>width</code></a> 制約を指定すると、ユーザーが共有する領域を選択した後に動画を拡大縮小することによって適用されます。ソース自体のサイズに制約を設けるものではありません。</p> <div class="notecard note"> <p><strong>メモ:</strong> 制約によって、画面共有 API でキャプチャ可能なソースのリストが変更されることは決してありません。このため、ウェブアプリケーションでは、1 つの項目が残るまでソースリストを制限することによって、ユーザーに特定のコンテンツを共有するように強制することはできません。</p> </div> <p>表示のキャプチャが行われている間、画面共有を行っているマシンは、共有が行われていることをユーザーに認識させるために、何らかのインジケーターを表示します。</p> <div class="notecard note"> <p><strong>メモ:</strong> プライバシーとセキュリティ上の理由から、画面共有のソースは <a href="/ja/docs/Web/API/MediaDevices/enumerateDevices" title="enumerateDevices()"><code>enumerateDevices()</code></a> を使って列挙することができないようになっています。これに関連して、<code>getDisplayMedia()</code> で利用できるソースに変更があった場合も、 <a href="/ja/docs/Web/API/MediaDevices/devicechange_event" title="devicechange"><code>devicechange</code></a> イベントは送信されません。</p> </div></div></section><section aria-labelledby="共有音声のキャプチャ"><h3 id="共有音声のキャプチャ"><a href="#共有音声のキャプチャ">共有音声のキャプチャ</a></h3><div class="section-content"><p><a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="getDisplayMedia()"><code>getDisplayMedia()</code></a> は、ユーザーの画面(またはその一部)の動画をキャプチャするために最も一般的に使用されています。しかし、<a href="/ja/docs/Glossary/User_agent">ユーザーエージェント</a>は、動画コンテンツと一緒に音声のキャプチャを許可する場合があります。この音声のソースは、選択されたウィンドウ、コンピューター全体のオーディオシステム、またはユーザーのマイク(または上記のすべての組み合わせ)であるかもしれません。</p> <p>音声の共有が必要なプロジェクトを始める前に、 <a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7">ブラウザーの互換性</a>を確認し、互換性を希望するブラウザーがキャプチャした画面ストリームに音声のサポートがあるかどうかを確認してください。</p> <p>音声を含む画面の共有を要求するには、 <code>getDisplayMedia()</code> に渡すオプションは次のようになります。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>const displayMediaOptions = { video: true, audio: true, }; </code></pre></div> <p>これにより、ユーザーエージェントが対応する範囲内で、ユーザーが希望するものを自由に選択することができます。これは、 <code>audio</code> と <code>video</code> のそれぞれに追加の情報を指定することで、さらに改良することができます。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>const displayMediaOptions = { video: { displaySurface: "window", }, audio: { echoCancellation: true, noiseSuppression: true, sampleRate: 44100, suppressLocalAudioPlayback: true, }, surfaceSwitching: "include", selfBrowserSurface: "exclude", systemAudio: "exclude", }; </code></pre></div> <p>この例では、カーソルは常にキャプチャで表示され、音声トラックはノイズ抑制とエコーキャンセル機能を有効にし、音声のサンプリングレートは 44.1kHz が理想的です。</p> <p>加えて、アプリはユーザーエージェントにすべきことのヒントを与えています。</p> <ul> <li>画面共有中にユーザーが共有タブを動的に切り替えられるように制御する機能を提供しています。</li> <li>キャプチャがリクエストされたときにユーザーに表示されているオプションリストから現在のタブを非表示にします。</li> <li>ユーザーに提供可能な音声ソースにシステム音声を含めないようにします。</li> </ul> <p>音声のキャプチャは常にオプションです。ウェブコンテンツが音声と動画の両方を含むストリームを要求した場合でも、返される <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> は、音声なしの 1 つの動画トラックのみとなる場合があります。</p></div></section><section aria-labelledby="キャプチャしたストリームの使用"><h2 id="キャプチャしたストリームの使用"><a href="#キャプチャしたストリームの使用">キャプチャしたストリームの使用</a></h2><div class="section-content"><p><a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise"><code>promise</code></a> が返す <a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="getDisplayMedia()"><code>getDisplayMedia()</code></a> は、画面または画面領域を含む少なくとも一つの動画ストリームを含み、 <code>getDisplayMedia()</code> が呼ばれたときに指定した制約に基づいて調整またはフィルタリングされた <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> に解決されます。</p></div></section><section aria-labelledby="潜在的なリスク"><h3 id="潜在的なリスク"><a href="#潜在的なリスク">潜在的なリスク</a></h3><div class="section-content"><p>画面共有を取り巻くプライバシーとセキュリティの問題は、通常、それほど深刻ではありませんが、実際に存在します。最も大きな潜在的問題は、ユーザーが共有したくないコンテンツを不注意に共有してしまうことです。</p> <p>たとえば、ユーザーが自分の画面を共有しているときに、見えている背景のウィンドウにたまたま個人情報が含まれていたり、パスワードマネージャーが共有ストリームに見えていたりすると、プライバシーやセキュリティの侵害が容易に発生します。論理的な表示面をキャプチャする場合、この影響は増幅される可能性があり、ユーザーは見るどころか、全く知らないコンテンツを含んでいる可能性があります。</p> <p>プライバシーを真剣に考えるユーザーエージェントは、特にそのコンテンツを共有する権限が与えられていない限り、画面上に実際に表示されていないコンテンツを難読化する必要があります。</p></div></section><section aria-labelledby="表示コンテンツのキャプチャの許可"><h3 id="表示コンテンツのキャプチャの許可"><a href="#表示コンテンツのキャプチャの許可">表示コンテンツのキャプチャの許可</a></h3><div class="section-content"><p>キャプチャした画面コンテンツのストリーミングを開始する前に、<a href="/ja/docs/Glossary/User_agent">ユーザーエージェント</a>は共有の要求を確認し、共有するコンテンツを選択するようユーザーに要求します。</p></div></section><section aria-labelledby="例"><h2 id="例"><a href="#例">例</a></h2><div class="section-content"></div></section><section aria-labelledby="単純な画面キャプチャ"><h3 id="単純な画面キャプチャ"><a href="#単純な画面キャプチャ">単純な画面キャプチャ</a></h3><div class="section-content"><p>この例では、キャプチャした画面領域の内容を、同じページ内の <a href="/ja/docs/Web/HTML/Element/video"><code>&lt;video&gt;</code></a> 要素にストリーミングしています。</p> <h4 id="javascript">JavaScript</h4> <p>この機能を実現するために必要なコードはそれほど多くありません。 <a href="/ja/docs/Web/API/MediaDevices/getUserMedia" title="getUserMedia()"><code>getUserMedia()</code></a> を使ってカメラから動画を取り込むことに慣れているなら、 <a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="getDisplayMedia()"><code>getDisplayMedia()</code></a> は非常に身近に感じることでしょう。</p> <h5 id="セットアップ">セットアップ</h5> <p>まず、アクセスする必要のあるページ上の要素を参照するために、いくつかの定数が設定されます。キャプチャされた画面のコンテンツがストリームされる <a href="/ja/docs/Web/HTML/Element/video"><code>&lt;video&gt;</code></a>、ログ出力が描かれるボックス、画面イメージのキャプチャをオン/オフする開始/停止ボタンがあります。</p> <p>オブジェクト <code>displayMediaOptions</code> には <code>getDisplayMedia()</code> に渡す制約が含まれています。ここでは <a class="only-in-en-us" title="このページは現在、英語のみで利用可能です。" href="/en-US/docs/Web/API/MediaTrackConstraints/displaySurface"><code>displaySurface</code></a> プロパティを <code>always</code> に設定しており、マウスカーソルを常にキャプチャメディアに含めることを指定しています。</p> <p>最後に、イベントリスナーを設定して、スタートボタンとストップボタンに対するユーザーのクリックを検出します。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>const videoElem = document.getElementById("video"); const logElem = document.getElementById("log"); const startElem = document.getElementById("start"); const stopElem = document.getElementById("stop"); // Options for getDisplayMedia() const displayMediaOptions = { video: { displaySurface: "window", }, audio: false, }; // Set event listeners for the start and stop buttons startElem.addEventListener( "click", (evt) =&gt; { startCapture(); }, false, ); stopElem.addEventListener( "click", (evt) =&gt; { stopCapture(); }, false, ); </code></pre></div> <h5 id="内容のログ出力">内容のログ出力</h5> <p>エラーやその他の問題のログを簡単に取るために、この例では特定の <a href="/ja/docs/Web/API/console"><code>console</code></a> メソッドをオーバーライドして、そのメッセージを ID が <code>log</code> である <a href="/ja/docs/Web/HTML/Element/pre"><code>&lt;pre&gt;</code></a> ブロックに出力しています。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>console.log = (msg) =&gt; (logElem.textContent = `${logElem.textContent}\n${msg}`); console.error = (msg) =&gt; (logElem.textContent = `${logElem.textContent}\nError: ${msg}`); </code></pre></div> <p>これにより、おなじみの <a href="/ja/docs/Web/API/console/log_static" title="console.log()"><code>console.log()</code></a> や <a href="/ja/docs/Web/API/console/error_static" title="console.error()"><code>console.error()</code></a> などを使って、ドキュメント内のログボックスに情報を記録することができるようになります。</p> <h5 id="画面キャプチャの開始">画面キャプチャの開始</h5> <p>以下の <code>startCapture()</code> メソッドは、ユーザーが画面上で選択した領域から内容を取得する <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> のキャプチャを開始するものです。<code>startCapture()</code> は、 "Start Capture" ボタンがクリックされたときに呼び出されます。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>async function startCapture() { logElem.textContent = ""; try { videoElem.srcObject = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); dumpOptionsInfo(); } catch (err) { console.error(err); } } </code></pre></div> <p>前回の接続の際に残ったテキストを取り除くためにログの内容をクリアした後、<code>startCapture()</code> は <a href="/ja/docs/Web/API/MediaDevices/getDisplayMedia" title="getDisplayMedia()"><code>getDisplayMedia()</code></a> を呼び出し、そこに <code>displayMediaOptions</code> で定義された制約オブジェクトを渡します。jsxref("Operators/await", "await")}} を使用して、次のコード行は <code>getDisplayMedia()</code> が返す <a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise"><code>promise</code></a> が解決するまで実行されません。解決後、プロミスは <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> を返し、ユーザーが選択した画面、ウィンドウ、その他の領域の内容をストリームとして出力します。</p> <p>このストリームは、返された <code>MediaStream</code> を要素の <a href="/ja/docs/Web/API/HTMLMediaElement/srcObject" title="srcObject"><code>srcObject</code></a> に格納することによって <a href="/ja/docs/Web/HTML/Element/video"><code>&lt;video&gt;</code></a> 要素に接続されています。</p> <p><code>dumpOptionsInfo()</code> 関数は、後で見ることになりますが、教育的な目的のために、ストリームに関する情報をログボックスにダンプします。</p> <p>もし、どれかが失敗したら、 <a href="/ja/docs/Web/JavaScript/Reference/Statements/try...catch"><code>catch()</code></a> 節は、ログボックスにエラーメッセージを出力します。</p> <h5 id="画面キャプチャの停止">画面キャプチャの停止</h5> <p><code>stopCapture()</code> メソッドは "Stop Capture" ボタンがクリックされたときに呼び出されます。これは <a href="/ja/docs/Web/API/MediaStream/getTracks"><code>MediaStream.getTracks()</code></a> を用いてトラックリストを取得し、各トラックの <a href="/ja/docs/Web/API/MediaStreamTrack/stop" title="stop()"><code>stop()</code></a> メソッドを呼び出してストリームを停止させます。それが終わると、 <code>srcObject</code> に <code>null</code> がセットされ、ストリームが接続されていないことが誰にでも分かるようにします。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>function stopCapture(evt) { let tracks = videoElem.srcObject.getTracks(); tracks.forEach((track) =&gt; track.stop()); videoElem.srcObject = null; } </code></pre></div> <h5 id="設定情報のダンプ">設定情報のダンプ</h5> <p>参考までに、上記の <code>startCapture()</code> メソッドは <code>dumpOptions()</code> という名前のメソッドを呼び出し、現在のトラック設定と、ストリームが作成されたときに設定された制約を出力します。</p> <div class="code-example"><div class="example-header"><span class="language-name">js</span></div><pre class="brush: js notranslate"><code>function dumpOptionsInfo() { const videoTrack = videoElem.srcObject.getVideoTracks()[0]; console.log("Track settings:"); console.log(JSON.stringify(videoTrack.getSettings(), null, 2)); console.log("Track constraints:"); console.log(JSON.stringify(videoTrack.getConstraints(), null, 2)); } </code></pre></div> <p>トラックリストは、キャプチャした画面の <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> で <a href="/ja/docs/Web/API/MediaStream/getVideoTracks" title="getVideoTracks()"><code>getVideoTracks()</code></a> を呼び出すことで取得します。現在有効な設定は <a href="/ja/docs/Web/API/MediaStreamTrack/getSettings" title="getSettings()"><code>getSettings()</code></a> で、設定されている制約は <a href="/ja/docs/Web/API/MediaStreamTrack/getConstraints" title="getConstraints()"><code>getConstraints()</code></a> で取得されます。</p> <h4 id="html">HTML</h4> <p>HTML は簡単な紹介文から始まり、本題に入ります。</p> <div class="code-example"><div class="example-header"><span class="language-name">html</span></div><pre class="brush: html notranslate"><code>&lt;p&gt; この例では、ディスプレイの選択した部分の内容を表示します。 キャプチャ開始ボタンをクリックすると開始します。 &lt;/p&gt; &lt;p&gt; &lt;button id="start"&gt;キャプチャ開始&lt;/button&gt;&amp;nbsp;&lt;button id="stop"&gt; キャプチャ停止 &lt;/button&gt; &lt;/p&gt; &lt;video id="video" autoplay&gt;&lt;/video&gt; &lt;br /&gt; &lt;strong&gt;Log:&lt;/strong&gt; &lt;br /&gt; &lt;pre id="log"&gt;&lt;/pre&gt; </code></pre></div> <p>HTML の主要な部分は以下の通りです。</p> <ol> <li>"Start Capture" と書かれた <a href="/ja/docs/Web/HTML/Element/button"><code>&lt;button&gt;</code></a> は、クリックされると <code>startCapture()</code> 関数を呼び出し、画面コンテンツへのアクセスを要求し、キャプチャを開始します。</li> <li>"Stop Capture" というラベルの付いた 2 番目のボタンがあり、クリックされると <code>stopCapture()</code> を呼び出して画面のコンテンツのキャプチャを終了します。</li> <li>キャプチャされた画面の内容がストリームされる <a href="/ja/docs/Web/HTML/Element/video"><code>&lt;video&gt;</code></a>。</li> <li><a href="/ja/docs/Web/HTML/Element/pre"><code>&lt;pre&gt;</code></a> ブロック。この中では、インターセプトされた <a href="/ja/docs/Web/API/console"><code>console</code></a> メソッドによってログが記録されます。</li> </ol> <h4 id="css">CSS</h4> <p>この例では、 CSS は完全に外観上のものです。動画には境界線が付けられ、その幅は利用可能な水平方向のスペースのほぼ全体を占めるように設定されています (<code>width: 98%</code>)。 <a href="/ja/docs/Web/CSS/max-width"><code>max-width</code></a> には <code>860px</code> を設定し、動画のサイズに絶対的な上限を設定しています。</p> <div class="code-example"><div class="example-header"><span class="language-name">css</span></div><pre class="brush: css notranslate"><code>#video { border: 1px solid #999; width: 98%; max-width: 860px; } #log { width: 25rem; height: 15rem; border: 1px solid black; padding: 0.5rem; overflow: scroll; } </code></pre></div> <h4 id="結果">結果</h4> <p>最終的にはこのようになります。ブラウザーが画面キャプチャ API に対応している場合、"Start Capture" をクリックすると、共有する画面、ウィンドウ、タブを選択するための<a href="/ja/docs/Glossary/User_agent">ユーザーエージェント</a>のインターフェイスが表示されます。</p><div class="code-example"><div class="example-header"></div><iframe class="sample-code-frame" title="Streaming screen capture sample" id="frame_streaming_screen_capture" width="640" height="800" src="about:blank" data-live-path="/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture" data-live-id="streaming_screen_capture" allow="display-capture" sandbox="allow-same-origin allow-scripts" loading="lazy"></iframe></div></div></section><section aria-labelledby="セキュリティ"><h2 id="セキュリティ"><a href="#セキュリティ">セキュリティ</a></h2><div class="section-content"><p><a href="/ja/docs/Web/HTTP/Permissions_Policy">権限ポリシー</a>が有効なときに機能させるためには、 <code>display-capture</code> 権限が必要です。これは <a href="/ja/docs/Web/HTTP/Headers/Permissions-Policy"><code>Permissions-Policy</code></a> を用いて行うことができます。または、画面キャプチャ API を <a href="/ja/docs/Web/HTML/Element/iframe"><code>&lt;iframe&gt;</code></a> 内で使用している場合は、 <code>&lt;iframe&gt;</code> 要素の <a href="/ja/docs/Web/HTML/Element/iframe#allow"><code>allow</code></a> 属性を使用します。</p> <p>例えば、 HTTP ヘッダーのこの行は、文書と同じオリジンから読み込まれる埋め込み <a href="/ja/docs/Web/HTML/Element/iframe"><code>&lt;iframe&gt;</code></a> 要素の画面キャプチャ API を有効にします。</p> <div class="code-example"><div class="example-header"><span class="language-name">http</span></div><pre class="brush: http notranslate"><code>Permissions-Policy: display-capture=(self) </code></pre></div> <p>もし <code>&lt;iframe&gt;</code> 内で画面キャプチャを行うのであれば、そのフレームに対してのみ許可を要求することができ、より一般的な許可を要求するよりも明らかに安全です。</p> <div class="code-example"><div class="example-header"><span class="language-name">html</span></div><pre class="brush: html notranslate"><code>&lt;iframe src="https://mycode.example.net/etc" allow="display-capture"&gt; &lt;/iframe&gt; </code></pre></div></div></section><h2 id="ブラウザーの互換性"><a href="#ブラウザーの互換性">ブラウザーの互換性</a></h2><p>BCD tables only load in the browser<noscript> <!-- -->with JavaScript enabled. Enable JavaScript to view data.</noscript></p><section aria-labelledby="関連情報"><h2 id="関連情報"><a href="#関連情報">関連情報</a></h2><div class="section-content"><ul> <li><a href="/ja/docs/Web/API/Screen_Capture_API">画面キャプチャ API</a></li> <li><a href="/ja/docs/Web/API/Media_Capture_and_Streams_API">メディアキャプチャとストリーム API</a></li> <li><a href="/ja/docs/Web/API/Media_Capture_and_Streams_API/Taking_still_photos">WebRTC で静止画の写真を撮影</a></li> <li><a href="/ja/docs/Web/API/HTMLCanvasElement/captureStream"><code>HTMLCanvasElement.captureStream()</code></a> で <a href="/ja/docs/Web/HTML/Element/canvas"><code>&lt;canvas&gt;</code></a> のライブコンテンツの <a href="/ja/docs/Web/API/MediaStream"><code>MediaStream</code></a> を取得できる</li> </ul></div></section></article><aside class="article-footer"><div class="article-footer-inner"><div class="svg-container"><svg xmlns="http://www.w3.org/2000/svg" width="162" height="162" viewBox="0 0 162 162" fill="none" role="none"><mask id="b" fill="#fff"><path d="M97.203 47.04c8.113-7.886 18.004-13.871 28.906-17.492a78 78 0 0 1 33.969-3.39c11.443 1.39 22.401 5.295 32.024 11.411s17.656 14.28 23.476 23.86c5.819 9.579 9.269 20.318 10.083 31.385a69.85 69.85 0 0 1-5.387 32.44c-4.358 10.272-11.115 19.443-19.747 26.801-8.632 7.359-18.908 12.709-30.034 15.637l-6.17-21.698c7.666-2.017 14.746-5.703 20.694-10.773 5.948-5.071 10.603-11.389 13.606-18.467a48.14 48.14 0 0 0 3.712-22.352c-.561-7.625-2.938-15.025-6.948-21.625s-9.544-12.226-16.175-16.44-14.181-6.904-22.065-7.863a53.75 53.75 0 0 0-23.405 2.336c-7.513 2.495-14.327 6.62-19.918 12.053z"></path></mask><path stroke="url(#a)" stroke-dasharray="6, 6" stroke-width="2" d="M97.203 47.04c8.113-7.886 18.004-13.871 28.906-17.492a78 78 0 0 1 33.969-3.39c11.443 1.39 22.401 5.295 32.024 11.411s17.656 14.28 23.476 23.86c5.819 9.579 9.269 20.318 10.083 31.385a69.85 69.85 0 0 1-5.387 32.44c-4.358 10.272-11.115 19.443-19.747 26.801-8.632 7.359-18.908 12.709-30.034 15.637l-6.17-21.698c7.666-2.017 14.746-5.703 20.694-10.773 5.948-5.071 10.603-11.389 13.606-18.467a48.14 48.14 0 0 0 3.712-22.352c-.561-7.625-2.938-15.025-6.948-21.625s-9.544-12.226-16.175-16.44-14.181-6.904-22.065-7.863a53.75 53.75 0 0 0-23.405 2.336c-7.513 2.495-14.327 6.62-19.918 12.053z" mask="url(#b)" style="stroke:url(#a)" transform="translate(-63.992 -25.587)"></path><ellipse cx="8.066" cy="111.597" fill="var(--background-tertiary)" rx="53.677" ry="53.699" transform="matrix(.71707 -.697 .7243 .6895 0 0)"></ellipse><g clip-path="url(#c)" transform="translate(-63.992 -25.587)"><path fill="#9abff5" d="m144.256 137.379 32.906 12.434a4.41 4.41 0 0 1 2.559 5.667l-9.326 24.679a4.41 4.41 0 0 1-5.667 2.559l-8.226-3.108-2.332 6.17c-.466 1.233-.375 1.883-1.609 1.417l-2.253-.527c-.411-.155-.95-.594-1.206-1.161l-4.734-10.484-12.545-4.741a4.41 4.41 0 0 1-2.559-5.667l9.325-24.679a4.41 4.41 0 0 1 5.667-2.559m9.961 29.617 8.227 3.108 3.264-8.638-.498-6.768-4.113-1.555.548 7.258-4.319-1.632zm-12.339-4.663 8.226 3.108 3.264-8.637-.498-6.769-4.113-1.554.548 7.257-4.319-1.632z"></path></g><g clip-path="url(#d)" transform="translate(-63.992 -25.587)"><path fill="#81b0f3" d="M135.35 60.136 86.67 41.654c-3.346-1.27-7.124.428-8.394 3.775L64.414 81.938c-1.27 3.347.428 7.125 3.774 8.395l12.17 4.62-3.465 9.128c-.693 1.826-1.432 2.457.394 3.15l3.014 1.625c.609.231 1.637.274 2.477-.104l15.53-6.983 18.56 7.047c3.346 1.27 7.124-.428 8.395-3.775l13.862-36.51c1.27-3.346-.428-7.124-3.775-8.395M95.261 83.207l-12.17-4.62 4.852-12.779 7.19-7.017 6.085 2.31-7.725 7.51 6.389 2.426zm18.255 6.93-12.17-4.62 4.852-12.778 7.189-7.017 6.085 2.31-7.725 7.51 6.39 2.426z"></path></g><defs><clipPath id="c"><path fill="#fff" d="m198.638 146.586-65.056-24.583-24.583 65.057 65.056 24.582z"></path></clipPath><clipPath id="d"><path fill="#fff" d="m66.438 14.055 96.242 36.54-36.54 96.243-96.243-36.54z"></path></clipPath><linearGradient id="a" x1="97.203" x2="199.995" y1="47.04" y2="152.793" gradientUnits="userSpaceOnUse"><stop stop-color="#086DFC"></stop><stop offset="0.246" stop-color="#2C81FA"></stop><stop offset="0.516" stop-color="#5497F8"></stop><stop offset="0.821" stop-color="#80B0F6"></stop><stop offset="1" stop-color="#9ABFF5"></stop></linearGradient></defs></svg></div><h2>Help improve MDN</h2><fieldset class="feedback"><label>Was this page helpful to you?</label><div class="button-container"><button type="button" class="button primary has-icon yes"><span class="button-wrap"><span class="icon icon-thumbs-up "></span>Yes</span></button><button type="button" class="button primary has-icon no"><span class="button-wrap"><span class="icon icon-thumbs-down "></span>No</span></button></div></fieldset><a class="contribute" href="https://github.com/mdn/translated-content/blob/main/CONTRIBUTING.md" title="This will take you to our contribution guidelines on GitHub." target="_blank" rel="noopener noreferrer">Learn how to contribute</a>.<p class="last-modified-date">This page was last modified on<!-- --> <time dateTime="2024-09-22T09:08:49.000Z">2024年9月22日</time> by<!-- --> <a href="/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture/contributors.txt" rel="nofollow">MDN contributors</a>.</p><div id="on-github" class="on-github"><a href="https://github.com/mdn/translated-content/blob/main/files/ja/web/api/screen_capture_api/using_screen_capture/index.md?plain=1" title="Folder: ja/web/api/screen_capture_api/using_screen_capture (Opens in a new tab)" target="_blank" rel="noopener noreferrer">View this page on GitHub</a> <!-- -->•<!-- --> <a href="https://github.com/mdn/translated-content/issues/new?template=page-report-ja.yml&amp;mdn-url=https%3A%2F%2Fdeveloper.mozilla.org%2Fja%2Fdocs%2FWeb%2FAPI%2FScreen_Capture_API%2FUsing_Screen_Capture&amp;metadata=%3C%21--+Do+not+make+changes+below+this+line+--%3E%0A%3Cdetails%3E%0A%3Csummary%3EPage+report+details%3C%2Fsummary%3E%0A%0A*+Folder%3A+%60ja%2Fweb%2Fapi%2Fscreen_capture_api%2Fusing_screen_capture%60%0A*+MDN+URL%3A+https%3A%2F%2Fdeveloper.mozilla.org%2Fja%2Fdocs%2FWeb%2FAPI%2FScreen_Capture_API%2FUsing_Screen_Capture%0A*+GitHub+URL%3A+https%3A%2F%2Fgithub.com%2Fmdn%2Ftranslated-content%2Fblob%2Fmain%2Ffiles%2Fja%2Fweb%2Fapi%2Fscreen_capture_api%2Fusing_screen_capture%2Findex.md%0A*+Last+commit%3A+https%3A%2F%2Fgithub.com%2Fmdn%2Ftranslated-content%2Fcommit%2Fe2cd0ab39df8acf834a7c60361cba80751b9d7c5%0A*+Document+last+modified%3A+2024-09-22T09%3A08%3A49.000Z%0A%0A%3C%2Fdetails%3E" title="This will take you to GitHub to file a new issue." target="_blank" rel="noopener noreferrer">Report a problem with this content</a></div></div></aside></main></div></div><footer id="nav-footer" class="page-footer"><div class="page-footer-grid"><div class="page-footer-logo-col"><a href="/" class="mdn-footer-logo" aria-label="MDN homepage"><svg width="48" height="17" viewBox="0 0 48 17" fill="none" xmlns="http://www.w3.org/2000/svg"><title id="mdn-footer-logo-svg">MDN logo</title><path d="M20.04 16.512H15.504V10.416C15.504 9.488 15.344 8.824 15.024 8.424C14.72 8.024 14.264 7.824 13.656 7.824C12.92 7.824 12.384 8.064 12.048 8.544C11.728 9.024 11.568 9.64 11.568 10.392V14.184H13.008V16.512H8.472V10.416C8.472 9.488 8.312 8.824 7.992 8.424C7.688 8.024 7.232 7.824 6.624 7.824C5.872 7.824 5.336 8.064 5.016 8.544C4.696 9.024 4.536 9.64 4.536 10.392V14.184H6.6V16.512H0V14.184H1.44V8.04H0.024V5.688H4.536V7.32C5.224 6.088 6.32 5.472 7.824 5.472C8.608 5.472 9.328 5.664 9.984 6.048C10.64 6.432 11.096 7.016 11.352 7.8C11.992 6.248 13.168 5.472 14.88 5.472C15.856 5.472 16.72 5.776 17.472 6.384C18.224 6.992 18.6 7.936 18.6 9.216V14.184H20.04V16.512Z" fill="currentColor"></path><path d="M33.6714 16.512H29.1354V14.496C28.8314 15.12 28.3834 15.656 27.7914 16.104C27.1994 16.536 26.4154 16.752 25.4394 16.752C24.0154 16.752 22.8954 16.264 22.0794 15.288C21.2634 14.312 20.8554 12.984 20.8554 11.304C20.8554 9.688 21.2554 8.312 22.0554 7.176C22.8554 6.04 24.0634 5.472 25.6794 5.472C26.5594 5.472 27.2794 5.648 27.8394 6C28.3994 6.352 28.8314 6.8 29.1354 7.344V2.352H26.9754V0H32.2314V14.184H33.6714V16.512ZM29.1354 11.04V10.776C29.1354 9.88 28.8954 9.184 28.4154 8.688C27.9514 8.176 27.3674 7.92 26.6634 7.92C25.9754 7.92 25.3674 8.176 24.8394 8.688C24.3274 9.2 24.0714 10.008 24.0714 11.112C24.0714 12.152 24.3114 12.944 24.7914 13.488C25.2714 14.032 25.8394 14.304 26.4954 14.304C27.3114 14.304 27.9514 13.96 28.4154 13.272C28.8954 12.584 29.1354 11.84 29.1354 11.04Z" fill="currentColor"></path><path d="M47.9589 16.512H41.9829V14.184H43.4229V10.416C43.4229 9.488 43.2629 8.824 42.9429 8.424C42.6389 8.024 42.1829 7.824 41.5749 7.824C40.8389 7.824 40.2709 8.056 39.8709 8.52C39.4709 8.968 39.2629 9.56 39.2469 10.296V14.184H40.6869V16.512H34.7109V14.184H36.1509V8.04H34.5909V5.688H39.2469V7.344C39.9669 6.096 41.1269 5.472 42.7269 5.472C43.7509 5.472 44.6389 5.776 45.3909 6.384C46.1429 6.992 46.5189 7.936 46.5189 9.216V14.184H47.9589V16.512Z" fill="currentColor"></path></svg></a><p>Your blueprint for a better internet.</p><ul class="social-icons"><li><a href="https://mozilla.social/@mdn" target="_blank" rel="me noopener noreferrer"><span class="icon icon-mastodon"></span><span class="visually-hidden">MDN on Mastodon</span></a></li><li><a href="https://twitter.com/mozdevnet" target="_blank" rel="noopener noreferrer"><span class="icon icon-twitter-x"></span><span class="visually-hidden">MDN on X (formerly Twitter)</span></a></li><li><a href="https://github.com/mdn/" target="_blank" rel="noopener noreferrer"><span class="icon icon-github-mark-small"></span><span class="visually-hidden">MDN on GitHub</span></a></li><li><a href="/en-US/blog/rss.xml" target="_blank"><span class="icon icon-feed"></span><span class="visually-hidden">MDN Blog RSS Feed</span></a></li></ul></div><div class="page-footer-nav-col-1"><h2 class="footer-nav-heading">MDN</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a href="/en-US/about">About</a></li><li class="footer-nav-item"><a href="/en-US/blog/">Blog</a></li><li class="footer-nav-item"><a href="https://www.mozilla.org/en-US/careers/listings/?team=ProdOps" target="_blank" rel="noopener noreferrer">Careers</a></li><li class="footer-nav-item"><a href="/en-US/advertising">Advertise with us</a></li></ul></div><div class="page-footer-nav-col-2"><h2 class="footer-nav-heading">Support</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a class="footer-nav-link" href="https://support.mozilla.org/products/mdn-plus">Product help</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/ja/docs/MDN/Community/Issues">Report an issue</a></li></ul></div><div class="page-footer-nav-col-3"><h2 class="footer-nav-heading">Our communities</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a class="footer-nav-link" href="/en-US/community">MDN Community</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="https://discourse.mozilla.org/c/mdn/236" target="_blank" rel="noopener noreferrer">MDN Forum</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/discord" target="_blank" rel="noopener noreferrer">MDN Chat</a></li></ul></div><div class="page-footer-nav-col-4"><h2 class="footer-nav-heading">Developers</h2><ul class="footer-nav-list"><li class="footer-nav-item"><a class="footer-nav-link" href="/ja/docs/Web">Web Technologies</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/ja/docs/Learn">Learn Web Development</a></li><li class="footer-nav-item"><a class="footer-nav-link" href="/ja/plus">MDN Plus</a></li><li class="footer-nav-item"><a href="https://hacks.mozilla.org/" target="_blank" rel="noopener noreferrer">Hacks Blog</a></li></ul></div><div class="page-footer-moz"><a href="https://www.mozilla.org/" class="footer-moz-logo-link" target="_blank" rel="noopener noreferrer"><svg width="112" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"><title id="mozilla-footer-logo-svg">Mozilla logo</title><path d="M41.753 14.218c-2.048 0-3.324 1.522-3.324 4.157 0 2.423 1.119 4.286 3.29 4.286 2.082 0 3.447-1.678 3.447-4.347 0-2.826-1.522-4.096-3.413-4.096Zm54.89 7.044c0 .901.437 1.618 1.645 1.618 1.427 0 2.949-1.024 3.044-3.352-.649-.095-1.365-.185-2.02-.185-1.426-.005-2.668.397-2.668 1.92Z" fill="currentColor"></path><path d="M0 0v32h111.908V0H0Zm32.56 25.426h-5.87v-7.884c0-2.423-.806-3.352-2.39-3.352-1.924 0-2.702 1.365-2.702 3.324v4.868h1.864v3.044h-5.864v-7.884c0-2.423-.806-3.352-2.39-3.352-1.924 0-2.702 1.365-2.702 3.324v4.868h2.669v3.044H6.642v-3.044h1.863v-7.918H6.642V11.42h5.864v2.11c.839-1.489 2.3-2.39 4.252-2.39 2.02 0 3.878.963 4.566 3.01.778-1.862 2.361-3.01 4.566-3.01 2.512 0 4.812 1.522 4.812 4.84v6.402h1.863v3.044h-.005Zm9.036.307c-4.314 0-7.296-2.635-7.296-7.106 0-4.096 2.484-7.481 7.514-7.481s7.481 3.38 7.481 7.29c0 4.472-3.228 7.297-7.699 7.297Zm22.578-.307H51.942l-.403-2.11 7.7-8.846h-4.376l-.621 2.17-2.888-.313.498-4.907h12.294l.313 2.11-7.767 8.852h4.533l.654-2.172 3.167.308-.872 4.908Zm7.99 0h-4.191v-5.03h4.19v5.03Zm0-8.976h-4.191v-5.03h4.19v5.03Zm2.618 8.976 6.054-21.358h3.945l-6.054 21.358h-3.945Zm8.136 0 6.048-21.358h3.945l-6.054 21.358h-3.939Zm21.486.307c-1.863 0-2.887-1.085-3.072-2.792-.805 1.427-2.232 2.792-4.498 2.792-2.02 0-4.314-1.085-4.314-4.006 0-3.447 3.323-4.253 6.518-4.253.778 0 1.584.034 2.3.124v-.465c0-1.427-.034-3.133-2.3-3.133-.84 0-1.488.061-2.143.402l-.453 1.578-3.195-.34.549-3.224c2.45-.996 3.692-1.27 5.992-1.27 3.01 0 5.556 1.55 5.556 4.75v6.083c0 .805.314 1.085.963 1.085.184 0 .375-.034.587-.095l.034 2.11a5.432 5.432 0 0 1-2.524.654Z" fill="currentColor"></path></svg></a><ul class="footer-moz-list"><li class="footer-moz-item"><a href="https://www.mozilla.org/privacy/websites/" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Website Privacy Notice</a></li><li class="footer-moz-item"><a href="https://www.mozilla.org/privacy/websites/#cookies" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Cookies</a></li><li class="footer-moz-item"><a href="https://www.mozilla.org/about/legal/terms/mozilla" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Legal</a></li><li class="footer-moz-item"><a href="https://www.mozilla.org/about/governance/policies/participation/" class="footer-moz-link" target="_blank" rel="noopener noreferrer">Community Participation Guidelines</a></li></ul></div><div class="page-footer-legal"><p id="license" class="page-footer-legal-text">Visit<!-- --> <a href="https://www.mozilla.org" target="_blank" rel="noopener noreferrer">Mozilla Corporation’s</a> <!-- -->not-for-profit parent, the<!-- --> <a target="_blank" rel="noopener noreferrer" href="https://foundation.mozilla.org/">Mozilla Foundation</a>.<br/>Portions of this content are ©1998–<!-- -->2024<!-- --> by individual mozilla.org contributors. Content available under<!-- --> <a href="/ja/docs/MDN/Writing_guidelines/Attrib_copyright_license">a Creative Commons license</a>.</p></div></div></footer></div><script type="application/json" id="hydration">{"url":"/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture","doc":{"isMarkdown":true,"isTranslated":true,"isActive":true,"flaws":{},"title":"画面キャプチャ API の使用","mdn_url":"/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture","locale":"ja","native":"日本語","browserCompat":["api.MediaDevices.getDisplayMedia"],"baseline":{"baseline":false,"support":{"chrome":"72","edge":"79","firefox":"33","safari":"13"}},"sidebarHTML":"<ol><li class=\"section\"><a href=\"/ja/docs/Web/API/Screen_Capture_API\">Screen Capture API</a></li><li class=\"toggle\"><details open=\"\"><summary>ガイド</summary><ol><li><em><a href=\"/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture\" aria-current=\"page\">画面キャプチャ API の使用</a></em></li></ol></details></li><li class=\"toggle\"><details open=\"\"><summary>インターフェイス</summary><ol><li><a href=\"/ja/docs/Web/API/CaptureController\"><code>CaptureController</code></a></li></ol></details></li><li class=\"toggle\"><details open=\"\"><summary>プロパティ</summary><ol><li><a href=\"/ja/docs/Web/API/MediaTrackConstraints/displaySurface\"><code>MediaTrackConstraints.displaySurface</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackConstraints/logicalSurface\"><code>MediaTrackConstraints.logicalSurface</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackConstraints/suppressLocalAudioPlayback\"><code>MediaTrackConstraints.suppressLocalAudioPlayback</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSettings/cursor\"><code>MediaTrackSettings.cursor</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSettings/displaySurface\"><code>MediaTrackSettings.displaySurface</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSettings/logicalSurface\"><code>MediaTrackSettings.logicalSurface</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSettings/suppressLocalAudioPlayback\"><code>MediaTrackSettings.suppressLocalAudioPlayback</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSupportedConstraints/displaySurface\"><code>MediaTrackSupportedConstraints.displaySurface</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSupportedConstraints/logicalSurface\"><code>MediaTrackSupportedConstraints.logicalSurface</code></a></li><li><a href=\"/ja/docs/Web/API/MediaTrackSupportedConstraints/suppressLocalAudioPlayback\"><code>MediaTrackSupportedConstraints.suppressLocalAudioPlayback</code></a></li></ol></details></li><li class=\"toggle\"><details open=\"\"><summary>メソッド</summary><ol><li><a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\"><code>MediaDevices.getDisplayMedia()</code></a></li></ol></details></li></ol>","sidebarMacro":"DefaultAPISidebar","body":[{"type":"prose","value":{"id":null,"title":null,"isH3":false,"content":"<p>この記事では、画面キャプチャ API とその <a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"getDisplayMedia()\"><code>getDisplayMedia()</code></a> メソッドを使用して、 <a href=\"/ja/docs/Web/API/WebRTC_API\">WebRTC</a> 会議セッション中に画面の一部または全部をストリーミング、録音、共有用に取得する方法を検証していきます。</p>\n<div class=\"notecard note\">\n <p><strong>メモ:</strong> 最近のバージョンの <a href=\"https://github.com/webrtcHacks/adapter\" class=\"external\" target=\"_blank\">WebRTC adapter.js shim</a> には <code>getDisplayMedia()</code> の実装が含まれており、画面共有をサポートしているが現在の標準 API を実装していないブラウザーで画面共有を可能にすることができるので便利かもしれません。これは、少なくとも Chrome、Edge、Firefox で動作します。</p>\n</div>"}},{"type":"prose","value":{"id":"画面の内容のキャプチャ","title":"画面の内容のキャプチャ","isH3":false,"content":"<p>画面の内容をライブの <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> でキャプチャするには、 <a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"navigator.mediaDevices.getDisplayMedia()\"><code>navigator.mediaDevices.getDisplayMedia()</code></a> を呼び出すことで開始され、ライブ画面の内容を含むストリームに解決するプロミスが返されます。下記の例で参照されている <code>displayMediaOptions</code> オブジェクトは、このようになるかもしれません。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>const displayMediaOptions = {\n video: {\n displaySurface: \"browser\",\n },\n audio: {\n suppressLocalAudioPlayback: false,\n },\n preferCurrentTab: false,\n selfBrowserSurface: \"exclude\",\n systemAudio: \"include\",\n surfaceSwitching: \"include\",\n monitorTypeSurfaces: \"include\",\n};\n</code></pre></div>"}},{"type":"prose","value":{"id":"画面キャプチャの開始_asyncawait_スタイル","title":"画面キャプチャの開始: <code>async</code>/<code>await</code> スタイル","isH3":true,"content":"<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>async function startCapture(displayMediaOptions) {\n let captureStream = null;\n\n try {\n captureStream =\n await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);\n } catch (err) {\n console.error(`Error: ${err}`);\n }\n return captureStream;\n}\n</code></pre></div>\n<p>このコードは、上記のように非同期関数と <a href=\"/ja/docs/Web/JavaScript/Reference/Operators/await\"><code>await</code></a> 演算子を使うか、下記のように <a href=\"/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise\"><code>Promise</code></a> を直接使って記述することができます。</p>"}},{"type":"prose","value":{"id":"画面キャプチャの開始_promise_スタイル","title":"画面キャプチャの開始: <code>Promise</code> スタイル","isH3":true,"content":"<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>function startCapture(displayMediaOptions) {\n return navigator.mediaDevices\n .getDisplayMedia(displayMediaOptions)\n .catch((err) =&gt; {\n console.error(err);\n return null;\n });\n}\n</code></pre></div>\n<p>いずれにせよ、<a href=\"/ja/docs/Glossary/User_agent\">ユーザーエージェント</a>は、共有する画面領域を選択するようユーザーに促すユーザーインターフェイスを提示して応答します。これらの <code>startCapture()</code> の実装はどちらも、キャプチャされた表示画像を含む <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> を返します。</p>\n<p>必要な画面の種類を指定する方法と、結果として得られるストリームを調整する他の方法については、以下の<a href=\"#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E5%88%B6%E7%B4%84\">オプションと制約</a>を参照してください。</p>"}},{"type":"prose","value":{"id":"キャプチャする表示面を選択するウィンドウの例","title":"キャプチャする表示面を選択するウィンドウの例","isH3":true,"content":"<p>\n <img src=\"/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture/chrome-screen-capture-window.png\" alt=\"Chrome のソース面を選ぶウィンドウの画面ショット\" width=\"1239\" height=\"1041\" loading=\"lazy\">\n</p>\n<p>そして、キャプチャしたストリーム <code>captureStream</code> を、ストリームを入力として受け付けるあらゆるものに使用することができます。以下の<a href=\"#%E4%BE%8B\">例</a>は、ストリームを利用するためのいくつかの方法を示しています。</p>"}},{"type":"prose","value":{"id":"可視表示面と論理表示面","title":"可視表示面と論理表示面","isH3":true,"content":"<p>画面キャプチャ API の用語では、<strong>表示面</strong>は、共有のために API によって選択できる任意のコンテンツオブジェクトです。共有面には、ブラウザータブのコンテンツ、完全なウィンドウ、 1 つの面に結合されたアプリケーションのすべてのウィンドウ、およびモニター(または 1 つの面に結合されたモニターのグループ)が含まれます。</p>\n<p>表示面には 2 種類あります。<strong>可視表示面</strong>とは、最前面のウィンドウやタブ、あるいは画面全体など、画面上で全体が見える表示面です。</p>\n<p><strong>論理的表示面</strong>とは、他のオブジェクトとある程度重なっていたり、完全に隠れていたり、画面外にあったりして、部分的または完全に隠されているものです。画面キャプチャ API でこれらをどのように処理するかは、さまざまです。一般にブラウザーは、論理的な表示面の隠れた部分をぼかしたり、色やパターンに置き換えたりして、何らかの方法で隠蔽した画像を提供します。これはセキュリティ上の理由から行われるもので、ユーザーが見ることのできないコンテンツには、共有したくないデータが含まれている可能性があるからです。</p>\n<p>ユーザーエージェントは,ユーザーから許可を得た上で,不明瞭なウィンドウの全コンテンツのキャプチャを許可するかもしれません。この場合,ユーザーエージェントは,ウィンドウの隠された部分の現在の内容を取得することによって,または現在の内容が利用可能でない場合には最も最近表示された内容を提示することによって,隠された内容を含むことができます。</p>"}},{"type":"prose","value":{"id":"オプションと制約","title":"オプションと制約","isH3":true,"content":"<p><a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"getDisplayMedia()\"><code>getDisplayMedia()</code></a> に渡される制約オブジェクトは、結果のストリームを設定するために使用されるオブジェクトです。</p>\n<p>options オブジェクトに渡す <code>video</code> と <code>audio</code> オブジェクトには、それらの映像トラックに特定の制約を追加することもできます。<a href=\"/en-US/docs/Web/API/MediaTrackConstraints\" class=\"only-in-en-us\" title=\"このページは現在、英語のみで利用可能です。\">共有画面トラックのプロパティ</a>では、 <a class=\"only-in-en-us\" title=\"このページは現在、英語のみで利用可能です。\" href=\"/en-US/docs/Web/API/MediaTrackConstraints\"><code>MediaTrackConstraints</code></a>、<a href=\"/ja/docs/Web/API/MediaTrackSupportedConstraints\"><code>MediaTrackSupportedConstraints</code></a>、<a class=\"only-in-en-us\" title=\"このページは現在、英語のみで利用可能です。\" href=\"/en-US/docs/Web/API/MediaTrackSettings\"><code>MediaTrackSettings</code></a> に追加された画面キャプチャストリームの構成に関する制約について参照できます。</p>\n<p>キャプチャするコンテンツが選択されるまで、どのような制約も適用されません。制約は、結果のストリームに表示される内容を変更します。たとえば、動画に <a class=\"only-in-en-us\" title=\"このページは現在、英語のみで利用可能です。\" href=\"/en-US/docs/Web/API/MediaTrackConstraints/width\"><code>width</code></a> 制約を指定すると、ユーザーが共有する領域を選択した後に動画を拡大縮小することによって適用されます。ソース自体のサイズに制約を設けるものではありません。</p>\n<div class=\"notecard note\">\n <p><strong>メモ:</strong> 制約によって、画面共有 API でキャプチャ可能なソースのリストが変更されることは決してありません。このため、ウェブアプリケーションでは、1 つの項目が残るまでソースリストを制限することによって、ユーザーに特定のコンテンツを共有するように強制することはできません。</p>\n</div>\n<p>表示のキャプチャが行われている間、画面共有を行っているマシンは、共有が行われていることをユーザーに認識させるために、何らかのインジケーターを表示します。</p>\n<div class=\"notecard note\">\n <p><strong>メモ:</strong> プライバシーとセキュリティ上の理由から、画面共有のソースは <a href=\"/ja/docs/Web/API/MediaDevices/enumerateDevices\" title=\"enumerateDevices()\"><code>enumerateDevices()</code></a> を使って列挙することができないようになっています。これに関連して、<code>getDisplayMedia()</code> で利用できるソースに変更があった場合も、 <a href=\"/ja/docs/Web/API/MediaDevices/devicechange_event\" title=\"devicechange\"><code>devicechange</code></a> イベントは送信されません。</p>\n</div>"}},{"type":"prose","value":{"id":"共有音声のキャプチャ","title":"共有音声のキャプチャ","isH3":true,"content":"<p><a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"getDisplayMedia()\"><code>getDisplayMedia()</code></a> は、ユーザーの画面(またはその一部)の動画をキャプチャするために最も一般的に使用されています。しかし、<a href=\"/ja/docs/Glossary/User_agent\">ユーザーエージェント</a>は、動画コンテンツと一緒に音声のキャプチャを許可する場合があります。この音声のソースは、選択されたウィンドウ、コンピューター全体のオーディオシステム、またはユーザーのマイク(または上記のすべての組み合わせ)であるかもしれません。</p>\n<p>音声の共有が必要なプロジェクトを始める前に、 <a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7\">ブラウザーの互換性</a>を確認し、互換性を希望するブラウザーがキャプチャした画面ストリームに音声のサポートがあるかどうかを確認してください。</p>\n<p>音声を含む画面の共有を要求するには、 <code>getDisplayMedia()</code> に渡すオプションは次のようになります。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>const displayMediaOptions = {\n video: true,\n audio: true,\n};\n</code></pre></div>\n<p>これにより、ユーザーエージェントが対応する範囲内で、ユーザーが希望するものを自由に選択することができます。これは、 <code>audio</code> と <code>video</code> のそれぞれに追加の情報を指定することで、さらに改良することができます。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>const displayMediaOptions = {\n video: {\n displaySurface: \"window\",\n },\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n sampleRate: 44100,\n suppressLocalAudioPlayback: true,\n },\n surfaceSwitching: \"include\",\n selfBrowserSurface: \"exclude\",\n systemAudio: \"exclude\",\n};\n</code></pre></div>\n<p>この例では、カーソルは常にキャプチャで表示され、音声トラックはノイズ抑制とエコーキャンセル機能を有効にし、音声のサンプリングレートは 44.1kHz が理想的です。</p>\n<p>加えて、アプリはユーザーエージェントにすべきことのヒントを与えています。</p>\n<ul>\n <li>画面共有中にユーザーが共有タブを動的に切り替えられるように制御する機能を提供しています。</li>\n <li>キャプチャがリクエストされたときにユーザーに表示されているオプションリストから現在のタブを非表示にします。</li>\n <li>ユーザーに提供可能な音声ソースにシステム音声を含めないようにします。</li>\n</ul>\n<p>音声のキャプチャは常にオプションです。ウェブコンテンツが音声と動画の両方を含むストリームを要求した場合でも、返される <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> は、音声なしの 1 つの動画トラックのみとなる場合があります。</p>"}},{"type":"prose","value":{"id":"キャプチャしたストリームの使用","title":"キャプチャしたストリームの使用","isH3":false,"content":"<p><a href=\"/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise\"><code>promise</code></a> が返す <a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"getDisplayMedia()\"><code>getDisplayMedia()</code></a> は、画面または画面領域を含む少なくとも一つの動画ストリームを含み、 <code>getDisplayMedia()</code> が呼ばれたときに指定した制約に基づいて調整またはフィルタリングされた <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> に解決されます。</p>"}},{"type":"prose","value":{"id":"潜在的なリスク","title":"潜在的なリスク","isH3":true,"content":"<p>画面共有を取り巻くプライバシーとセキュリティの問題は、通常、それほど深刻ではありませんが、実際に存在します。最も大きな潜在的問題は、ユーザーが共有したくないコンテンツを不注意に共有してしまうことです。</p>\n<p>たとえば、ユーザーが自分の画面を共有しているときに、見えている背景のウィンドウにたまたま個人情報が含まれていたり、パスワードマネージャーが共有ストリームに見えていたりすると、プライバシーやセキュリティの侵害が容易に発生します。論理的な表示面をキャプチャする場合、この影響は増幅される可能性があり、ユーザーは見るどころか、全く知らないコンテンツを含んでいる可能性があります。</p>\n<p>プライバシーを真剣に考えるユーザーエージェントは、特にそのコンテンツを共有する権限が与えられていない限り、画面上に実際に表示されていないコンテンツを難読化する必要があります。</p>"}},{"type":"prose","value":{"id":"表示コンテンツのキャプチャの許可","title":"表示コンテンツのキャプチャの許可","isH3":true,"content":"<p>キャプチャした画面コンテンツのストリーミングを開始する前に、<a href=\"/ja/docs/Glossary/User_agent\">ユーザーエージェント</a>は共有の要求を確認し、共有するコンテンツを選択するようユーザーに要求します。</p>"}},{"type":"prose","value":{"id":"例","title":"例","isH3":false,"content":""}},{"type":"prose","value":{"id":"単純な画面キャプチャ","title":"単純な画面キャプチャ","isH3":true,"content":"<p>この例では、キャプチャした画面領域の内容を、同じページ内の <a href=\"/ja/docs/Web/HTML/Element/video\"><code>&lt;video&gt;</code></a> 要素にストリーミングしています。</p>\n<h4 id=\"javascript\">JavaScript</h4>\n<p>この機能を実現するために必要なコードはそれほど多くありません。 <a href=\"/ja/docs/Web/API/MediaDevices/getUserMedia\" title=\"getUserMedia()\"><code>getUserMedia()</code></a> を使ってカメラから動画を取り込むことに慣れているなら、 <a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"getDisplayMedia()\"><code>getDisplayMedia()</code></a> は非常に身近に感じることでしょう。</p>\n<h5 id=\"セットアップ\">セットアップ</h5>\n<p>まず、アクセスする必要のあるページ上の要素を参照するために、いくつかの定数が設定されます。キャプチャされた画面のコンテンツがストリームされる <a href=\"/ja/docs/Web/HTML/Element/video\"><code>&lt;video&gt;</code></a>、ログ出力が描かれるボックス、画面イメージのキャプチャをオン/オフする開始/停止ボタンがあります。</p>\n<p>オブジェクト <code>displayMediaOptions</code> には <code>getDisplayMedia()</code> に渡す制約が含まれています。ここでは <a class=\"only-in-en-us\" title=\"このページは現在、英語のみで利用可能です。\" href=\"/en-US/docs/Web/API/MediaTrackConstraints/displaySurface\"><code>displaySurface</code></a> プロパティを <code>always</code> に設定しており、マウスカーソルを常にキャプチャメディアに含めることを指定しています。</p>\n<p>最後に、イベントリスナーを設定して、スタートボタンとストップボタンに対するユーザーのクリックを検出します。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>const videoElem = document.getElementById(\"video\");\nconst logElem = document.getElementById(\"log\");\nconst startElem = document.getElementById(\"start\");\nconst stopElem = document.getElementById(\"stop\");\n\n// Options for getDisplayMedia()\n\nconst displayMediaOptions = {\n video: {\n displaySurface: \"window\",\n },\n audio: false,\n};\n\n// Set event listeners for the start and stop buttons\nstartElem.addEventListener(\n \"click\",\n (evt) =&gt; {\n startCapture();\n },\n false,\n);\n\nstopElem.addEventListener(\n \"click\",\n (evt) =&gt; {\n stopCapture();\n },\n false,\n);\n</code></pre></div>\n<h5 id=\"内容のログ出力\">内容のログ出力</h5>\n<p>エラーやその他の問題のログを簡単に取るために、この例では特定の <a href=\"/ja/docs/Web/API/console\"><code>console</code></a> メソッドをオーバーライドして、そのメッセージを ID が <code>log</code> である <a href=\"/ja/docs/Web/HTML/Element/pre\"><code>&lt;pre&gt;</code></a> ブロックに出力しています。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>console.log = (msg) =&gt; (logElem.textContent = `${logElem.textContent}\\n${msg}`);\nconsole.error = (msg) =&gt;\n (logElem.textContent = `${logElem.textContent}\\nError: ${msg}`);\n</code></pre></div>\n<p>これにより、おなじみの <a href=\"/ja/docs/Web/API/console/log_static\" title=\"console.log()\"><code>console.log()</code></a> や <a href=\"/ja/docs/Web/API/console/error_static\" title=\"console.error()\"><code>console.error()</code></a> などを使って、ドキュメント内のログボックスに情報を記録することができるようになります。</p>\n<h5 id=\"画面キャプチャの開始\">画面キャプチャの開始</h5>\n<p>以下の <code>startCapture()</code> メソッドは、ユーザーが画面上で選択した領域から内容を取得する <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> のキャプチャを開始するものです。<code>startCapture()</code> は、 \"Start Capture\" ボタンがクリックされたときに呼び出されます。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>async function startCapture() {\n logElem.textContent = \"\";\n\n try {\n videoElem.srcObject =\n await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);\n dumpOptionsInfo();\n } catch (err) {\n console.error(err);\n }\n}\n</code></pre></div>\n<p>前回の接続の際に残ったテキストを取り除くためにログの内容をクリアした後、<code>startCapture()</code> は <a href=\"/ja/docs/Web/API/MediaDevices/getDisplayMedia\" title=\"getDisplayMedia()\"><code>getDisplayMedia()</code></a> を呼び出し、そこに <code>displayMediaOptions</code> で定義された制約オブジェクトを渡します。jsxref(\"Operators/await\", \"await\")}} を使用して、次のコード行は <code>getDisplayMedia()</code> が返す <a href=\"/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise\"><code>promise</code></a> が解決するまで実行されません。解決後、プロミスは <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> を返し、ユーザーが選択した画面、ウィンドウ、その他の領域の内容をストリームとして出力します。</p>\n<p>このストリームは、返された <code>MediaStream</code> を要素の <a href=\"/ja/docs/Web/API/HTMLMediaElement/srcObject\" title=\"srcObject\"><code>srcObject</code></a> に格納することによって <a href=\"/ja/docs/Web/HTML/Element/video\"><code>&lt;video&gt;</code></a> 要素に接続されています。</p>\n<p><code>dumpOptionsInfo()</code> 関数は、後で見ることになりますが、教育的な目的のために、ストリームに関する情報をログボックスにダンプします。</p>\n<p>もし、どれかが失敗したら、 <a href=\"/ja/docs/Web/JavaScript/Reference/Statements/try...catch\"><code>catch()</code></a> 節は、ログボックスにエラーメッセージを出力します。</p>\n<h5 id=\"画面キャプチャの停止\">画面キャプチャの停止</h5>\n<p><code>stopCapture()</code> メソッドは \"Stop Capture\" ボタンがクリックされたときに呼び出されます。これは <a href=\"/ja/docs/Web/API/MediaStream/getTracks\"><code>MediaStream.getTracks()</code></a> を用いてトラックリストを取得し、各トラックの <a href=\"/ja/docs/Web/API/MediaStreamTrack/stop\" title=\"stop()\"><code>stop()</code></a> メソッドを呼び出してストリームを停止させます。それが終わると、 <code>srcObject</code> に <code>null</code> がセットされ、ストリームが接続されていないことが誰にでも分かるようにします。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>function stopCapture(evt) {\n let tracks = videoElem.srcObject.getTracks();\n\n tracks.forEach((track) =&gt; track.stop());\n videoElem.srcObject = null;\n}\n</code></pre></div>\n<h5 id=\"設定情報のダンプ\">設定情報のダンプ</h5>\n<p>参考までに、上記の <code>startCapture()</code> メソッドは <code>dumpOptions()</code> という名前のメソッドを呼び出し、現在のトラック設定と、ストリームが作成されたときに設定された制約を出力します。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">js</span></div><pre class=\"brush: js notranslate\"><code>function dumpOptionsInfo() {\n const videoTrack = videoElem.srcObject.getVideoTracks()[0];\n\n console.log(\"Track settings:\");\n console.log(JSON.stringify(videoTrack.getSettings(), null, 2));\n console.log(\"Track constraints:\");\n console.log(JSON.stringify(videoTrack.getConstraints(), null, 2));\n}\n</code></pre></div>\n<p>トラックリストは、キャプチャした画面の <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> で <a href=\"/ja/docs/Web/API/MediaStream/getVideoTracks\" title=\"getVideoTracks()\"><code>getVideoTracks()</code></a> を呼び出すことで取得します。現在有効な設定は <a href=\"/ja/docs/Web/API/MediaStreamTrack/getSettings\" title=\"getSettings()\"><code>getSettings()</code></a> で、設定されている制約は <a href=\"/ja/docs/Web/API/MediaStreamTrack/getConstraints\" title=\"getConstraints()\"><code>getConstraints()</code></a> で取得されます。</p>\n<h4 id=\"html\">HTML</h4>\n<p>HTML は簡単な紹介文から始まり、本題に入ります。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">html</span></div><pre class=\"brush: html notranslate\"><code>&lt;p&gt;\n この例では、ディスプレイの選択した部分の内容を表示します。\n キャプチャ開始ボタンをクリックすると開始します。\n&lt;/p&gt;\n\n&lt;p&gt;\n &lt;button id=\"start\"&gt;キャプチャ開始&lt;/button&gt;&amp;nbsp;&lt;button id=\"stop\"&gt;\n キャプチャ停止\n &lt;/button&gt;\n&lt;/p&gt;\n\n&lt;video id=\"video\" autoplay&gt;&lt;/video&gt;\n&lt;br /&gt;\n\n&lt;strong&gt;Log:&lt;/strong&gt;\n&lt;br /&gt;\n&lt;pre id=\"log\"&gt;&lt;/pre&gt;\n</code></pre></div>\n<p>HTML の主要な部分は以下の通りです。</p>\n<ol>\n <li>\"Start Capture\" と書かれた <a href=\"/ja/docs/Web/HTML/Element/button\"><code>&lt;button&gt;</code></a> は、クリックされると <code>startCapture()</code> 関数を呼び出し、画面コンテンツへのアクセスを要求し、キャプチャを開始します。</li>\n <li>\"Stop Capture\" というラベルの付いた 2 番目のボタンがあり、クリックされると <code>stopCapture()</code> を呼び出して画面のコンテンツのキャプチャを終了します。</li>\n <li>キャプチャされた画面の内容がストリームされる <a href=\"/ja/docs/Web/HTML/Element/video\"><code>&lt;video&gt;</code></a>。</li>\n <li><a href=\"/ja/docs/Web/HTML/Element/pre\"><code>&lt;pre&gt;</code></a> ブロック。この中では、インターセプトされた <a href=\"/ja/docs/Web/API/console\"><code>console</code></a> メソッドによってログが記録されます。</li>\n</ol>\n<h4 id=\"css\">CSS</h4>\n<p>この例では、 CSS は完全に外観上のものです。動画には境界線が付けられ、その幅は利用可能な水平方向のスペースのほぼ全体を占めるように設定されています (<code>width: 98%</code>)。 <a href=\"/ja/docs/Web/CSS/max-width\"><code>max-width</code></a> には <code>860px</code> を設定し、動画のサイズに絶対的な上限を設定しています。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">css</span></div><pre class=\"brush: css notranslate\"><code>#video {\n border: 1px solid #999;\n width: 98%;\n max-width: 860px;\n}\n\n#log {\n width: 25rem;\n height: 15rem;\n border: 1px solid black;\n padding: 0.5rem;\n overflow: scroll;\n}\n</code></pre></div>\n<h4 id=\"結果\">結果</h4>\n<p>最終的にはこのようになります。ブラウザーが画面キャプチャ API に対応している場合、\"Start Capture\" をクリックすると、共有する画面、ウィンドウ、タブを選択するための<a href=\"/ja/docs/Glossary/User_agent\">ユーザーエージェント</a>のインターフェイスが表示されます。</p><div class=\"code-example\"><div class=\"example-header\"></div><iframe class=\"sample-code-frame\" title=\"Streaming screen capture sample\" id=\"frame_streaming_screen_capture\" width=\"640\" height=\"800\" src=\"about:blank\" data-live-path=\"/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture\" data-live-id=\"streaming_screen_capture\" allow=\"display-capture\" sandbox=\"allow-same-origin allow-scripts\" loading=\"lazy\"></iframe></div>"}},{"type":"prose","value":{"id":"セキュリティ","title":"セキュリティ","isH3":false,"content":"<p><a href=\"/ja/docs/Web/HTTP/Permissions_Policy\">権限ポリシー</a>が有効なときに機能させるためには、 <code>display-capture</code> 権限が必要です。これは <a href=\"/ja/docs/Web/HTTP/Headers/Permissions-Policy\"><code>Permissions-Policy</code></a> を用いて行うことができます。または、画面キャプチャ API を <a href=\"/ja/docs/Web/HTML/Element/iframe\"><code>&lt;iframe&gt;</code></a> 内で使用している場合は、 <code>&lt;iframe&gt;</code> 要素の <a href=\"/ja/docs/Web/HTML/Element/iframe#allow\"><code>allow</code></a> 属性を使用します。</p>\n<p>例えば、 HTTP ヘッダーのこの行は、文書と同じオリジンから読み込まれる埋め込み <a href=\"/ja/docs/Web/HTML/Element/iframe\"><code>&lt;iframe&gt;</code></a> 要素の画面キャプチャ API を有効にします。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">http</span></div><pre class=\"brush: http notranslate\"><code>Permissions-Policy: display-capture=(self)\n</code></pre></div>\n<p>もし <code>&lt;iframe&gt;</code> 内で画面キャプチャを行うのであれば、そのフレームに対してのみ許可を要求することができ、より一般的な許可を要求するよりも明らかに安全です。</p>\n<div class=\"code-example\"><div class=\"example-header\"><span class=\"language-name\">html</span></div><pre class=\"brush: html notranslate\"><code>&lt;iframe src=\"https://mycode.example.net/etc\" allow=\"display-capture\"&gt; &lt;/iframe&gt;\n</code></pre></div>"}},{"type":"browser_compatibility","value":{"title":"ブラウザーの互換性","id":"ブラウザーの互換性","isH3":false,"query":"api.MediaDevices.getDisplayMedia"}},{"type":"prose","value":{"id":"関連情報","title":"関連情報","isH3":false,"content":"<ul>\n <li><a href=\"/ja/docs/Web/API/Screen_Capture_API\">画面キャプチャ API</a></li>\n <li><a href=\"/ja/docs/Web/API/Media_Capture_and_Streams_API\">メディアキャプチャとストリーム API</a></li>\n <li><a href=\"/ja/docs/Web/API/Media_Capture_and_Streams_API/Taking_still_photos\">WebRTC で静止画の写真を撮影</a></li>\n <li><a href=\"/ja/docs/Web/API/HTMLCanvasElement/captureStream\"><code>HTMLCanvasElement.captureStream()</code></a> で <a href=\"/ja/docs/Web/HTML/Element/canvas\"><code>&lt;canvas&gt;</code></a> のライブコンテンツの <a href=\"/ja/docs/Web/API/MediaStream\"><code>MediaStream</code></a> を取得できる</li>\n</ul>"}}],"toc":[{"text":"画面の内容のキャプチャ","id":"画面の内容のキャプチャ"},{"text":"キャプチャしたストリームの使用","id":"キャプチャしたストリームの使用"},{"text":"例","id":"例"},{"text":"セキュリティ","id":"セキュリティ"},{"text":"ブラウザーの互換性","id":"ブラウザーの互換性"},{"text":"関連情報","id":"関連情報"}],"summary":"この記事では、画面キャプチャ API とその getDisplayMedia() メソッドを使用して、 WebRTC 会議セッション中に画面の一部または全部をストリーミング、録音、共有用に取得する方法を検証していきます。","popularity":0.0022,"modified":"2024-09-22T09:08:49.000Z","other_translations":[{"locale":"de","title":"Verwendung der Screen Capture API","native":"Deutsch"},{"locale":"en-US","title":"Using the Screen Capture API","native":"English (US)"},{"locale":"es","title":"Uso de la API de captura de pantalla","native":"Español"},{"locale":"ru","title":"Использование интерфейса Screen Capture API","native":"Русский"}],"pageType":"unknown","source":{"folder":"ja/web/api/screen_capture_api/using_screen_capture","github_url":"https://github.com/mdn/translated-content/blob/main/files/ja/web/api/screen_capture_api/using_screen_capture/index.md","last_commit_url":"https://github.com/mdn/translated-content/commit/e2cd0ab39df8acf834a7c60361cba80751b9d7c5","filename":"index.md"},"short_title":"画面キャプチャ API の使用","parents":[{"uri":"/ja/docs/Web","title":"開発者向けのウェブ技術"},{"uri":"/ja/docs/Web/API","title":"Web API"},{"uri":"/ja/docs/Web/API/Screen_Capture_API","title":"画面キャプチャ API"},{"uri":"/ja/docs/Web/API/Screen_Capture_API/Using_Screen_Capture","title":"画面キャプチャ API の使用"}],"pageTitle":"画面キャプチャ API の使用 - Web API | MDN","noIndexing":false}}</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10