1
AndroidとUSBカメラでWebRTC
2018/10/9
インフィニテグラ株式会社 馬場 鉄平
自己紹介
2
モデリングマシン
液体窒素実験
3Dプリンタデータ
サーマルカメラ
RasPi
LED栽培
ウェアラブルなビデオチャットシステム RazVision WR
3
AndroidでUSBカメラを使用するには
4
USBカメラは非対応、外部ライブラリで対応
ついにUSBカメラ標準対応
MediaStreamを生成するまで(1)- 画像の取得
5
WebView
AndCam-ULib
USB Camera
USB
WebResourceResponse
WebViewClient
フレームデータ
特定URLをカメラ画像に割り当て
WebViewClient.shouldInterceptRequest()
(例) http://localhost/camera.jpg
<img>
JPEG
HTML/JavaScript
Java
MediaStreamを生成するまで(2) - Canvasの利用
6
<canvas>に描画
<img src=“http://localhost/camera.jpg”>
で画像を取得
①画像の更新
Canvas.captureStream()
のMediaStream
getUserMedia({audio:true})
のMediaStream
②MediaStreamの生成
ピアに送信する
MediaStream
getVideoTracks()[0]
getAudioTracks()[0]
CanvasRenderingContext2D.drawImage()
応用
7
カメラ画像
背景除去
送信
例)
問題発生:時間が経過すると解像度が落ちる
8
chrome://webrtc-internals
受信された画像の解像度の推移
1280
960
480
640
x-google-start-bitrate,
x-google-min-bitrate,
x-google-max-quantization
なども試したが解決せず
原因:CPU負荷が高いとき解像度を下げる処理がある
9
CPU負荷が高いとき画像エンコードの量を調整する処理を発見
video_stream_encoder.cc, overuse_frame_detector.cc
CPU負荷情報
OveruseFrameDetector
フレーム落ち情報
QualityScaler
エンコード量を調整
1) フレームレートの維持優先
2) 解像度の維持優先
3) バランス型
enum RTCDegradationPreference {
"maintain-framerate",
"maintain-resolution",
"balanced"
};
解決:RTCPeerConnection に googCpuOveruseDetection:false を渡す
10
new RTCPeerConnection(…,
{ optional: [{googCpuOveruseDetection:false}] })
【参考】
Chrome/ChromiumでCPU負荷検出の処理を無効にする
// TODO(ronghuawu): Remove once cpu overuse detection is stable.
const char MediaConstraintsInterface::kCpuOveruseDetection[] =
"googCpuOveruseDetection";
MOVERIO BT-35E対応
11
スマホ
BT-35E
コントローラ
USB Type-C オルタネートモード使用
MOVERIO BT-35E
市販ヘッドセット
(BT-35Eには
含まれない)
一緒にモノづくりしませんか?