SlideShare una empresa de Scribd logo
1 de 21
WebRTC Statistics / getStats を覗いてみる 
WebRTC Meetup Tokyo #5 LT 
2014.11.26 
インフォコム株式会社 
がねこまさし
WebRTC Statistics API ? 
• Identifiers for WebRTC's Statistics API 
– http://w3c.github.io/webrtc-stats/webrtc-stats.html 
– → 正直、良く分かりません 
– → 実装レベルも、まだこれから? 
• なので、実際に取れる内容を見てみます 
– RTCPeerConnection.getStats() 
– Chrome 38の場合
統計情報の取り出し方 
• RTCPeerConnection.getStats()を呼ぶ 
– 戻り値ではなく、コールバックで取得 
– コールバックの引数:RTCStatReportの配列 
RTCPeerConnection.getStats(callback(res)) 
Array 
RTCStatReport 
RTCStatReport 
RTCStatReport 
res 
callbackで取得 
peerconnection.getStats(function(res){ 
var rtcStatsReports = res.result(); // array of available status-reports 
var reportCount = rtcStatsReports.length; 
);
統計情報RTCStatReport の内容 
.type ... 情報のタイプ。次の様な種類がある 
– googComponent ... WebRTCコンポーネントの情報 
– googCandidatePair ... リストアップされたICE Candidate情報 
– googCertificate ... 認証情報。SRTPの暗号化に関係? 
– googLibjingleSession ... 内部的なライブラリの情報 
– googTrac ... オーディオ/ビデオトラックの情報 
– ssrc ... 実際に流れているストリームの情報 
– ※種類ごとに実際に持つ属性が異なる 
.names() …情報が持つ属性の名前の配列を返す 
– RDBのレコードのカラム名を、配列で返すようなイメージ 
.stat(name) ... 属性名を指定し、その値を取得する 
– RDBのレコードから、カラム名を指定してその値を取得するイメージ
属性値の取得 
RTCStatReport String: name 
String: name 
String: name 
String: stat 
String: stat 
String: stat 
nameを使って取得 
RTCStatReport.stat(name) 
RTCStatReport.names() 
で取得
統計情報RTCStatReport の属性値 
.type === ‘ssrc’ の場合 
• googTrackId ... ビデオ/オーディオトラックの内部的なID 
• bytesReceived ... 受信用ストリームの場合の、受信したバイト数 
– (※前回統計情報を取得してから、今回までの間の値と推定される) 
• bytesSent ... 送信用ストリームの場合の、送信したバイト数 
– (※前回統計情報を取得してから、今回までの間の値と推定される) 
• googCodecName ... コーデック名。オーディオの場合はopus、ビデオの場合はVP8など。 
• googFrameHeightReceived ... ビデオ受信ストリームの場合の、映像の高さ(ピクセル数) 
• googFrameWidthReceived ... ビデオ受信ストリームの場合の、映像の幅(ピクセル数) 
• googFrameRateReceived ... ビデオ受信ストリームの場合の、映像の秒間フレーム数 
• googFrameHeightInput ... ビデオ送信ストリームの場合の、入力映像の高さ(ピクセル数) 
• googFrameWidthInput ... ビデオ送信ストリームの場合の、入力映像の幅(ピクセル数) 
• googFrameHeightSent ... ビデオ送信ストリームの場合の、実際に送信している映像の高 
さ(ピクセル数) 
• googFrameWidthSent ... ビデオ送信ストリームの場合の、実際に送信している映像の幅 
(ピクセル数) 
• googFrameRateSent ... ビデオ送信ストリームの場合の、実際に送信している映像の秒間 
フレーム数
getStats()と、取り出せる情報(全体) 
RTCPeerConnection.getStats(callback(res)) 
RTCStatReport 
RTCStatReport 
RTCStatReport 
res 
Array 
Array 
String: name 
String: name 
String: name 
String: stat 
String: stat 
String: stat nameを使って取得 
RTCStatReport.stat(name) 
callbackで取得
ソース例 
peerconnection.getStats(function(res){ 
var rtcStatsReports = res.result(); // array of available status-reports 
var reportCount = rtcStatsReports.length; 
var reportIndex; 
for (reportIndex = 0; reportIndex < reportCount; reportIndex++) { 
var report = rtcStatsReports[reportIndex]; 
var line = 'type=' + report.type + ' '; 
var names = report.names(); 
var nameIndex; 
for (nameIndex = 0; nameIndex < names.length; nameIndex++) { 
var name = names[nameIndex]; 
var statValue = report.stat(name); 
line += (name + ':' + statValue + ', '); 
} 
console.log(line); 
} 
});
getStats() 結果サンプル 
type=googComponent googLocalCertificateId:googCertificate_67:92:0C:C9:C7:AA:BF:B6:8A:... 
googRemoteCertificateId:googCertificate_67:92:0C:C9:C7:AA:BF:B6:8A:77:98:90:95:72:EE:... 
type=googCandidatePair googRemoteAddress:192.168.xx.xx:49392, googWritable:true, googReadable:true, googLocalAddress:192.168.xx.xx:63416, 
googLocalCandidateType:local, googTransportType:udp, googChannelId:Channel-audio-1, googActiveConnection:true, bytesReceived:271033, 
googRemoteCandidateType:local, bytesSent:269639, googRtt:399 
... 
type=VideoBwe googActualEncBitrate:408525, googAvailableSendBandwidth:435792, googRetransmitBitrate:0, 
googAvailableReceiveBandwidth:442608, googTargetEncBitrate:435792, googBucketDelay:7, googTransmitBitrate:401666, 
type=googCertificate googFingerprint:67:92:0C:C9:C7:AA:BF:B6:8A:... 
type=googLibjingleSession googInitiator:true, 
type=googTrack googTrackId:5178c659-b673-40e7-b388-.... 
.... 
type=ssrc googTargetDelayMs:36, packetsLost:0, googDecodeMs:2, googFrameHeightReceived:480, 
packetsReceived:292, ssrc:1470008958, googRenderDelayMs:10, googMaxDecodeMs:3, 
googTrackId:9ac40967-7933-4285-b072-86e00f68701e, googFrameWidthReceived:640, transportId:Channel-audio-1, 
googFrameRateReceived:30, googFrameRateDecoded:0, googNacksSent:0, googFirsSent:0, bytesReceived:237413, 
googCurrentDelayMs:36, googCaptureStartNtpTimeMs:3625271364920, googMinPlayoutDelayMs:0, googFrameRateOutput:0, googJitterBufferMs:23, 
googPlisSent:0, 
type=ssrc googDecodingCTN:613, packetsLost:0, googDecodingPLC:3, packetsReceived:267, googJitterReceived:0, googPreferredJitterBufferMs:20, 
ssrc:3601597370, ... 
type=ssrc googFrameHeightInput:480, googFrameWidthInput:640, googCaptureQueueDelayMsPerS:3, packetsLost:0, googRtt:1, 
googEncodeUsagePercent:38, googCpuLimitedResolution:false, googNacksReceived:0, ssrc:4169404559, googFrameRateInput:0, 
googPlisReceived:0, googViewLimitedResolution:false, googCaptureJitterMs:23, googAvgEncodeMs:5, 
... 
googFrameHeightSent:480, googEncodeRelStdDev:0, googFrameRateSent:30, googCodecName:VP8, googBandwidthLimitedResolution:false, 
googAdaptationChanges:0, 
googFrameWidthSent:640, googFirsReceived:0, packetsSent:292, bytesSent:235786 
type=ssrc audioInputLevel:2456, packetsLost:0, googRtt:1, googEchoCancellationReturnLossEnhancement:-100, ...
Thank you!
オマケ:時間があまったら
他のステータスイベント 
• PeerConnection.onsignalingstatechange 
– SDPのやり取りの通知 
• PeerConnection.oniceconnectionstatechange 
– ICE Candidateのやり取りの通知 
• テスト自動化や、エラー検出、トラブルシュー 
ティングに上手く使えないか?
正常に通信が確立するまで 
(通信を始めるOffer側) 
• SDPのやり取り 
– PeerConnection.createOffer() 
• PeerConnection.setLocalDescription(sdp) 
– PeerConnection.onsignalingstatechange 発生 
• PeerConnection.signalingState === 'have-local-offer‘ 
– PeerConnection. setRemoteDescription(sdp) 
– PeerConnection.onsignalingstatechange 発生 
• PeerConnection.signalingState === 'stable'
正常に通信が確立するまで 
(通信を始めるOffer側) 
• ICE Candidate のやり取り 
– PeerConnection.oniceconnectionstatechange 発生 
• PeerConnection.iceConnectionState === 'checking' 
• PeerConnection.iceGatheringState === 'gathering' 
– PeerConnection.oniceconnectionstatechange 発生 
• PeerConnection.iceConnectionState === 'connected' 
• PeerConnection.iceGatheringState === 'complete' 
– PeerConnection.oniceconnectionstatechange 発生 
• PeerConnection.iceConnectionState === 'completed' 
• PeerConnection.iceGatheringState === 'complete' 
• ここまで来れば通信が確立、ストリーム開始
正常に通信が確立するまで 
(通信を始めるAnswer側) 
• SDPのやり取り 
– PeerConnection. setRemoteDescription(sdp) 
– PeerConnection.onsignalingstatechange 発生 
• PeerConnection.signalingState === 'have-remote-offer' 
– PeerConnection.createAnswer() 
• PeerConnection.setLocalDescription(sdp) 
– PeerConnection.onsignalingstatechange 発生 
• PeerConnection.signalingState === 'stable'
行儀よく切断するまでの流れ 
• PeerConnection.oniceconnectionstatechange 発生 
– PeerConnection.iceConnectionState === 'closed' 
– PeerConnection.iceGatheringState === 'complete' 
• PeerConnection.onsignalingstatechange 発生 
– PeerConnection.signalingState === 'closed' 
• 適切に通信終了した場合 
– どちらのステータスもclosed に
強制的にネットワークを切断した場合 
• 切断した側(ネットワークが死んだ側) 
– イベントが発生 
– PeerConnection.oniceconnectionstatechange 発生 
• PeerConnection.iceConnectionState === 'disconnected' 
• PeerConnection.iceGatheringState === 'complete' 
– これを使えばモバイル環境などでネットワークが切れたこ 
とを検出できそう 
• ※残念ながら切断された側(自分はネットワークが 
生きている側)では、イベントは発生しなかった
Firewallなどの影響で通信が確立できない場合 
• SDPのやり取り 
– PeerConnection.onsignalingstatechange 発生 
• PeerConnection.signalingState === 'have-local-offer' 
– PeerConnection.onsignalingstatechange 発生 
• PeerConnection.signalingState === 'stable' 
• ICE Candidatenのやり取り 
– PeerConnection.oniceconnectionstatechange 発生 
• PeerConnection.iceConnectionState === 'checking' 
• PeerConnection.iceGatheringState === 'gathering' 
• 残念ながらcheckingの状態が続いた 
– 失敗を表す‘failed’ にはならなかった 
– 一定時間(60秒とか) checkingが続いたらエラー 
とみなす必要がありそう
signalingStateの変遷 
(公式http://w3c.github.io/webrtc-pc/ より拝借) 
? 
?
iceConnectionState の変遷 
(公式http://w3c.github.io/webrtc-pc/ より拝借) 
?
Thank you, again!

Más contenido relacionado

La actualidad más candente

リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 Yugo Shimizu
 
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthYoshifumi Kawai
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannelmganeko
 
Drone programming with ArduPilot
Drone programming  with ArduPilotDrone programming  with ArduPilot
Drone programming with ArduPilotLINE Corporation
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
平成生まれのための MINIX 講座
平成生まれのための MINIX 講座平成生まれのための MINIX 講座
平成生まれのための MINIX 講座TAKANO Mitsuhiro
 
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例Naoya Kishimoto
 
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
Media Art II 2013  第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズムMedia Art II 2013  第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズムAtsushi Tadokoro
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~モノビット エンジン
 
WebRTCの技術解説 第二版 公開版 完全版
WebRTCの技術解説 第二版 公開版 完全版WebRTCの技術解説 第二版 公開版 完全版
WebRTCの技術解説 第二版 公開版 完全版Contest Ntt-west
 
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55Preferred Networks
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Yoshiaki Shibutani
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術Yoshiaki Sugimoto
 
すごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼうすごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼうi_yudai
 
スマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCスマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCNatsuki Yamanaka
 
Prometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusPrometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusTakeo Noda
 
12 分くらいで知るLuaVM
12 分くらいで知るLuaVM12 分くらいで知るLuaVM
12 分くらいで知るLuaVMYuki Tamura
 

La actualidad más candente (20)

リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
 
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannel
 
Drone programming with ArduPilot
Drone programming  with ArduPilotDrone programming  with ArduPilot
Drone programming with ArduPilot
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
平成生まれのための MINIX 講座
平成生まれのための MINIX 講座平成生まれのための MINIX 講座
平成生まれのための MINIX 講座
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
 
WebRTC研修
WebRTC研修WebRTC研修
WebRTC研修
 
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
Media Art II 2013  第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズムMedia Art II 2013  第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
WebRTCの技術解説 第二版 公開版 完全版
WebRTCの技術解説 第二版 公開版 完全版WebRTCの技術解説 第二版 公開版 完全版
WebRTCの技術解説 第二版 公開版 完全版
 
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
 
すごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼうすごいBOSHたのしく学ぼう
すごいBOSHたのしく学ぼう
 
スマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCスマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTC
 
Prometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusPrometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start Prometeus
 
12 分くらいで知るLuaVM
12 分くらいで知るLuaVM12 分くらいで知るLuaVM
12 分くらいで知るLuaVM
 

Destacado

What is RTCMultiConnection?
What is RTCMultiConnection?What is RTCMultiConnection?
What is RTCMultiConnection?Muaz Khan
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistreammganeko
 
Basics of WebRTC getStats() API
Basics of WebRTC getStats() APIBasics of WebRTC getStats() API
Basics of WebRTC getStats() APIcallstats.io
 
WebRTC Reborn Hackference
WebRTC Reborn HackferenceWebRTC Reborn Hackference
WebRTC Reborn HackferenceDan Jenkins
 
5分でわかるWebRTC
5分でわかるWebRTC5分でわかるWebRTC
5分でわかるWebRTCRyosuke Otsuya
 
Kranky Geek WebRTC 2015 - What's next for WebRTC?
Kranky Geek WebRTC 2015 - What's next for WebRTC?Kranky Geek WebRTC 2015 - What's next for WebRTC?
Kranky Geek WebRTC 2015 - What's next for WebRTC?Kranky Geek
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streamingmganeko
 
SFUの話
SFUの話SFUの話
SFUの話tnoho
 
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...Mario Heiderich
 
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-注目の最新技術「WebRTC」とは? -技術概要と事例紹介-
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-Yusuke Naka
 
ライブストリーミングの基礎知識
ライブストリーミングの基礎知識ライブストリーミングの基礎知識
ライブストリーミングの基礎知識kumaryu
 
Whoscall 的 Realtime Monitoring 經驗分享
Whoscall 的 Realtime Monitoring 經驗分享Whoscall 的 Realtime Monitoring 經驗分享
Whoscall 的 Realtime Monitoring 經驗分享William Yeh
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたmganeko
 
Linux Performance Analysis and Tools
Linux Performance Analysis and ToolsLinux Performance Analysis and Tools
Linux Performance Analysis and ToolsBrendan Gregg
 
第一次用 Vue.js 就愛上 [改]
第一次用 Vue.js 就愛上 [改]第一次用 Vue.js 就愛上 [改]
第一次用 Vue.js 就愛上 [改]Kuro Hsu
 
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習台灣資料科學年會
 
姜俊宇/從資料到知識:從零開始的資料探勘
姜俊宇/從資料到知識:從零開始的資料探勘姜俊宇/從資料到知識:從零開始的資料探勘
姜俊宇/從資料到知識:從零開始的資料探勘台灣資料科學年會
 

Destacado (18)

What is RTCMultiConnection?
What is RTCMultiConnection?What is RTCMultiConnection?
What is RTCMultiConnection?
 
FirefoxでgetStats()
FirefoxでgetStats()FirefoxでgetStats()
FirefoxでgetStats()
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistream
 
Basics of WebRTC getStats() API
Basics of WebRTC getStats() APIBasics of WebRTC getStats() API
Basics of WebRTC getStats() API
 
WebRTC Reborn Hackference
WebRTC Reborn HackferenceWebRTC Reborn Hackference
WebRTC Reborn Hackference
 
5分でわかるWebRTC
5分でわかるWebRTC5分でわかるWebRTC
5分でわかるWebRTC
 
Kranky Geek WebRTC 2015 - What's next for WebRTC?
Kranky Geek WebRTC 2015 - What's next for WebRTC?Kranky Geek WebRTC 2015 - What's next for WebRTC?
Kranky Geek WebRTC 2015 - What's next for WebRTC?
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
 
SFUの話
SFUの話SFUの話
SFUの話
 
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
ECMAScript 6 from an Attacker's Perspective - Breaking Frameworks, Sandboxes,...
 
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-注目の最新技術「WebRTC」とは? -技術概要と事例紹介-
注目の最新技術「WebRTC」とは? -技術概要と事例紹介-
 
ライブストリーミングの基礎知識
ライブストリーミングの基礎知識ライブストリーミングの基礎知識
ライブストリーミングの基礎知識
 
Whoscall 的 Realtime Monitoring 經驗分享
Whoscall 的 Realtime Monitoring 經驗分享Whoscall 的 Realtime Monitoring 經驗分享
Whoscall 的 Realtime Monitoring 經驗分享
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみた
 
Linux Performance Analysis and Tools
Linux Performance Analysis and ToolsLinux Performance Analysis and Tools
Linux Performance Analysis and Tools
 
第一次用 Vue.js 就愛上 [改]
第一次用 Vue.js 就愛上 [改]第一次用 Vue.js 就愛上 [改]
第一次用 Vue.js 就愛上 [改]
 
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
 
姜俊宇/從資料到知識:從零開始的資料探勘
姜俊宇/從資料到知識:從零開始的資料探勘姜俊宇/從資料到知識:從零開始的資料探勘
姜俊宇/從資料到知識:從零開始的資料探勘
 

Similar a WebRTC getStats - WebRTC Meetup Tokyo 5 LT

Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理土岐 孝平
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよkoji lin
 
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”するde:code 2017
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについてtetsusat
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発Yusuke Naka
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidationTakayoshi Tanaka
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1mganeko
 
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1Masaya Aoyama
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
150629 03
150629 03150629 03
150629 03openrtm
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大openrtm
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料Koichiro Sasaki
 
VerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven VerificationVerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven VerificationMr. Vengineer
 
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...Hiroshi Masuda
 
CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。Matsushita Satoshi
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-Takakiyo Tanaka
 
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版openrtm
 

Similar a WebRTC getStats - WebRTC Meetup Tokyo 5 LT (20)

Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについて
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidation
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
 
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
150629 03
150629 03150629 03
150629 03
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料
 
VerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven VerificationVerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven Verification
 
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...
Tableau Developers Club Season2 /*TableauのAPIすべて*/ Tableau Server REST API Wo...
 
CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
 
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版
 

Más de mganeko

Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)mganeko
 
Amazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみたAmazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみたmganeko
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsmganeko
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...mganeko
 
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねSkywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねmganeko
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3mganeko
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updatemganeko
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup samplemganeko
 
Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2mganeko
 
WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browsermganeko
 
PeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorderPeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecordermganeko
 
ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴mganeko
 
Webrtc bootcamp handson
Webrtc bootcamp handsonWebrtc bootcamp handson
Webrtc bootcamp handsonmganeko
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようmganeko
 
Inside WebM
Inside WebMInside WebM
Inside WebMmganeko
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうmganeko
 
Infocom webrtc conference japan
Infocom webrtc conference japanInfocom webrtc conference japan
Infocom webrtc conference japanmganeko
 
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )mganeko
 
WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告mganeko
 

Más de mganeko (20)

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

WebRTC getStats - WebRTC Meetup Tokyo 5 LT

  • 1. WebRTC Statistics / getStats を覗いてみる WebRTC Meetup Tokyo #5 LT 2014.11.26 インフォコム株式会社 がねこまさし
  • 2. WebRTC Statistics API ? • Identifiers for WebRTC's Statistics API – http://w3c.github.io/webrtc-stats/webrtc-stats.html – → 正直、良く分かりません – → 実装レベルも、まだこれから? • なので、実際に取れる内容を見てみます – RTCPeerConnection.getStats() – Chrome 38の場合
  • 3. 統計情報の取り出し方 • RTCPeerConnection.getStats()を呼ぶ – 戻り値ではなく、コールバックで取得 – コールバックの引数:RTCStatReportの配列 RTCPeerConnection.getStats(callback(res)) Array RTCStatReport RTCStatReport RTCStatReport res callbackで取得 peerconnection.getStats(function(res){ var rtcStatsReports = res.result(); // array of available status-reports var reportCount = rtcStatsReports.length; );
  • 4. 統計情報RTCStatReport の内容 .type ... 情報のタイプ。次の様な種類がある – googComponent ... WebRTCコンポーネントの情報 – googCandidatePair ... リストアップされたICE Candidate情報 – googCertificate ... 認証情報。SRTPの暗号化に関係? – googLibjingleSession ... 内部的なライブラリの情報 – googTrac ... オーディオ/ビデオトラックの情報 – ssrc ... 実際に流れているストリームの情報 – ※種類ごとに実際に持つ属性が異なる .names() …情報が持つ属性の名前の配列を返す – RDBのレコードのカラム名を、配列で返すようなイメージ .stat(name) ... 属性名を指定し、その値を取得する – RDBのレコードから、カラム名を指定してその値を取得するイメージ
  • 5. 属性値の取得 RTCStatReport String: name String: name String: name String: stat String: stat String: stat nameを使って取得 RTCStatReport.stat(name) RTCStatReport.names() で取得
  • 6. 統計情報RTCStatReport の属性値 .type === ‘ssrc’ の場合 • googTrackId ... ビデオ/オーディオトラックの内部的なID • bytesReceived ... 受信用ストリームの場合の、受信したバイト数 – (※前回統計情報を取得してから、今回までの間の値と推定される) • bytesSent ... 送信用ストリームの場合の、送信したバイト数 – (※前回統計情報を取得してから、今回までの間の値と推定される) • googCodecName ... コーデック名。オーディオの場合はopus、ビデオの場合はVP8など。 • googFrameHeightReceived ... ビデオ受信ストリームの場合の、映像の高さ(ピクセル数) • googFrameWidthReceived ... ビデオ受信ストリームの場合の、映像の幅(ピクセル数) • googFrameRateReceived ... ビデオ受信ストリームの場合の、映像の秒間フレーム数 • googFrameHeightInput ... ビデオ送信ストリームの場合の、入力映像の高さ(ピクセル数) • googFrameWidthInput ... ビデオ送信ストリームの場合の、入力映像の幅(ピクセル数) • googFrameHeightSent ... ビデオ送信ストリームの場合の、実際に送信している映像の高 さ(ピクセル数) • googFrameWidthSent ... ビデオ送信ストリームの場合の、実際に送信している映像の幅 (ピクセル数) • googFrameRateSent ... ビデオ送信ストリームの場合の、実際に送信している映像の秒間 フレーム数
  • 7. getStats()と、取り出せる情報(全体) RTCPeerConnection.getStats(callback(res)) RTCStatReport RTCStatReport RTCStatReport res Array Array String: name String: name String: name String: stat String: stat String: stat nameを使って取得 RTCStatReport.stat(name) callbackで取得
  • 8. ソース例 peerconnection.getStats(function(res){ var rtcStatsReports = res.result(); // array of available status-reports var reportCount = rtcStatsReports.length; var reportIndex; for (reportIndex = 0; reportIndex < reportCount; reportIndex++) { var report = rtcStatsReports[reportIndex]; var line = 'type=' + report.type + ' '; var names = report.names(); var nameIndex; for (nameIndex = 0; nameIndex < names.length; nameIndex++) { var name = names[nameIndex]; var statValue = report.stat(name); line += (name + ':' + statValue + ', '); } console.log(line); } });
  • 9. getStats() 結果サンプル type=googComponent googLocalCertificateId:googCertificate_67:92:0C:C9:C7:AA:BF:B6:8A:... googRemoteCertificateId:googCertificate_67:92:0C:C9:C7:AA:BF:B6:8A:77:98:90:95:72:EE:... type=googCandidatePair googRemoteAddress:192.168.xx.xx:49392, googWritable:true, googReadable:true, googLocalAddress:192.168.xx.xx:63416, googLocalCandidateType:local, googTransportType:udp, googChannelId:Channel-audio-1, googActiveConnection:true, bytesReceived:271033, googRemoteCandidateType:local, bytesSent:269639, googRtt:399 ... type=VideoBwe googActualEncBitrate:408525, googAvailableSendBandwidth:435792, googRetransmitBitrate:0, googAvailableReceiveBandwidth:442608, googTargetEncBitrate:435792, googBucketDelay:7, googTransmitBitrate:401666, type=googCertificate googFingerprint:67:92:0C:C9:C7:AA:BF:B6:8A:... type=googLibjingleSession googInitiator:true, type=googTrack googTrackId:5178c659-b673-40e7-b388-.... .... type=ssrc googTargetDelayMs:36, packetsLost:0, googDecodeMs:2, googFrameHeightReceived:480, packetsReceived:292, ssrc:1470008958, googRenderDelayMs:10, googMaxDecodeMs:3, googTrackId:9ac40967-7933-4285-b072-86e00f68701e, googFrameWidthReceived:640, transportId:Channel-audio-1, googFrameRateReceived:30, googFrameRateDecoded:0, googNacksSent:0, googFirsSent:0, bytesReceived:237413, googCurrentDelayMs:36, googCaptureStartNtpTimeMs:3625271364920, googMinPlayoutDelayMs:0, googFrameRateOutput:0, googJitterBufferMs:23, googPlisSent:0, type=ssrc googDecodingCTN:613, packetsLost:0, googDecodingPLC:3, packetsReceived:267, googJitterReceived:0, googPreferredJitterBufferMs:20, ssrc:3601597370, ... type=ssrc googFrameHeightInput:480, googFrameWidthInput:640, googCaptureQueueDelayMsPerS:3, packetsLost:0, googRtt:1, googEncodeUsagePercent:38, googCpuLimitedResolution:false, googNacksReceived:0, ssrc:4169404559, googFrameRateInput:0, googPlisReceived:0, googViewLimitedResolution:false, googCaptureJitterMs:23, googAvgEncodeMs:5, ... googFrameHeightSent:480, googEncodeRelStdDev:0, googFrameRateSent:30, googCodecName:VP8, googBandwidthLimitedResolution:false, googAdaptationChanges:0, googFrameWidthSent:640, googFirsReceived:0, packetsSent:292, bytesSent:235786 type=ssrc audioInputLevel:2456, packetsLost:0, googRtt:1, googEchoCancellationReturnLossEnhancement:-100, ...
  • 12. 他のステータスイベント • PeerConnection.onsignalingstatechange – SDPのやり取りの通知 • PeerConnection.oniceconnectionstatechange – ICE Candidateのやり取りの通知 • テスト自動化や、エラー検出、トラブルシュー ティングに上手く使えないか?
  • 13. 正常に通信が確立するまで (通信を始めるOffer側) • SDPのやり取り – PeerConnection.createOffer() • PeerConnection.setLocalDescription(sdp) – PeerConnection.onsignalingstatechange 発生 • PeerConnection.signalingState === 'have-local-offer‘ – PeerConnection. setRemoteDescription(sdp) – PeerConnection.onsignalingstatechange 発生 • PeerConnection.signalingState === 'stable'
  • 14. 正常に通信が確立するまで (通信を始めるOffer側) • ICE Candidate のやり取り – PeerConnection.oniceconnectionstatechange 発生 • PeerConnection.iceConnectionState === 'checking' • PeerConnection.iceGatheringState === 'gathering' – PeerConnection.oniceconnectionstatechange 発生 • PeerConnection.iceConnectionState === 'connected' • PeerConnection.iceGatheringState === 'complete' – PeerConnection.oniceconnectionstatechange 発生 • PeerConnection.iceConnectionState === 'completed' • PeerConnection.iceGatheringState === 'complete' • ここまで来れば通信が確立、ストリーム開始
  • 15. 正常に通信が確立するまで (通信を始めるAnswer側) • SDPのやり取り – PeerConnection. setRemoteDescription(sdp) – PeerConnection.onsignalingstatechange 発生 • PeerConnection.signalingState === 'have-remote-offer' – PeerConnection.createAnswer() • PeerConnection.setLocalDescription(sdp) – PeerConnection.onsignalingstatechange 発生 • PeerConnection.signalingState === 'stable'
  • 16. 行儀よく切断するまでの流れ • PeerConnection.oniceconnectionstatechange 発生 – PeerConnection.iceConnectionState === 'closed' – PeerConnection.iceGatheringState === 'complete' • PeerConnection.onsignalingstatechange 発生 – PeerConnection.signalingState === 'closed' • 適切に通信終了した場合 – どちらのステータスもclosed に
  • 17. 強制的にネットワークを切断した場合 • 切断した側(ネットワークが死んだ側) – イベントが発生 – PeerConnection.oniceconnectionstatechange 発生 • PeerConnection.iceConnectionState === 'disconnected' • PeerConnection.iceGatheringState === 'complete' – これを使えばモバイル環境などでネットワークが切れたこ とを検出できそう • ※残念ながら切断された側(自分はネットワークが 生きている側)では、イベントは発生しなかった
  • 18. Firewallなどの影響で通信が確立できない場合 • SDPのやり取り – PeerConnection.onsignalingstatechange 発生 • PeerConnection.signalingState === 'have-local-offer' – PeerConnection.onsignalingstatechange 発生 • PeerConnection.signalingState === 'stable' • ICE Candidatenのやり取り – PeerConnection.oniceconnectionstatechange 発生 • PeerConnection.iceConnectionState === 'checking' • PeerConnection.iceGatheringState === 'gathering' • 残念ながらcheckingの状態が続いた – 失敗を表す‘failed’ にはならなかった – 一定時間(60秒とか) checkingが続いたらエラー とみなす必要がありそう