SlideShare a Scribd company logo
いろんなユーザメディアを
使ってみよう
2015.08.03
WebRTC Meetup Tokyo #9
インフォコム株式会社
がねこまさし
@massie_g
1
いろんなユーザメディアを
使ってみよう
2015.08.03
WebRTC Meetup Tokyo #9
インフォコム株式会社
がねこまさし
@massie_g
2
メディアストリーム
今日のお話は、ここ!
3
PeerConnectionMediaStream
Chrome 44
Firefox 39 Firefox Nightly 42
おまじない
5
navigator.getUserMedia =
navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia;
カメラ
6
function startCamera() {
var gum = {video: true, audio: false};
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL;
}
マイク
7
function startMic() {
var gum = {video: false, audio: true};
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL; // ※本来はaudioを使う
}
カメラ+マイク
8
function startCamera() {
var gum = {video: true, audio: true};
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL;
}
カメラ+マイク MS Edge
9
// New API
function startCamera() {
navigator.mediaDevices.getUserMedia(
{video: true, audio: false}
).then(function(stream) {
video.srcObject = stream;
}).catch(function(err){
console.error('getUserMedia Err:', err);
});
}
カメラ+マイク MS Edge
10
// Old API
function startCamera() {
navigator. getUserMedia(
{video: true, audio: false},
function(stream) {
video.src = window.URL.createObjectURL(stream);
},
function(err){
console.error('getUserMedia Err:', err);
}
);
}
Fake カメラ
11
function startMic() {
var gum = {video: true, fake: true, audio: false};
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL;
}
Fake マイク
12
function startMic() {
var gum = {video: false, fake: true, audio: true};
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL;
}
スクリーン/ウィンドウキャプチャ
13
• Chromeでは、機能拡張(Extension)が必要
– http://www.slideshare.net/yusukenaka52/screenshare-public
• https:// を使う
ブラウザ側
var extensionId = ”xxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // extension id
chrome.runtime.sendMessage(extensionId, { getStream: true},
function(response) {
navigator.getUserMedia({
audio:false, // ※Audioと一緒には取得できない
video: { mandatory: { chromeMediaSource: "desktop",
chromeMediaSourceId: response.mediaid,
maxWidth : width, maxHeight : height }
}
}, successCallback, errorCallback);
}
);
スクリーン/ウィンドウキャプチャ
14
• ※注意:audioと一緒には取得できない
PeerConnection
MediaStream
MediaStream
PeerConnectionMediaStream
MediaStreamTrack
MediaStreamTrack
MediaStream
スクリーンキャプチャ
15
• Firefoxでは、about:configの設定で利用可能
• media.getusermedia.screensharing.enabled を新規に作成
– true に設定
• media.getusermedia.screensharing.allowed_domains
– 自分のサーバーのドメイン名、IPアドレスを追記
• https:// を使う
スクリーンキャプチャ
16
function startFirefoxScreen () {
var gum = {video: { mediaSource: "screen" }, audio: false};
// audio: true も可
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL;
}
ウィンドウキャプチャ
17
function startFirefoxScreen () {
var gum = {video: { mediaSource: "window" }, audio: false};
navigator.getUserMedia(gum,
showMedia, errCallback
);
}
function showMedia(stream) {
localStreamURL = window.URL.createObjectURL(stream);
localVideo.src = localStreamURL;
}
WebAudio oscillator
18
var context = new (window.AudioContext || window.webkitAudioContext)();
function startWebAudio() {
var oscillator = context.createOscillator();
oscillator.type = "sawtooth";
oscillator.frequency.value = 440; // 440Hz
// convert to mediastream
var destintation = context.createMediaStreamDestination();
oscillator.connect(destintation);
// start
var current = context.currentTime;
oscillator.start(current); // start now
oscillator.stop(current + 3.0); // stop 3 sec after
// show
showMedia(destintation.stream);
}
WebAudio from file (1)
19
var context = new (window.AudioContext || window.webkitAudioContext)();
// load file via XHR
function loadSound(file, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", file, true);
xhr.responseType = "arraybuffer";
xhr.onreadystatechange=function(){ // OK for Chrome, Safari
if(xhr.readyState==4 && xhr.status==200){
console.log('xhr.readystate 200');
context.decodeAudioData(xhr.response,function(buf){
callback(buf);
}, function(){console.error('decode error');});
}
}
xhr.send();
}
WebAudio from file (2)
20
function startWebAudioFile() {
var audioclip;
loadSound('http://yourserver.com/sound.mp3',
function(buf) {
audioclip = buf;
var src = context.createBufferSource();
src.buffer = audioclip;
var destintation = context.createMediaStreamDestination();
src.connect(destintation);
src.start(0);
// show
showMedia(destintation.stream);
}
);
}
Canvasキャプチャ
21
• Firefox Nightlyで簡易実装。about:configの設定で利用可能
• canvas.capturestream.enabled
– true に設定
• https:// を使う ← http:// でも OK
Canvasキャプチャ
22
function startCanvas() {
localStream = canvas.captureStream(10); // FPS(必須)
if (localStream) {
localStreamURL = URL.createObjectURL(localStream);
localVideo.src = localStreamURL;
}
}
Canvasキャプチャ
23
function startCanvas() {
localStream = canvas.captureStream(10); // FPS(必須)
if (localStream) {
localStreamURL = URL.createObjectURL(localStream);
localVideo.src = localStreamURL;
}
}
MediaRecorder と組み合わせて使いたいらしい
オマケ
24
メディアソース一覧 Chrome
function getChromeMediaSource() {
MediaStreamTrack.getSources(function(sourceInfos) {
for (var i = 0; i != sourceInfos.length; ++i) {
var sourceInfo = sourceInfos[i];
if (sourceInfo.kind === 'audio') {
var id = sourceInfo.id;
var label = sourceInfo.label || 'microphone'; // label is available for https
// 適宜処理する
}
else if (sourceInfo.kind === 'video') {
var id = sourceInfo.id;
var label = sourceInfo.label || 'camera'; // label is available for https
} else {
console.log('Some other kind of source: ', sourceInfo);
}
}
});
25
デバイス一覧Firefox, Edge
function getDevices() {
navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
devices.forEach(function(device) {
console.log(device.kind + ": " + device.label + " id = " + device.deviceId);
if (device.kind === 'audioinput') {
var id = device.deviceId;
var label = device.label || 'microphone'; // label is available for specific domain with https
// 適宜処理する
}
else if (device.kind === 'videoinput') {
var id = device.deviceId;
var label = device.label || 'camera'; // label is available for specific domain with https
// 適宜処理する
}
});
})
.catch(function(err) {
console.log(err.name + ": " + error.message);
});
}
26
オマケ2
27
なんちゃって デジタルズーム
28
<video>
<div style="overflow: hidden;">
Thank you!
29

More Related Content

PDF
[2018] Java를 위한, Java에 의한 도구들
PPTX
WebRTC SFU Mediasoup Sample update
PDF
SFUの話
PDF
WebRTC と Native とそれから、それから。
PDF
elixirを使ったゲームサーバ
PDF
フラッター開発におけるシークレット情報取扱考察
PDF
RFC 〜 ネットワーク勉強会
PPTX
WebRTC SFU mediasoup sample
[2018] Java를 위한, Java에 의한 도구들
WebRTC SFU Mediasoup Sample update
SFUの話
WebRTC と Native とそれから、それから。
elixirを使ったゲームサーバ
フラッター開発におけるシークレット情報取扱考察
RFC 〜 ネットワーク勉強会
WebRTC SFU mediasoup sample

What's hot (20)

PDF
Device Tree for Dummies (ELC 2014)
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PPTX
Java 9で進化する診断ツール
PDF
初めての Spanner 移行
PDF
Goの時刻に関するテスト
PPTX
Android audio system(오디오 플링거 서비스 초기화)
PDF
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
PPTX
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
PDF
About GStreamer 1.0 application development for beginners
PPT
Riserva uno 2
PDF
Protocol Buffers 入門
PDF
Hadoopの概念と基本的知識
PPTX
C# 9.0 / .NET 5.0
PDF
DSF実行委員長_酒井様_講演資料
PPTX
Introduction to Haproxy
PDF
Understanding low latency jvm gcs
PDF
MySQLステータスモニタリング
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
Spring AMQP × RabbitMQ
Device Tree for Dummies (ELC 2014)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Java 9で進化する診断ツール
初めての Spanner 移行
Goの時刻に関するテスト
Android audio system(오디오 플링거 서비스 초기화)
NVIDIA cuQuantum SDK による量子回路シミュレーターの高速化
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
About GStreamer 1.0 application development for beginners
Riserva uno 2
Protocol Buffers 入門
Hadoopの概念と基本的知識
C# 9.0 / .NET 5.0
DSF実行委員長_酒井様_講演資料
Introduction to Haproxy
Understanding low latency jvm gcs
MySQLステータスモニタリング
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Spring AMQP × RabbitMQ
Ad

Viewers also liked (18)

PPTX
Chrome Extensionで スクリーンシェアをやってみる
PPTX
Testing and packaging WebRTC Stack
PPTX
スマホアプリBestieBoxにWebRTCを組みこんでみた
PDF
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
PDF
2013 WebRTC 概説 & ワークショップ
PDF
ち〜ん
PPTX
HTML5 技術を利用した授業や会議向けデスクトップ画面実時間配信システムとその管理システムの試作, 情報処理学会IOT研究会26
PDF
IoTをインターネット越しで見る
PPTX
WebRTC NextVersion時代のJavaScript開発
PPTX
ORTCの仕様書をざっくり斜め読みする
PDF
Jitsi video bridge で遊んでみた
PPTX
知ってると得するかもしれないConstraintsたち
PPTX
WebRTC Build MCU on browser
PDF
WebRTC/ORTCの最新動向まるわかり!
PPTX
WebRTCサービスを個人で運営してみた話
PDF
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
PPTX
ブラウザでWebRTC - iOSゲートウェイ作ってみた
PPTX
進化するEdge! ~Creators Update版の新機能から既存機能までまとめて解説!~
Chrome Extensionで スクリーンシェアをやってみる
Testing and packaging WebRTC Stack
スマホアプリBestieBoxにWebRTCを組みこんでみた
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
2013 WebRTC 概説 & ワークショップ
ち〜ん
HTML5 技術を利用した授業や会議向けデスクトップ画面実時間配信システムとその管理システムの試作, 情報処理学会IOT研究会26
IoTをインターネット越しで見る
WebRTC NextVersion時代のJavaScript開発
ORTCの仕様書をざっくり斜め読みする
Jitsi video bridge で遊んでみた
知ってると得するかもしれないConstraintsたち
WebRTC Build MCU on browser
WebRTC/ORTCの最新動向まるわかり!
WebRTCサービスを個人で運営してみた話
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
ブラウザでWebRTC - iOSゲートウェイ作ってみた
進化するEdge! ~Creators Update版の新機能から既存機能までまとめて解説!~
Ad

Similar to WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう (20)

KEY
WebRTCでドラゴンボールごっこ
PDF
WebRTCの技術解説 第二版 公開版 完全版
PDF
HTML5開発最前線
PPTX
getUserMedia
PDF
WebRTCの技術解説 公開版
PDF
20140830 firefox os-sampler
PDF
WebRTC + Web Audio API = スーパーサイヤ人
PPTX
iPhoneでなんちゃってWebRTC
PDF
[Htmlday]present
PDF
Leading the way to W3C TPAC 2015 『HTML5 関連の API の現状とこれから』
PDF
FM音源をいじれるWebサービスを作った
PPTX
MediaRecorder と WebM で、オレオレ Live Streaming
PDF
20130216
PDF
Kilimanjaro Event
PDF
組み込みブラウザとメディアﰀ仕様あれこれ
PPTX
Web Audio APIでシンセサイザーの作成
PDF
HTML5でできるカメラアプリを実際に体験しよう
PDF
Mobile Web
PDF
JavaScript And Keywords
PDF
Browser and Mozilla
WebRTCでドラゴンボールごっこ
WebRTCの技術解説 第二版 公開版 完全版
HTML5開発最前線
getUserMedia
WebRTCの技術解説 公開版
20140830 firefox os-sampler
WebRTC + Web Audio API = スーパーサイヤ人
iPhoneでなんちゃってWebRTC
[Htmlday]present
Leading the way to W3C TPAC 2015 『HTML5 関連の API の現状とこれから』
FM音源をいじれるWebサービスを作った
MediaRecorder と WebM で、オレオレ Live Streaming
20130216
Kilimanjaro Event
組み込みブラウザとメディアﰀ仕様あれこれ
Web Audio APIでシンセサイザーの作成
HTML5でできるカメラアプリを実際に体験しよう
Mobile Web
JavaScript And Keywords
Browser and Mozilla

More from mganeko (20)

PDF
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
PPTX
Amazon Kinesis Video Streams WebRTC 使ってみた
PPTX
Build Node.js-WASM/WASI Tiny compiler with Node.js
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PPTX
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
PPTX
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
PPTX
WebRTC mediasoup on raspberrypi3
PDF
Inside of 聖徳玉子 by O2
PDF
Node.js with WebRTC DataChannel
PPTX
PeerConnectionリレーとMediaRecorder
PPTX
ここがつらいよWebRTC - WebRTC開発の落とし穴
PPTX
Webrtc bootcamp handson
PPTX
WebRTC multitrack / multistream
PDF
WebRTC multistream
PPTX
Inside WebM
PPTX
Chromebook 「だけ」で WebRTCを動かそう
PPTX
Infocom webrtc conference japan
PPTX
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
PPTX
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
PDF
WebRTC Summit 2014 NewYork 参加報告
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Amazon Kinesis Video Streams WebRTC 使ってみた
Build Node.js-WASM/WASI Tiny compiler with Node.js
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
WebRTC mediasoup on raspberrypi3
Inside of 聖徳玉子 by O2
Node.js with WebRTC DataChannel
PeerConnectionリレーとMediaRecorder
ここがつらいよWebRTC - WebRTC開発の落とし穴
Webrtc bootcamp handson
WebRTC multitrack / multistream
WebRTC multistream
Inside WebM
Chromebook 「だけ」で WebRTCを動かそう
Infocom webrtc conference japan
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
WebRTC Summit 2014 NewYork 参加報告

WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう